AWS Codepipeline с Terraform - Как динамически создавать этапы

Я разработал модуль кодовой линии AWS, используя модуль terraform, у меня есть несколько реальных кодовых линий, использующих модуль codepipeline. Я использую модуль в качестве шаблона проектирования, потому что все кодовые линии выглядят одинаково, за исключением того, что некоторые из них нуждаются в этапах утверждения, а некоторые - нет. Как спроектировать этапы утверждения модуля codepipeline, чтобы фактические codepipelines могли быть созданы на основе различных потребностей?

Я пытался использовать count = 0 или 1 для управления этапом, но он не работает, потому что этап не является уровнем ресурсов. Есть ли хитрый способ или обходной путь?

Я чувствую, что по этой ссылке был задан похожий вопрос, но я не могу понять, каков ответ: Terraform и AWS CodePipeline - динамически определять действия на сцене

Вот мой модуль 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 ответа

Чтобы динамически добавить этап (а не только действие), вы можете сделать следующее:

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

Когда вы просматриваете ваш вариант использования, я чувствую, что он очень подходит с новой функцией terraform в v0.12.x

Ниже приведен пример использования 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

Я полагал, что вы можете заставить это работать в Terraform 0.12+, как сказал BMW, но только если у вас номер блока больше 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"
  }
}
Другие вопросы по тегам