Terraform отклоняет JSON template_file - PullRequest
2 голосов
/ 08 мая 2019

Следующее определение задачи ECS отклоняется Terraform во время плана.JSON проверяет, и с помощью встроенного контейнера_дефекты работает нормально.

Я прогуглил и прочитал некоторые комментарии, в которых говорится, что у 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}"
}

```

1 Ответ

0 голосов
/ 10 мая 2019

Terraform ожидает Json в немного другом формате.После исправления это будет работать:

  1. Размер памяти и номера портов должны быть целыми, а не строковыми
  2. Terraform хочет "массив с объектами", а не "объект" JSON
  3. Переменная $ 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}"
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...