在terraform的容器定义中为ECS任务使用列表变量
在terraform中,我试图将一个变量(列表)传递给我们构建的模块。此变量需要在在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
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 getECS任务定义容器\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”
之后缺少逗号有关?环境中还有一个输入错误。环境中也有一个输入错误。