2

在另一个线程中,我询问了如何在 AWS中保持ECS 任务定义处于活动状态。因此,我计划像这样更新任务定义:

resource "null_resource" "update_task_definition" {
  triggers {
    keys = "${uuid()}"
  }

  # Workaround to prevent older task definitions being deactivated
  provisioner "local-exec" {
    command = <<EOF
aws ecs register-task-definition \
--family my-task-definition \
--container-definitions ${data.template_file.task_definition.rendered} \
--network-mode bridge \
EOF
  }
}

data.template_file.task_definition是一个模板数据源,它从文件中提供模板化的 JSON。但是,这不起作用,因为 JSON 包含新行和空格。

我已经发现我可以使用replace插值函数来消除新行和空格,但是我仍然需要转义双引号,以便 AWS API 接受请求。

如何安全地准备由 产生的字符串data.template_file.task_definition.rendered?我正在寻找这样的东西:

原始字符串:

{
  "key": "value",
  "another_key": "another_value"
}

准备好的字符串:

{\"key\":\"value\",\"another_key\":\"another_value\"}
4

1 回答 1

3

您应该能够使用jsonencodefunction包装呈现的 JSON 。

使用以下 Terraform 代码:

data "template_file" "example" {
  template = file("example.tpl")

  vars = {
    foo = "foo"
    bar = "bar"
  }
}

resource "null_resource" "update_task_definition" {
  triggers = {
    keys = uuid()
  }

  provisioner "local-exec" {
    command = <<EOF
echo ${jsonencode(data.template_file.example.rendered)}
EOF
  }
}

以及以下模板文件:

{
  "key": "${foo}",
  "another_key": "${bar}"
}

运行 Terraform 应用会提供以下输出:

null_resource.update_task_definition: Creating...
  triggers.%:    "" => "1"
  triggers.keys: "" => "18677676-4e59-8476-fdde-dc19cd7d2f34"
null_resource.update_task_definition: Provisioning with 'local-exec'...
null_resource.update_task_definition (local-exec): Executing: ["/bin/sh" "-c" "echo \"{\\n  \\\"key\\\": \\\"foo\\\",\\n  \\\"another_key\\\": \\\"bar\\\"\\n}\\n\"\n"]
null_resource.update_task_definition (local-exec): {
null_resource.update_task_definition (local-exec):   "key": "foo",
null_resource.update_task_definition (local-exec):   "another_key": "bar"
null_resource.update_task_definition (local-exec): }
于 2018-08-29T18:53:56.757 回答