首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Terraform的参数化名称创建多个aws_cloudformation_stack

基于Terraform的参数化名称创建多个aws_cloudformation_stack
EN

Stack Overflow用户
提问于 2020-08-16 00:47:54
回答 1查看 323关注 0票数 1

是否可以基于参数化的名称,用一个terraform的CloutFormation资源定义创建多个aws_cloudformation_stack堆栈?我定义了以下资源,我希望每个app_name都有一个堆栈,app_env build_name组合体:

代码语言:javascript
复制
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名称更改时,旧堆栈将被删除并创建一个新堆栈,但是我希望保留旧堆栈并创建一个新堆栈。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-16 01:32:25

一种方法是将变量build_name定义为列表。然后,在创建新构建时,只需将它们附加到列表中,并在每一个的帮助下创建堆栈,以迭代构建名称。

例如,如果您有以下内容:

代码语言:javascript
复制
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"即可。

代码语言:javascript
复制
variable "build_name" {
  default = ["test3", "new_build"]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63432105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档