Terraform拒绝JSON模板文件
以下ECS任务定义在计划期间被Terraform拒绝。JSON验证并使用内联容器定义工作正常 我在谷歌上搜索并阅读了一些评论,指出TF对JSON对象存在问题,主要与嵌套有关。我可以通过将JSON直接放在任务定义的资源块中的容器定义中来解决这个问题,但我更愿意将它放在模板文件中Terraform拒绝JSON模板文件,terraform,Terraform,以下ECS任务定义在计划期间被Terraform拒绝。JSON验证并使用内联容器定义工作正常 我在谷歌上搜索并阅读了一些评论,指出TF对JSON对象存在问题,主要与嵌套有关。我可以通过将JSON直接放在任务定义的资源块中的容器定义中来解决这个问题,但我更愿意将它放在模板文件中 Error: Error running plan: 1 error(s) occurred: * module.sonarqube.aws_ecs_task_definition.task: ECS Task Defi
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
模板文件中引用的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}"
}
```
Terraform希望Json采用位定向格式。修复此问题后,它将工作:
根据,portMappings应该是一个对象数组。您已将其设置为对象。值得一试吗?
“内存”:“2048”
这一部分似乎就是错误所指的问题。它的意思是它应该是“memory”:2048
,因此值是一个数字而不是一个字符串。这停止了JSON的解组错误,但是出现了这个新消息<代码>客户端例外:容器名称在任务定义中必须是唯一的。新错误-请回答新问题:)对于附加到原始问题的代码,我无法重现此错误。也许您已经在另一个地方定义了同名的容器,或者手动创建了同名的容器。
[
{
"name": "sonarqube"
},
{
"image": "sonarqube:7.5-community"
},
{
"memory": 2048
},
{
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "tyu",
"awslogs-region": "tyu",
"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}"
}
]
}
]
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}"
extra_url = "${var.extra_url}"
}
}