带有Terraform的AWS Codepipeline-如何动态创建阶段

时间:2019-06-11 01:23:06

标签: terraform aws-codepipeline terraform0.12+

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

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

3 个答案:

答案 0 :(得分:0)

在查看您的用例时,我觉得它非常适合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

答案 1 :(得分:0)

我认为您可以像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"
  }
}

答案 2 :(得分: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"
     }
   }
 }