【问题标题】:How do I specify unmarshall types with JSON encode in Terraform?如何在 Terraform 中使用 JSON 编码指定解组类型?
【发布时间】:2021-09-11 02:13:20
【问题描述】:

我正在构建一个 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 是正确的。

标签: json amazon-web-services terraform amazon-ecs unmarshalling


【解决方案1】:

您对第一个错误的分析是正确的:这是由于cpu 必须是整数/数字/int64。这意味着您需要将其指定为"cpu": 256

然后第二个错误告诉您不要查看ContainerDefinition.Cpu,而是查看KeyValuePair.Environment.Value,即"environment": [ ... ] 部分。这里的问题是键和值必须是strings,即使你写了"${var.app_env_runner_sleep_secs}" terraform 仍然输出一个数字,尽管它周围有"。要解决这个问题,您需要在参数周围加上 tostring"value": "${tostring(var.app_env_runner_sleep_secs)}"

请注意,另外,根据您的 terraform 版本,它会更短且更简洁,例如"awslogs-region": var.region 删除所有位置的"${...}"

【讨论】:

  • 谢谢! cpu 仍然需要是一个数字,所以我将变量(以字符串形式出现)包装在 tonumber 函数中。我对 tf 很陌生,所以 Go 错误有点出人意料。
  • @Rhinosaurus 完全相关,得到直接的 golang 错误而不是任何更容易理解的东西肯定是出乎意料的,总感觉有些东西完全坏了:D
猜你喜欢
  • 2015-07-27
  • 2018-05-02
  • 2015-12-09
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
相关资源
最近更新 更多