AWS Terraform代码管道-如何动态创建阶段

AWS Terraform代码管道-如何动态创建阶段,terraform,aws-codepipeline,terraform0.12+,Terraform,Aws Codepipeline,Terraform0.12+,我使用terraform模块设计了一个AWS代码管道模块,我使用代码管道模块设计了多个实际的代码管道。我使用模块作为设计模式,因为所有的代码管道看起来都很相似,只是有些代码管道需要批准阶段,有些不需要。如何设计codepipeline模块批准阶段,以便根据不同的需要创建实际的codepipeline 我尝试使用count=0或1来控制该阶段,但它不起作用,因为该阶段不是资源级别。有什么棘手的方法或解决办法吗 我觉得这个链接问了类似的问题,但我不知道答案是什么: 这是我的代码管道地形模块: re

我使用terraform模块设计了一个AWS代码管道模块,我使用代码管道模块设计了多个实际的代码管道。我使用模块作为设计模式,因为所有的代码管道看起来都很相似,只是有些代码管道需要批准阶段,有些不需要。如何设计codepipeline模块批准阶段,以便根据不同的需要创建实际的codepipeline

我尝试使用count=0或1来控制该阶段,但它不起作用,因为该阶段不是资源级别。有什么棘手的方法或解决办法吗

我觉得这个链接问了类似的问题,但我不知道答案是什么:

这是我的代码管道地形模块:

resource "aws_codepipeline" "dev" {
  name     = "my_codepipeline"
  role_arn = ...
  ...
  stage {
    name = "Source"
    ...
  }
  stage {
    name = "test"
    ...
  }
  stage {
    # count = 0 # or 1. it does not work
    name = "Approval"
    action {
      name     = "Approval"
      owner    = "AWS"
      category = "Approval"
      provider = "Manual"
      version  = "1"

      configuration {
        NotificationArn    = "..."
        CustomData         = "..."
        ExternalEntityLink = "..."
      }
    }
  }
  stage {
    name = "prod"
    ...
  }
}

当浏览您的用例时,我感觉它非常适合v0.12.x中的新terraform特性

下面是一个关于如何使用
为每个
设置动态目标区域的示例,您可以对阶段执行相同的操作

  dynamic "target_region" {
    for_each = var.target_image_regions
    content {
      name                   = target_region.value
      regional_replica_count = 1
    }
  }
让我知道这对你是否有效


参考资料:

我想你可以像宝马说的那样在地形0.12+下工作,但前提是你的块数大于0

At least 1 "action" blocks are required.
不幸的是,我的(和您的)用例需要根据环境执行0/1操作,因此我们必须在一段时间内手动管理它

干杯

dynamic "action" {
  for_each = local.production_approval # e.g. [] || [true]  
  content {
    category         = "Approval"
    configuration    = {}
    input_artifacts  = []
    name             = "Production-Approval"
    output_artifacts = []
    owner            = "AWS"
    provider         = "Manual"
    run_order        = 1
    version          = "1"
  }
}

要动态添加阶段(而不仅仅是操作),可以执行以下操作:

dynamic "stage" {
   for_each = var.production_approval ? [1] : []
   content {
     name = "Approve"
     action {
       configuration = {
         NotificationArn = var.approve_sns_arn
         CustomData      = var.approve_comment
       }
       name     = "Production-Approval"
       category = "Approval"
       owner    = "AWS"
       provider = "Manual"
       version  = "1"
     }
   }
 }

这个答案可以通过一个直接解决具体问题的例子来改进,而不是每个例子的通用
。谢谢@BMW。我想我应该为each=var.enable\u approval\u stage设置动态“approval\u stage”{for each=var.enable\u approval\u stage“,…},内容类似于内容{name=…,action{approval's action}但是我仍然不知道如何控制是否创建审批阶段。在这种情况下,将不会创建审批阶段?您能给我一个例子吗?谢谢,这些变量
启用审批阶段
可以通过terraform变量动态设置,例如
TF\u VAR\u启用审批阶段=0 terraform apply
所以你可以在FlyThreak@BMW上更改这些设置,最后我决定不控制批准阶段。AWS支持人员说他们没有命令来启用/禁用代码管道中的阶段。所以我也不相信terraform可以设置。我相信你的方法适用于其他资源,但不适用于代码管道。但是非常感谢你谢谢你回答我。链接到相关的参考文件,这项技术将加强你的答案。有没有办法在一个动态块中创建两个阶段