terraform - Terraform 拒绝 JSON 模板文件
问题描述
Terraform 在计划期间拒绝了以下 ECS 任务定义。JSON 验证并使用内联 container_definitions 工作正常。
我用谷歌搜索并阅读了一些评论,指出 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
模板文件中引用的 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 格式有点不同。修复此问题后,它将起作用:
- 内存大小和端口号应该是整数,而不是字符串
- Terraform 想要“带有对象的数组”,而不是 JSON“对象”
- 变量 $extra_url 未在 template_file.task-def 中导入
task-def.json的固定版本,在terraform v0.11.13和provider.aws v2.9.0上测试:
[
{
"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}"
}
]
}
]
修复了template_file.task-def的版本:
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}"
}
}
推荐阅读
- javascript - 通过 map() 函数向对象添加新的键/值 - 异步承诺返回待处理的承诺而不是值
- javascript - 大家好,我是nodejs和mongoose的新手。我猜路由似乎有问题。当我单击删除工作网址时,它会自动调用 addwork
- flutter - 为什么我在 Flutter 中收到 HTTPS 错误 BAD_REQUEST
- tensorflow - 从源失败构建 tensorflow 2.4:降低到 LLVM IR 失败
- xamarin - 如何在 Xamarin.Forms.DataGrid 中调用我的 json URL
- javascript - How to change options Google Charts Bar in react?
- swift - 避免在 DispatchQueue 中使用 self
- html - CSS垂直对齐不适用于表格的某些行/列
- typescript - TypeScript 自引用
- excel - 不能匹配包含多个数据值的单元格