Buat beberapa aws_cloudformation_stack berdasarkan nama parametrized dengan Terraform

Aug 15 2020

Apakah mungkin untuk membuat beberapa tumpukan CloutFormation dengan satu aws_cloudformation_stackdefinisi sumber daya di terraform, berdasarkan nama parametrized? Saya memiliki sumber daya berikut yang ditentukan dan saya ingin memiliki tumpukan per app_name, app_env build_namekombo:

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}"
}

Ketika saya menjalankan terraform applyketika build_namenama berubah, tumpukan lama akan dihapus dan yang baru dibuat, namun saya ingin menyimpan tumpukan lama dan membuat yang baru

Jawaban

1 Marcin Aug 16 2020 at 01:32

Salah satu caranya adalah dengan mendefinisikan variabel Anda build_namesebagai daftar. Kemudian, saat Anda membuat build baru, Anda cukup menambahkannya ke daftar, dan membuat tumpukan dengan bantuan for_each untuk mengulang nama build.

Misalnya, jika Anda memiliki yang berikut ini:

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}"  
}

Kemudian jika Anda ingin build kedua untuk tumpukan, Anda cukup memperluas variable "build_name":

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