首页 > 解决方案 > 将 ECS containerDefinition 命令移动到本地 - Terraform

问题描述

我正在与 Terraform 一起使用一些容器部署 ECS 服务。代码太长了,所以我试图将所有逻辑移至 locals.tf。

现在,我在容器定义中的代码是这样的:

module "prometheus" {
  source = "../aws-modules/ecs-service"

  [... more code ...]

  volumes               = local.prometheus_volumes
  cpu                   = var.prometheus_cpu
  memory                = var.prometheus_memory
  container_definitions = <<DEFINITION
[
  {
    "image": "${var.prometheus_container_image}",
    "name": "${lower(local.prometheus_name)}",
    "networkMode": "${var.prometheus_network_mode}",
    "portMappings": [
      {
        "containerPort": ${var.prometheus_container_port},
        "hostPort": ${var.prometheus_container_port},
        "protocol": "tcp"
      }
    ],
    "command": [
      "/bin/prometheus",
      "--config.file=/etc/prometheus/prometheus.yml",
      "--web.enable-lifecycle",
      "--storage.tsdb.path=/prom_data"
    ],
    [... more code ...]
  }
]
DEFINITION

这按预期工作,但我试图让它像这样:

module "prometheus" {
  source = "../aws-modules/ecs-service"

  [... more code ...]

  volumes               = local.prometheus_volumes
  cpu                   = var.prometheus_cpu
  memory                = var.prometheus_memory
  container_definitions = <<DEFINITION
[
  {
    "image": "${var.prometheus_container_image}",
    "name": "${lower(local.prometheus_name)}",
    "networkMode": "${var.prometheus_network_mode}",
    "portMappings": [
      {
        "containerPort": ${var.prometheus_container_port},
        "hostPort": ${var.prometheus_container_port},
        "protocol": "tcp"
      }
    ],
    "command": "${local.prometheus_container_command}",
     [... more code ...]
  }
]
DEFINITION

并在 locals.tf 上声明:

prometheus_container_command = <<DEFINITION
    [
          "/bin/prometheus",
          "--config.file=/etc/prometheus/prometheus.yml",
          "--web.enable-lifecycle",
          "--storage.tsdb.path=/prom_data"
     ]
DEFINITION

我在 containerDefinitions 上做过类似的事情,但从来没有使用数组,所以我遇到了这个错误(如果我删除换行符,那么错误从“/bin/prometheus”指向“/”)

错误

!错误:ECS 任务定义 container_definition 无效:解码 JSON 时出错:../aws-modules/ecs-service/main.tf 第 147 行、资源“aws_ecs_task_definition”、“ecs_task_definition”中的字符串文字中的无效字符“\n”:147 : container_definitions = var.container_definitions

如果我删除“[”:

!错误:ECS 任务定义 container_definition 无效:解码 JSON 时出错:../aws-modules/ecs-service/main.tf 第 147 行,资源“aws_ecs_task_definition”“ecs_task_definition”中的数组元素后的无效字符“t”:147: container_definitions = var.container_definitions

而且我不知道我还能尝试什么(我尝试删除“[”,没有“定义”等......)

你们中的一些人尝试过声明一个数组并在 ECS containerDefinition 上使用它?非常感谢。

标签: amazon-web-servicesterraformamazon-ecsterraform-provider-aws

解决方案


您在

"command": "${local.prometheus_container_command}"

将导致command存在:

"command": "["cpmd1","cmd2", "cmd3"]"

请试试 :

 "command": ${local.prometheus_container_command}

或者

 "command": ${jsonencode(local.prometheus_container_command})

推荐阅读