如何在 Terraform 中使用 JSON 编码指定解组类型?
How do I specify unmarshall types with JSON encode in Terraform?
我正在构建 Fargate 集群,但在遵循 aws_ecs_task_definition 部分 (https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_task_definition)
的文档时遇到困难
│ Error: ECS Task Definition container_definitions is invalid: Error decoding JSON: json: cannot unmarshal string into Go struct field ContainerDefinition.Cpu of type int64
│
│ with aws_ecs_task_definition.app,
│ on ecs.tf line 40, in resource "aws_ecs_task_definition" "app":
│ 40: container_definitions = jsonencode([
│ 41: {
│ 42: "name": "${var.prefix}",
│ 43: "image": "${var.app_image}",
│ 44: "cpu": "256",
│ 45: "memory": "${var.fargate_memory}",
│ 46: "networkMode": "awsvpc",
│ 47: "logConfiguration": {
│ 48: "logDriver": "awslogs",
│ 49: "options": {
│ 50: "awslogs-group": "${aws_cloudwatch_log_group.ecs.name}",
│ 51: "awslogs-region": "${var.region}",
│ 52: "awslogs-stream-prefix": "ecs"
│ 53: }
│ 54: },
│ 55: "environment": [
│ 56: {"name": "ENV_RUNNER_SLEEP_SECS", "value": "${var.app_env_runner_sleep_secs}"}
│ 57: ]
│ 58: }
│ 59: ])
错误指向 CPU 的值。这通常是另一个变量,但我只是测试输入以尝试让它通过。非常烦人的是,如果我将值设置为一个数字,我会得到一个不同的错误:cannot unmarshal number into Go struct field KeyValuePair.Environment.Value of type string
.
有什么想法吗?
您对第一个错误的分析是正确的:这是由于 cpu
必须是整数/数字/int64。这意味着您需要将其指定为 "cpu": 256
.
第二个错误告诉您不要查看 ContainerDefinition.Cpu
,而是 KeyValuePair.Environment.Value
,即 "environment": [ ... ]
部分。这里的问题是键和值必须是 string
s,即使你写 "${var.app_env_runner_sleep_secs}"
terraform 仍然输出一个数字,尽管它周围有 "
。要解决这个问题,您需要在参数周围加上 tostring
:"value": "${tostring(var.app_env_runner_sleep_secs)}"
.
请注意,另外,根据您的 terraform 版本,编写起来会更短更清晰,例如"awslogs-region": var.region
通过删除所有地方的 "${...}"
。
我正在构建 Fargate 集群,但在遵循 aws_ecs_task_definition 部分 (https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_task_definition)
的文档时遇到困难│ Error: ECS Task Definition container_definitions is invalid: Error decoding JSON: json: cannot unmarshal string into Go struct field ContainerDefinition.Cpu of type int64
│
│ with aws_ecs_task_definition.app,
│ on ecs.tf line 40, in resource "aws_ecs_task_definition" "app":
│ 40: container_definitions = jsonencode([
│ 41: {
│ 42: "name": "${var.prefix}",
│ 43: "image": "${var.app_image}",
│ 44: "cpu": "256",
│ 45: "memory": "${var.fargate_memory}",
│ 46: "networkMode": "awsvpc",
│ 47: "logConfiguration": {
│ 48: "logDriver": "awslogs",
│ 49: "options": {
│ 50: "awslogs-group": "${aws_cloudwatch_log_group.ecs.name}",
│ 51: "awslogs-region": "${var.region}",
│ 52: "awslogs-stream-prefix": "ecs"
│ 53: }
│ 54: },
│ 55: "environment": [
│ 56: {"name": "ENV_RUNNER_SLEEP_SECS", "value": "${var.app_env_runner_sleep_secs}"}
│ 57: ]
│ 58: }
│ 59: ])
错误指向 CPU 的值。这通常是另一个变量,但我只是测试输入以尝试让它通过。非常烦人的是,如果我将值设置为一个数字,我会得到一个不同的错误:cannot unmarshal number into Go struct field KeyValuePair.Environment.Value of type string
.
有什么想法吗?
您对第一个错误的分析是正确的:这是由于 cpu
必须是整数/数字/int64。这意味着您需要将其指定为 "cpu": 256
.
第二个错误告诉您不要查看 ContainerDefinition.Cpu
,而是 KeyValuePair.Environment.Value
,即 "environment": [ ... ]
部分。这里的问题是键和值必须是 string
s,即使你写 "${var.app_env_runner_sleep_secs}"
terraform 仍然输出一个数字,尽管它周围有 "
。要解决这个问题,您需要在参数周围加上 tostring
:"value": "${tostring(var.app_env_runner_sleep_secs)}"
.
请注意,另外,根据您的 terraform 版本,编写起来会更短更清晰,例如"awslogs-region": var.region
通过删除所有地方的 "${...}"
。