【问题标题】:AWS Codepipeline with Terraform - How to dynamically create stages带有 Terraform 的 AWS Codepipeline - 如何动态创建阶段
【发布时间】:2019-10-25 09:05:51
【问题描述】:

我使用 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"
    ...
  }
}

【问题讨论】:

    标签: terraform aws-codepipeline terraform0.12+


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

    【讨论】:

    • 这个答案将通过一个直接解决特定问题的示例而不是通用的for_each 示例来改进。
    • 感谢@BMW。我想我应该设置动态 "approval_stage" {for each = var.enable_approval_stage", ...} 并且内容就像 content {name = ..., action {approval's action} 但我仍然不明白如何控制是否创建approval_stage或不创建approval_stage。在这种情况下approval_stage不会被创建?你能给我举个例子吗?谢谢,
    • 这些变量enable_approval_stage可以通过terraform变量动态设置,例如TF_VAR_enable_approval_stage=0 terraform apply所以你可以即时更改这些设置
    • 感谢@BMW,最后我决定不控制审批阶段。 AWS 支持人员表示他们没有命令来启用/禁用 CodePipeline 中的阶段。所以我也不相信 terraform 可以设置它。我相信您的方法适用于其他资源,但不适用于代码管道。不过非常感谢你回答我。
    【解决方案2】:

    我想你可以像 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"
      }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 此技术相关参考文档的链接将加强您的回答。
      • 有没有办法在一个动态块中创建 2 个阶段
      猜你喜欢
      • 1970-01-01
      • 2019-05-23
      • 2020-05-21
      • 2019-04-24
      • 2022-11-02
      • 1970-01-01
      • 2020-11-27
      • 2015-12-15
      • 1970-01-01
      相关资源
      最近更新 更多