我使用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"
...
}
}
答案 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
}
}
让我知道这是否对您有用。
答案 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"
}
}
}