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