0

terraform을 처음 접했을 때 이런 식으로 작동하지 않을 수도 있습니다. aws_s3_bucket_object를 사용하여 패키지를 양동이에 업로드하려고합니다. 이는 앱 배포의 일부입니다. 임 배포마다 패키지를 변경하려고하며 이전 버전을 유지하려고합니다. terraform이 이전 버전의 객체를 유지하도록 할 수 있습니까?

resource "aws_s3_bucket_object" "object" { 
    bucket = "mybucket-app-versions" 
    key = "version01.zip" 
    source = "version01.zip" 
} 

그러나 미래의 배포에 대해이 작업을 실행 한 후 그때 version02 및 업로드 할 것입니다 version03 등 Terraform 새로운 원 - 예상 된 동작으로 기존의 우편 대체합니다.

하지만 테라 폼이 이전 버전을 파괴하지 못하게 할 방법이 있습니까? 여기에 지원되는 유스 케이스인가요? 아니면 제가 어떻게 테라 폼을 사용하지 않을까요? 테라 폼이 내가 여기서하려고하는 것과 같은 일을하기위한 공식적인 지원을하지 않는다면 나는 이것을 추악한 해킹으로 강요하고 싶지는 않을 것이다.

물론 S3 API를 스크립트를 통해 호출 할 수는 있지만이 앱의 나머지 테라포름 정의로 정의하면 좋을 것입니다.

답변

1

응용 프로그램 배포에 대한 Terraform를 사용하여 권장되는 방법은 배포 단계에서 빌드 단계를 분리 만 후자 Terraform을 사용하는 것입니다.

배포 방법에 따라 별도의 도구를 사용하여 구현되는 빌드 단계의 책임은 일부 아티팩트 (아카이브, 도커 컨테이너, 가상 머신 이미지 등)를 제작하고 게시 어디 선가 그 위치 나 식별자를 Terraform에 전달하여 배포 할 수 있습니다.

이렇게 빌드와 배포를 분리하면 새로운 버전에 문제가있는 경우 이전 아티팩트로 다시 롤백하는 등의 복잡한 상황이 발생할 수 있습니다 (다시 빌드하지 않음).

단순한 시나리오에서는 Input Variables을 사용하여 이슈 위치를 Terraform으로 전달할 수 있습니다. 예를 들어, 빌드 프로세스가 S3에 zip 파일을 작성합니다 상황에서,이 같은 변수를 정의 할 수 있습니다 :

variable "archive_name" { 
} 

이 다음 ${var.archive_name} 보간 구문을 사용하여 그것을 필요로 어떤 리소스에 전달 될 수 있습니다. 특정 이슈를 배포하려면, -var을 사용하여 명령 줄에 이름을 전달합니다

$ terraform apply -var="archive_name=version01.zip" 

일부 조직은 데이터 저장소의 일종 각 응용 프로그램의 "현재"버전의 기록을 유지하는 것을 선호, 같은 HashiCorp Consul, data source을 사용하여 읽으십시오.이 방식을 사용하면 자동화 된 빌드 파이프 라인에서 조율하는 것이 더 쉬울 수 있습니다.이 별도의 데이터 저장소를 사용하여 비정상적인 인수를 Terraform 자체에 전달하지 않고도 빌드 및 배포 단계간에 아카이브 이름을 간접적으로 전달할 수 있습니다.

1

현재 terraform에 aws_s3_bucket_object 하나를 관리하도록 지정하고 terraform이 전체 라이프 사이클을 처리하므로 terraform은 변경 사항이있는 경우 파일을 대체합니다.

당신이 찾고있는 것이 null_resource입니다. 이 파일을 사용하여 local-exec 공급자를 실행하여 필요한 파일을 스크립트로 업로드 할 수 있습니다. 이렇게하면 이전 파일은 삭제되지 않으며 terraform에서 직접 관리하지 않기 때문에 삭제되지 않습니다. 그런 다음 스크립트를 통해 API를 호출하고 있지만 s3에 업로드하는 전체 과정은 여전히 ​​terraform apply 단계에 포함됩니다. 여기

null_resource의 개요 :

resource "null_resource" "upload_to_s3" { 
    depends_on = ["<any resource that should already be created before upload>"] 
    ... 

    triggers = ["<A resource change that must have happened so terraform starts the upload>"] 

    provisioner "local-exec" { 
    command = "<command to upload local package to s3>" 
    } 
} 
관련 문제