Terraform을 사용하여 매개 변수화 된 이름을 기반으로 여러 aws_cloudformation_stack 생성

Aug 15 2020

aws_cloudformation_stack매개 변수화 된 이름을 기반으로 테라 폼에서 하나의 리소스 정의로 여러 CloutFormation 스택을 생성 할 수 있습니까? 다음 리소스가 정의되어 있고 app_name, app_env build_name콤보 당 스택을 갖고 싶습니다 .

resource "aws_s3_bucket_object" "sam_deploy_object" {
  bucket = var.sam_bucket
  key    = "${var.app_env}/${var.build_name}/sam_template_${timestamp()}.yaml" source = "../.aws-sam/sam_template_output.yaml" etag = filemd5("../.aws-sam/sam_template_output.yaml") } resource "aws_cloudformation_stack" "subscriptions_sam_stack" { name = "${var.app_name}---${var.app_env}--${var.build_name}"
  capabilities = ["CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"]
  template_url = "https://${var.sam_bucket}.s3-${data.aws_region.current.name}.amazonaws.com/${aws_s3_bucket_object.sam_deploy_object.id}"
}

이름이 변경 되면 실행 terraform apply하면 build_name이전 스택이 삭제되고 새 스택이 생성되지만 이전 스택을 유지하고 새 스택을 만들고 싶습니다.

답변

1 Marcin Aug 16 2020 at 01:32

한 가지 방법은 변수 build_name를 목록으로 정의하는 것 입니다. 그런 다음 새 빌드를 생성 할 때 목록에 추가하고 for_each 를 사용 하여 스택을 생성 하여 빌드 이름을 반복합니다.

예를 들어 다음이있는 경우 :

variable "app_name" {
  default = "test1"
}

variable "app_env" {
  default = "test2"
}


variable "build_name" {
  default = ["test3"]
}

resource "aws_cloudformation_stack" "subscriptions_sam_stack" {

  for_each     = toset(var.build_name) 
  
  name         = "${var.app_name}---${var.app_env}--${each.value}" capabilities = ["CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"] template_url = "https://${var.sam_bucket}.s3-${data.aws_region.current.name}.amazonaws.com/${aws_s3_bucket_object.sam_deploy_object.id}"  
}

그런 다음 스택에 대한 두 번째 빌드를 원하면 다음을 확장하십시오 variable "build_name".

variable "build_name" {
  default = ["test3", "new_build"]
}