Terraform拒绝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

以下ECS任务定义在计划期间被Terraform拒绝。JSON验证并使用内联容器定义工作正常

我在谷歌上搜索并阅读了一些评论,指出TF对JSON对象存在问题,主要与嵌套有关。我可以通过将JSON直接放在任务定义的资源块中的容器定义中来解决这个问题,但我更愿意将它放在模板文件中

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未导入模板文件.task-def中
  • task-def.json的固定版本,在terraform v0.11.13和provider.aws v2.9.0上测试:

    模板_file.task-def的固定版本:


    根据,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}"
      }
    }