【问题标题】:Create multiple aws_cloudformation_stack based on parametrized name with Terraform使用 Terraform 根据参数化名称创建多个 aws_cloudformation_stack
【发布时间】:2020-08-16 09:32:25
【问题描述】:

是否可以根据参数化名称在 terraform 中使用一个 aws_cloudformation_stack 资源定义创建多个 CloutFormation 堆栈? 我定义了以下资源,我希望每个 app_nameapp_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}"
}

当我在 build_name 名称更改时运行 terraform apply 时,旧堆栈被删除并创建一个新堆栈,但是我想保留旧堆栈并创建一个新堆栈

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案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}"  
    }
    

    如果你想为堆栈进行第二次构建,你只需扩展 variable "build_name":

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

    【讨论】:

    • 谢谢!这可以工作。我的构建名称是散列的 git 分支名称,因此它们非常动态。我可以在任何 terraform apply 调用之前将当前分支名称写入文件(以记录已部署的分支),并将该文件内容输入变量 .或者您认为有更好的方法吗?
    • @HIT_girl 可能有更好的方法,涉及一些 CI/CD 管道,但目前我不知道该怎么做。如果需要,您可以专门针对此问题提出一个新问题,并提供相关的详细信息、示例和说明。
    猜你喜欢
    • 2017-07-17
    • 2019-09-08
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    相关资源
    最近更新 更多