Terraform & AWS CodePipeline - динамическое определение действий на сцене

Я не уверен, возможно ли это, но подумал, что я бы сначала попросил проверить.

у меня есть CodePipeline определяется в terraformс одним Stage это имеет несколько действий.

Stage вытаскивает код из CodeCommitи каждое действие определяет, какие репозитории я хочу использовать в Pipeline,

Я хотел бы создать переменную, которая имеет список CodeCommit имена репозиториев, а затем динамически создавать действие для каждого репозитория в этом списке.

Это возможно с terraform? Я знаю, что вы можете использовать count чтобы добиться этого нормально, но я думаю, что это только на уровне ресурсов?

Фрагмент кода ниже:

resource "aws_codepipeline" "Test" {
  name     = "Test"
  role_arn = "${aws_iam_role.Test.arn}"

  "artifact_store" {
    location = "${aws_s3_bucket.Test.bucket}"
    type     = "S3"
  }

  "stage" {
    name = "Source"

    ####LOOP OVER EACH ITEM IN LIST###
    "action" {
        ...
    }
  }

  stage {
    name = "Build"

    ...

    }
  }
}

Спасибо за помощь.

РЕДАКТИРОВАТЬ:

Получение ошибки с этим в качестве триггера для нулевого ресурса в данный момент. Я пробовал несколько разных вариантов этого:

resource "null_resource" "CodePipeline" {
  count = "${length(var.repositories)}"

  triggers {
    action = {
      category         = "Source"
      name             = "Repository-${element(keys(var.repositories), count.index)}"
      owner            = "AWS"
      provider         = "CodeCommit"
      version          = "1"
      output_artifacts = ["Repository-${element(keys(var.repositories), count.index)}"]

      configuration {
        RepositoryName = "${element(keys(var.repositories), count.index)}"
        BranchName     = "${lookup(var.repositories, element(keys(var.repositories) ,count.index))}"
      }
    }
  }
}

2 ответа

Мой последний успех с Dynamic Stage в Codepipeline заключался в использовании переменной карты и создании всего конвейера как динамического ресурса.

Вот пример ресурса:

      resource "aws_codepipeline" "codepipeline" {
  for_each = var.code_pipeline
  name     = "${local.name_prefix}-${var.AppName}"
  role_arn = each.value["code_pipeline_role_arn"]

  tags = {
    Pipeline_Key = each.key
  }

  artifact_store {
    type     = lookup(each.value, "artifact_store", null) == null ? "" : lookup(each.value.artifact_store, "type", "S3")
    location = lookup(each.value, "artifact_store", null) == null ? null : lookup(each.value.artifact_store, "artifact_bucket", null)
  }

  dynamic "stage" {
    for_each = lookup(each.value, "stages", {})
    iterator = stage
    content {
      name = lookup(stage.value, "name")
      dynamic "action" {
        for_each = lookup(stage.value, "actions", {}) //[stage.key]
        iterator = action
        content {
          name             = action.value["name"]
          category         = action.value["category"]
          owner            = action.value["owner"]
          provider         = action.value["provider"]
          version          = action.value["version"]
          run_order        = action.value["run_order"]
          input_artifacts  = lookup(action.value, "input_artifacts", null)
          output_artifacts = lookup(action.value, "output_artifacts", null)
          configuration    = action.value["configuration"]
          namespace        = lookup(action.value, "namespace", null)
        }
      }
    }
  }
}

Вы можете увидеть полный рабочий образец здесь

Вы можете видеть, что этапы являются динамическими и действиями, необходимыми для создания конвейера. Кроме того, это учитывает EnvironmentVariables и позволяет им быть динамическими.

Для этого вы можете использовать null_resources и передать список действий на этапе. как это

resource "null_resource" "actions" {
    count = length(<repo_list_var>)
    triggers {
       #### ACTION ITEMS ###
       ...........
    }
}

resource "aws_codepipeline" "Test" {
    name     = "Test"
    role_arn = "${aws_iam_role.Test.arn}"

    "artifact_store" {
        location = "${aws_s3_bucket.Test.bucket}"
        type     = "S3"
    }

    "stage" {
       name = "Source"
       action = null_resource.actions.*.triggers
    }

    stage {
        name = "Build"

        ...

    }
}
Другие вопросы по тегам