Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在terraform的容器定义中为ECS任务使用列表变量_Terraform_Terraform Provider Aws - Fatal编程技术网

在terraform的容器定义中为ECS任务使用列表变量

在terraform的容器定义中为ECS任务使用列表变量,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,在terraform中,我试图将一个变量(列表)传递给我们构建的模块。此变量需要在container\u definitions中的aws\u ecs\u task\u定义资源中使用 现在,我只是从一个定义为变量的空默认列表开始: variable "task_enviornment" { type = "list" default = [] } 我的ECS任务定义如下: resource "aws_ecs_task_definition" "ecs_task_defin

在terraform中,我试图将一个变量(列表)传递给我们构建的模块。此变量需要在
container\u definitions
中的
aws\u ecs\u task\u定义
资源中使用

现在,我只是从一个定义为变量的空默认列表开始:

variable "task_enviornment" {
  type        = "list"
  default = []
}
我的ECS任务定义如下:

resource "aws_ecs_task_definition" "ecs_task_definition" {
  family                   = "${var.ecs_family}"
  network_mode             = "awsvpc"
  task_role_arn            = "${aws_iam_role.iam_role.arn}"
  execution_role_arn       = "${data.aws_iam_role.iam_ecs_task_execution_role.arn}"
  requires_compatibilities = ["FARGATE"]
  cpu                      = "${var.fargate_cpu}"
  memory                   = "${var.fargate_memory}"

  container_definitions =<<DEFINITION
  [
    {
      "cpu": ${var.fargate_cpu},
      "image": "${var.app_image}",
      "memory": ${var.fargate_memory},
      "name": "OURNAME",
      "networkMode": "awsvpc",
      "environment": "${jsonencode(var.task_enviornment)}",
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group" : "${aws_cloudwatch_log_group.fargate-logs.name}",
          "awslogs-region": "us-east-1",
          "awslogs-stream-prefix": "demo"
        }
      },
      "portMappings": [
        {
        "containerPort": ${var.app_port},
        "hostPort": ${var.app_port}
        }
      ]
    }
  ]
  DEFINITION
}
我尝试了几种不同的方法来实现这一点

如果我使用
“环境”:“${jsonecode(var.task\u environment)}”,则

I get
ECS任务定义容器\u定义无效:错误解码JSON:JSON:无法将字符串解组到Go struct field ContainerDefinition.Environment[]*ECS.KeyValuePair类型中

如果我做了
“环境”:“${var.task\u environment}”,
“环境”:[“${var.task\u environment}”,

我在第1列第1行得到
:HIL表达式的输出必须是一个字符串,或者在:
然后它只输出
container\u定义的内容

我也尝试过添加默认值,并且收到了类似的错误消息。但是,我确实需要能够处理没有发送的值,所以需要一个空列表

variable "task_enviornment" {
  type        = "list"
  default = [
    {
      "name" = "BUCKET",
      "value" = "test"
    }
  ]
}

经过大量调查和重新审视,我们找到了解决办法。我不确定为什么会修复它,我觉得这可能是一个bug。
需要做两件事来解决这个问题

  • 从变量定义中删除
    type=“list”

    变量“任务\环境”{
    默认值=[]
    }

  • 使用变量时删除引号:
    “环境”:${jsonecode(var.task\u环境)},


  • 经过大量调查和重新审视,我们找到了解决办法。我不确定为什么会修复它,我觉得这可能是一个bug。
    需要做两件事来解决这个问题

  • 从变量定义中删除
    type=“list”

    变量“任务\环境”{
    默认值=[]
    }

  • 使用变量时删除引号:
    “环境”:${jsonecode(var.task\u环境)},


  • 下面的解决方案应该有效

    在variable.tf中

    variable "app_environments_vars" {
    type        = list(map(string))
    default     = []
    description = "environment varibale needed by the application"
    default = [
    {
      "name" = "BUCKET",
      "value" = "test"
    },{
      "name" = "BUCKET1",
      "value" = "test1"
    }]
    
    在任务定义中,您可以使用
    ${jsonecode(var.app_environments_vars)}
    类似于

    container_definitions =<<DEFINITION
      [
        {
          "cpu": ${var.fargate_cpu},
          "image": "${var.app_image}",
          "memory": ${var.fargate_memory},
          "name": "OURNAME",
          "networkMode": "awsvpc",
          "environment": ${jsonencode(var.envoy_environments_vars)},
          "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
              "awslogs-group" : "${aws_cloudwatch_log_group.fargate-logs.name}",
              "awslogs-region": "us-east-1",
              "awslogs-stream-prefix": "demo"
            }
          },
          "portMappings": [
            {
            "containerPort": ${var.app_port},
            "hostPort": ${var.app_port}
            }
          ]
        }
      ]
    

    container\u definitions=下面的解决方案应该有效

    在variable.tf中

    variable "app_environments_vars" {
    type        = list(map(string))
    default     = []
    description = "environment varibale needed by the application"
    default = [
    {
      "name" = "BUCKET",
      "value" = "test"
    },{
      "name" = "BUCKET1",
      "value" = "test1"
    }]
    
    在任务定义中,您可以使用
    ${jsonecode(var.app_environments_vars)}
    类似于

    container_definitions =<<DEFINITION
      [
        {
          "cpu": ${var.fargate_cpu},
          "image": "${var.app_image}",
          "memory": ${var.fargate_memory},
          "name": "OURNAME",
          "networkMode": "awsvpc",
          "environment": ${jsonencode(var.envoy_environments_vars)},
          "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
              "awslogs-group" : "${aws_cloudwatch_log_group.fargate-logs.name}",
              "awslogs-region": "us-east-1",
              "awslogs-stream-prefix": "demo"
            }
          },
          "portMappings": [
            {
            "containerPort": ${var.app_port},
            "hostPort": ${var.app_port}
            }
          ]
        }
      ]
    

    container\u definitions=可能与
    type=“list”
    之后缺少逗号有关?可能与
    type=“list”
    之后缺少逗号有关?环境中还有一个输入错误。环境中也有一个输入错误。