You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:22:48