Terraformでパラメーター化された名前に基づいて複数のaws_cloudformation_stackを作成します
Aug 15 2020
aws_cloudformation_stack
パラメータ化された名前に基づいて、テラフォームの1つのリソース定義で複数の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
1つの方法は、変数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}"
}
次に、スタックの2番目のビルドが必要な場合は、拡張するだけですvariable "build_name"
。
variable "build_name" {
default = ["test3", "new_build"]
}