2

我已将批处理作业指定为:

resource "aws_batch_job_definition" "batch_job" {
  name = "${var.name}"
  type = "container"

  container_properties = <<CONTAINER_PROPERTIES
{
    "command": ["${var.command_first}", "${var.command_second}"],
    "image": "${var.image_repo}:${var.image_tag}",
    "memory": ${var.memory},
    "vcpus": 1,
    "jobRoleArn": "${var.job_role_arn}",
    "environment": "${var.environment}"

}
CONTAINER_PROPERTIES
}

其中 var.environment 来自输入变量

variable "environment" {
}

在我的 terraform 值文件中,我有

environment = {
[
      {"name" : "AWS_DEFAULT_REGION",  "value" : "region-val"}
  ]
}

但它不喜欢这种格式。

如果我这样指定批处理作业:

resource "aws_batch_job_definition" "batch_job" {
  name = "${var.name}"
  type = "container"

  container_properties = <<CONTAINER_PROPERTIES
{
    "command": ["${var.command_first}", "${var.command_second}"],
    "image": "${var.image_repo}:${var.image_tag}",
    "memory": ${var.memory},
    "vcpus": 1,
    "jobRoleArn": "${var.job_role_arn}",
    "environment":  [
      {"name" : "AWS_DEFAULT_REGION",  "value" : "region-val"}
  ]

}
CONTAINER_PROPERTIES
}

它有效,所以问题是当我将它移动到变量文件时它不起作用。

格式应该是什么以及如何在批处理作业定义中使用它?

谢谢!

4

1 回答 1

2

在 terraform 资源 aws_batch_job_definition 中,参数 container_properties 应该是一个 json 文档,而environment是其中的一个键。因此,如果您想将 env 变量列表传递给它,那么您应该对具有值的列表变量进行 jsonify,然后它才能识别正确的 json 数据,否则它总是会抛出异常。

Terraform 有内置函数 jsonencode() 可用于 jsonify 列表、地图等。

参考:https ://www.terraform.io/docs/configuration/functions/jsonencode.html

为了使用您的 terraform 代码,我对其进行了一些修改,您将了解如何从这里获取它,

variable environmentvar {
  type = list
  default = [
    {"name":"AWS_DEFAULT_REGION", "value": "region-val"},
  ]
}

resource "aws_batch_job_definition" "batch_job" {
  name = "${var.name}"
  type = "container"

  container_properties = <<CONTAINER_PROPERTIES
{
    "command": ["${var.command_first}", "${var.command_second}"],
    "image": "${var.image_repo}:${var.image_tag}",
    "memory": ${var.memory},
    "vcpus": 1,
    "jobRoleArn": "${var.job_role_arn}",
    "environment": ${jsonencode(var.environmentvar)}
}
CONTAINER_PROPERTIES
}

environmentvar必须是环境变量列表,而后者又是字典。所以你必须用你需要的列表来定义它

${jsonencode(var.environmentvar)} jsonify env var 列表并生成需要传递给容器属性的environment key 的数据。

于 2019-09-03T11:14:39.907 回答