我使用的是terraform 0.10.7和AWS Terraform提供程序1.7版。
在我的用于创建ECS任务的terraform中,我希望能够使用多个ECS放置约束。通过Terraform文档,我只看到使用单个约束的示例,但似乎所有内容都表明这是可能的。 (例如:https://github.com/terraform-providers/terraform-provider-aws/blob/e77ce9a5fca5b2a3e1138f5df86e87170ac8e89a/aws/resource_aws_ecs_task_definition.go)
我最近的尝试看起来像是:
resource "aws_ecs_task_definition" "task" {
family = "${var.service_name}"
container_definitions = "${var.container_definitions}"
task_role_arn = "${var.task_role_arn}"
placement_constraints {
count = "${var.placement_constraint_count}"
type = "memberOf"
expression = "${element(var.placement_constraints, count.index)}"
}
}
在传入的tfvars中,我声明了各种各样的事情,包括:
var.placement_constraint_count = 1
var.placement_constraints = [ "attribute:adsk.max-container-disk-space-gb not_exists or attribute:adsk.max-container-disk-space-gb == 100"]
(它是一个自定义属性,与手头的问题无关。)
这会导致: *错误:[placement_constraints.0:无效或未知密钥:count]
查看位置约束(https://github.com/terraform-providers/terraform-provider-aws/blob/e77ce9a5fca5b2a3e1138f5df86e87170ac8e89a/aws/resource_aws_ecs_task_definition.go)架构的Go源代码 - 它是一个最多包含10个元素的TypeSet,每个元素都有一个'类型'和表达'。
那么......说出这一切的正确方法是什么?
谢谢,
戴夫
答案 0 :(得分:1)
我刚才在沙盒中运行了Terraform片段以进行检查,如果有点简洁,则给出的错误是正确的:
Error: aws_ecs_task_definition.task: placement_constraints.0: invalid or unknown key: count
现实是placement_constraint
不不支持count
属性。
从count
块中取出placement_constraint
行可以阻止错误的发生。
schema in the code you linked仅指定type
和expression
,而count
没有余地。
定义多个约束需要Terraform模板中placement_constraint
块的多个实例。
出于您的目的,我会沿用以下方式:
placement_constraints = [
"attribute:one == 1",
"attribute:two == 2",
"attribute:three == 3",
]
resource "aws_ecs_task_definition" "task" {
container_definitions = "${var.container_definitions}"
family = "${var.service_name}"
task_role_arn = "${var.task_role_arn}"
placement_constraints {
expression = "${element(var.placement_constraints, 0)}"
type = "memberOf"
}
placement_constraints {
expression = "${element(var.placement_constraints, 1)}"
type = "memberOf"
}
placement_constraints {
expression = "${element(var.placement_constraints, 2)}"
type = "memberOf"
}
}
是的,它重复且丑陋。
否,Terraform尚不是功能完整的v1.0工具。
我的客户和项目总是遇到这样的局限性。
从好的方面来说,upcoming for
and for-each
loops in v0.12应该有助于解决这种情况。
希望有帮助!
我使用terraform version
中的以下命令运行了所有这些操作:
Terraform v0.11.7
+ provider.aws v1.28.0