Tạo nhiều aws_cloudformation_stack dựa trên tên được tham số hóa với Terraform

Aug 15 2020

Có thể tạo nhiều ngăn xếp CloutFormation với một aws_cloudformation_stackđịnh nghĩa tài nguyên trong biểu mẫu, dựa trên tên được tham số hóa không? Tôi có các nguồn lực sau đây được xác định và tôi muốn có một chồng mỗi app_name, app_env build_namekết hợp:

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

Khi tôi chạy terraform applykhi build_nametên thay đổi, ngăn xếp cũ sẽ bị xóa và một ngăn xếp mới được tạo, tuy nhiên tôi muốn giữ ngăn xếp cũ và tạo một ngăn xếp mới

Trả lời

1 Marcin Aug 16 2020 at 01:32

Một cách là xác định biến của bạn build_namedưới dạng danh sách. Sau đó, khi bạn tạo bản dựng mới, bạn chỉ cần nối chúng vào danh sách và tạo ngăn xếp với sự trợ giúp của for_each để lặp lại tên bản dựng.

Ví dụ: nếu bạn có những điều sau:

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

Sau đó, nếu bạn muốn bản dựng thứ hai cho ngăn xếp, bạn chỉ cần mở rộng variable "build_name":

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