【问题标题】:is there any way to include terraform-aws-provider-resource in container definition JSON Document?有没有办法在容器定义 JSON 文档中包含 terraform-aws-provider-resource?
【发布时间】:2020-05-08 07:58:09
【问题描述】:

概述

我正在使用 terraform 构建 AWS-ECS-Service-container。 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} 语法从 terraform-aws-provider-resource 获取 private_ip

有可能吗?

【问题讨论】:

  • 您需要使用 Terraform 的模板(使用 templatefiletemplate_file 数据源)或通过将容器定义直接粘贴在 .tf 文件中的 HEREDOC 中来插入容器定义。跨度>

标签: json terraform amazon-ecs terraform-provider-aws


【解决方案1】:

您可以使用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 string template,但看起来您的目标是在这种情况下生成一个 JSON 字符串,因此it's better to use the jsonencode function 比使用多个模板指令零碎地构造 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,
      },
    ],
  },
])}

使用单个jsonencode 调用一次生成整个 JSON 字符串的主要优点是保证结果是有效的 JSON 语法,而您无需特别努力单独编码每个部分。 jsonencode 可以接受来自 Terraform 语言的任何类型的值并将其转换为等效的 JSON,因此您可以使用 Terraform expressions 使用传递给 templatefile 的第二个参数的模板变量动态生成部分数据结构,比如上面例子中的kafka_private_ip

【讨论】:

    【解决方案2】:

    或者,您可以创建模板数据文件并传递要在 vars 中使用的变量。

    例如,

    data "template_file" "task-definition-kafka" {
      template = "${file("./task_definition_kafka.json")}"
      vars = {
        kafka_private_ip = "${aws_instance.kafka.private_ip}"
      }
    }
    
    resource "aws_ecs_task_definition" "kafka" {
      container_definitions = "${data.template_file.task-definition-kafka.rendered}"
    }
    

    所以您的 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" : "${kafka_private_ip}:2181" },
        ]
      }
    ]
    

    有关更多信息,您可以查看模板提供者,https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多