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
相关产品推荐
相关产品推荐

