【发布时间】:2019-09-26 13:54:52
【问题描述】:
Terraform 在计划期间拒绝了以下 ECS 任务定义。 JSON 验证并使用内联 container_definitions 工作正常。
我在 Google 上搜索并阅读了一些评论,指出 TF 在 JSON 对象方面存在问题,主要与嵌套有关。我可以通过将 JSON 直接放入任务定义的资源块中的 container_definition 来解决此问题,但我更愿意将其粘贴在模板文件中。
Error: Error running plan: 1 error(s) occurred:
* module.sonarqube.aws_ecs_task_definition.task: ECS Task Definition container_definitions is invalid: Error decoding JSON: json: cannot unmarshal string into Go struct field ContainerDefinition.Memory of type int64
template_file 中引用的 JSON 文档:
{
"name": "sonarqube",
"image": "sonarqube:7.5-community",
"memory": "2048",
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "${log-group}",
"awslogs-region": "${region}",
"awslogs-stream-prefix": "ecs"
}
},
"portMappings": {
"hostPort": "9000",
"protocol": "tcp",
"containerPort": "9000"
},
"environment": [
{
"name": "sonar.jdbc.password",
"value": "${password}"
},
{
"name": "sonar.jdbc.url",
"value": "${url}/${extra_url}"
},
{
"name": "sonar.jdbc.username",
"value": "${username}"
}
]
}
相关的 TF 块:
data "template_file" "task-def" {
template = "${file("${path.module}/task-def.json")}"
vars = {
log-group = "/ecs/${var.cluster_name}-${var.name}"
region = "${var.region}"
url = "jdbc:postgresql://${var.rds_url}${var.extra_url}"
username = "${var.username}"
password = "${var.password}"
}
}
resource "aws_ecs_task_definition" "task" {
family = "${var.name}"
network_mode = "bridge"
cpu = "1024"
memory = "2048"
execution_role_arn = "${var.ecs-exec-role}"
container_definitions = "${data.template_file.task-def.rendered}"
}
```
【问题讨论】:
-
"portMappings" 应该是一个对象数组,根据documentation。您已将其设置为对象。值得一试吗?
-
"memory": "2048"这部分似乎是错误所指的问题。意思是应该改为"memory": 2048,所以值是数字而不是字符串。
标签: terraform