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

Terraform配置AWS S3双动态块(Lambda+SQS)报错求助

Terraform配置S3 Bucket多目标通知(Lambda+SQS)问题解决

问题解答:是否支持单个S3配置两个动态块?

完全支持。aws_s3_bucket_notification资源本身允许同时定义多个lambda_function和queue块,动态块只是Terraform提供的批量生成重复配置块的语法,因此可以在同一个资源中同时使用两个动态块分别配置Lambda和SQS通知。

报错原因与修复

报错根源

当前报错是因为属性名不匹配:在queue动态块的for循环中,你错误引用了i.queue_prefix,但在tfvars的queue数组里,每个元素的前缀字段实际是filter_prefix,Terraform找不到queue_prefix这个属性,因此抛出错误。

修正后的代码

修改manifest中queue动态块的for循环部分,将i.queue_prefix改为i.filter_prefix即可解决该报错。同时,修正for_each的遍历逻辑(原写法会遍历map的key而非value,导致潜在错误):

resource "aws_s3_bucket_notification" "s3_lambda_sqs_trigger" {
  # 修正for_each:遍历map的key-value对,取value的name作为键
  for_each = {for k, v in var.s3_notifications_lambda: v.name => v if var.create_s3_notifications_lambda_sqs}
  bucket   = each.value.name

  dynamic "lambda_function" {
    for_each = [for item in each.value.filters: {
      suffix = item.filter_suffix
      prefix = item.filter_prefix
      events = item.events
    }]

    content {
      lambda_function_arn = "arn:aws:lambda:${var.region}:${var.arn_project}:function:${var.lambda_function_name}-${var.irn}-${var.sia}-${var.env}"
      events              = lambda_function.value.events
      filter_prefix       = lambda_function.value.prefix
      filter_suffix       = lambda_function.value.suffix
    }
  }

  dynamic "queue" {
    # 修正属性名:将i.queue_prefix改为i.filter_prefix
    for_each = [for i in each.value.queue: {
      prefix = i.filter_prefix
      events = i.events
    }]

    content {
      queue_arn           = "arn:aws:sqs:${var.region}:${var.arn_project}:${var.sia}-${var.ecs_service}-${var.env}.fifo"
      events              = queue.value.events
      filter_prefix       = queue.value.prefix
    }
  }    
}

额外说明

  • tfvars中的配置无需修改,保持原结构即可。
  • 修正后的for_each逻辑确保正确遍历bucket配置对象,避免因遍历map key导致的属性访问错误。

内容的提问来源于stack exchange,提问作者Martin Smola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:17:16