2

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

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

我觉得这个链接问了类似的问题,但我不知道答案是什么: Terraform & AWS CodePipeline - Dynamically define actions on a stage

这是我的代码管道 terraform 模块:

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

3 回答 3

1

在浏览您的用例时,我觉得它非常适合 v0.12.x 中的新 terraform 功能

下面是一个关于如何使用for_each设置动态目标区域的示例,你应该对阶段做同样的事情。

  dynamic "target_region" {
    for_each = var.target_image_regions
    content {
      name                   = target_region.value
      regional_replica_count = 1
    }
  }

让我知道这是否适合您。

参考:https ://www.hashicorp.com/blog/announcing-terraform-0-12

于 2019-06-11T02:16:10.030 回答
1

我想你可以像 BMW 所说的那样在 Terraform 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"
  }
}
于 2019-07-31T13:19:32.353 回答
0

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

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"
     }
   }
 }
于 2021-06-01T14:10:55.710 回答