Terraform中遍历S3对象的for循环报错,寻求修正方法
修正Terraform嵌套for循环创建S3对象的语法错误
你的核心问题是嵌套for循环的语法不符合Terraform的map生成式规则,直接连续写两个for会被解析为无效表达式。以下是两种可行的修正方案:
方案1:使用flatten拍平嵌套列表后转map
先通过两层嵌套生成所有子文件夹与object名称的组合列表,再用flatten将嵌套结构转为一维列表,最后生成供for_each使用的键值对:
locals { object_names = ["at", "in", "the", "we", "it"] subfolder_names = ["folder1", "folder2"] # 需确保该变量已定义 } resource "aws_s3_bucket_object" "subfolders" { depends_on = [module.dds_bucket] for_each = { for name in local.subfolder_names : name => name } bucket = "ea-dds-${var.app_environment}-store" key = "${each.value}/" source = "/dev/null" } resource "aws_s3_bucket_object" "out" { depends_on = [aws_s3_bucket_object.subfolders] for_each = { for item in flatten([ for obj in aws_s3_bucket_object.subfolders : [ for name in local.object_names : { key = "${obj.key}${name}/" bucket = "ea-dds-${var.app_environment}-store" source = "/dev/null" } ] ]) : item.key => item } bucket = each.value.bucket key = each.value.key source = each.value.source }
方案2:使用merge+展开操作符合并嵌套map
通过merge函数配合Terraform的展开操作符...,将每个子文件夹对应的内层循环map合并为一个大map,语法更简洁:
locals { object_names = ["at", "in", "the", "we", "it"] subfolder_names = ["folder1", "folder2"] # 需确保该变量已定义 } resource "aws_s3_bucket_object" "subfolders" { depends_on = [module.dds_bucket] for_each = { for name in local.subfolder_names : name => name } bucket = "ea-dds-${var.app_environment}-store" key = "${each.value}/" source = "/dev/null" } resource "aws_s3_bucket_object" "out" { depends_on = [aws_s3_bucket_object.subfolders] for_each = merge([ for obj_key, obj in aws_s3_bucket_object.subfolders : { for name in local.object_names : "${obj.key}${name}/" => { bucket = "ea-dds-${var.app_environment}-store" key = "${obj.key}${name}/" source = "/dev/null" } } ]...) bucket = each.value.bucket key = each.value.key source = each.value.source }
额外注意
原代码中local.subfolder_names未定义,需补充该变量的取值,否则aws_s3_bucket_object.subfolders的for_each会触发错误。
内容的提问来源于stack exchange,提问作者user11036847
相关产品推荐
相关产品推荐

