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