[英]Terraform create multiple resources using for_each and jsondecode
[英]jsondecode fails when using for_each to pass variables to module
我正在尝试将 for_each 与创建数据狗综合测试的 terraform 模块一起使用。 列出 s3 存储桶中的对象名称并作为 for_each 的集合传递。 模块使用调用模块传入的 each.value 作为键读取每个文件的内容。 我在测试期间对模块中的 s3 对象键值进行了硬编码,它正在工作。 当我尝试从 main.tf 调用模块时,从集合中动态传递键名它失败并出现以下错误。
│ Error: Error in function call
│
│ on modules\Synthetics\trial2.tf line 7, in locals:
│ 7: servicedef = jsondecode(data.aws_s3_object.tdjson.body)
│ ├────────────────
│ │ data.aws_s3_object.tdjson.body is ""
│
│ Call to function "jsondecode" failed: EOF.
主文件
data "aws_s3_objects" "serviceList" {
bucket = "bucketname"
}
module "API_test" {
for_each = toset(data.aws_s3_objects.serviceList.keys)
source = "./modules/Synthetics"
S3key = each.value
}
模块
data "aws_s3_object" "tdjson" {
bucket = "bucketname"
key = var.S3key
}
locals {
servicedef = jsondecode(data.aws_s3_object.tdjson.body)
Keys = [for k,v in local.servicedef.Endpoints: k]
}
关于这里有什么问题的任何线索?
谢谢
查看有关aws_s3_object 数据源的注释:
对象的内容(
body
字段)仅适用于具有人类可读Content-Type
(text/*
和application/json
)的对象。 这是为了防止打印不安全的字符并可能下载大量数据,这些数据将被丢弃以支持元数据。
由于它成功获取了数据源(没有抛出错误),但正文为空,这很可能是您的问题。 确保您的 S3 对象将Content-Type
元数据设置为application/json
。 这是有关如何通过 CLI 执行此操作的 Stack Overflow 问题/答案; 您也可以通过 AWS 控制台、API 或 Terraform(如果您通过 Terraform 创建对象)来执行此操作。
编辑:我发现了另一个问题。 查看将for_each
与toset
一起使用的语法:
resource "aws_iam_user" "the-accounts" {
for_each = toset( ["Todd", "James", "Alice", "Dottie"] )
name = each.key
}
重要的是您应该使用each.key
而不是each.value
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.