Есть ли способ включить terraform- aws -provider-resource в определение контейнера JSON Document? - PullRequest
0 голосов
/ 22 января 2020

Обзор

Я строю AWS -ECS-Service-container с использованием terraform. terraform aws_ecs_task_definition

пример task_definition_kafka.tf

resource "aws_ecs_task_definition" "task_definition_kafka" {
  container_definitions    = file("./task_definition_kafka.json")
}

пример task_definition_kafka. json

[
  {    

    "cpu": 256,
    "memory": 768,
    "portMappings": [
      { 
        "hostPort": 7002,
        "containerPort": 7002,
        "protocol": "tcp"
      }
    ],
    "essential": true,
    "environment" : [   
      { "name" : "SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL", "value" : "${aws_ecs_task_definition.aws_ecs_task_definition_kafka.private_ip}:2181" },
    ]
  }
]

Основной вопрос

В приведенном выше файле json я хочу использовать $ {aws_ecs_task_definition.aws_ecs_task_definiton_kafka.private_ip} синтаксис для получения private_ip из terraform- aws - провайдер-ресурс

Возможно ли это?

1 Ответ

2 голосов
/ 24 января 2020

Вы можете использовать templatefile, чтобы попросить Terraform прочитать файл и интерпретировать его как шаблон Terraform:

resource "aws_ecs_task_definition" "task_definition_kafka" {
  container_definitions = templatefile("${path.module}/task_definition_kafka.json", {
    kafka_private_ip = aws_ecs_task_definition.aws_ecs_task_definition_kafka.private_ip
  })
}

Хотя внешний файл интерпретируется как обычный шаблон строки Terraform , похоже, что ваша цель - в этом случае создать строку JSON, поэтому лучше использовать функцию jsonencode , чем создавать фрагмент данных JSON с использованием нескольких шаблонных директив. Вот как написать task_definition_kafka.json, следуя этому совету:

${jsonencode([
  {
    cpu: 256,
    memory: 768,
    portMappings: [
      {
        hostPort: 7002,
        containerPort: 7002,
        protocol: "tcp",
      },
    ],
    essential: true,
    environment: [
      {
        name: "SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL",
        value: kafka_private_ip,
      },
    ],
  },
])}

Основным преимуществом генерации всей строки JSON за один вызов jsonencode является то, что результат гарантированно будет действительным JSON синтаксис без необходимости особых усилий для кодирования каждой части в отдельности. jsonencode может принимать значение любого типа из языка Terraform и преобразовывать его в эквивалент JSON, поэтому вы можете использовать выражения Terraform для динамического генерирования частей структуры данных с использованием переменных шаблона, передаваемых в Второй аргумент templatefile, как kafka_private_ip в приведенном выше примере.

...