Terraform AWS Provider:ECS任务放置限制数组?

时间:2018-02-21 08:36:51

标签: amazon-web-services terraform amazon-ecs

我使用的是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,每个元素都有一个'类型'和表达'。

那么......说出这一切的正确方法是什么?

谢谢,

戴夫

1 个答案:

答案 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仅指定typeexpression,而count没有余地。

定义多个约束需要Terraform模板中placement_constraint块的多个实例。

替代建议

出于您的目的,我会沿用以下方式:

terraform.tfvars

placement_constraints = [
  "attribute:one == 1",
  "attribute:two == 2",
  "attribute:three == 3",
]

ecs_task.tf

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