【问题标题】:Terraform variable list of key value pairs for environment variables of batch job批处理作业环境变量的键值对的 Terraform 变量列表
【发布时间】:2020-01-03 20:34:14
【问题描述】:

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

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
}

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

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

谢谢!

【问题讨论】:

    标签: amazon-web-services terraform terragrunt


    【解决方案1】:

    在 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)} 将env var列表json化,生成需要传递给容器属性environment键的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-10
      • 2017-11-03
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      相关资源
      最近更新 更多