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

使用Terraform配置SQS-Lambda事件过滤器时遇消息无法投递问题

问题

在使用Terraform配置SQS触发Lambda的事件源映射过滤器时遇到以下问题:

Terraform中的触发器配置如下:

resource "aws_lambda_event_source_mapping" "my_sqs_trigger" {
    event_source_arn = <sqs_q_arn>
    function_name = <function_arn>
    filter_criteria {
      filter {
        pattern = jsonencode({
          body  = {
            xyz: "value-for-attr-xyz" 
          }
        })
     }
}

在AWS控制台查看Lambda触发器详情显示为:

[
  {
    "Pattern": "{\"body\":{\"xyz\":[\"value-for-attr-xyz\"]}}"
  }
]

通过以下JS代码发送SQS消息:

sqsClient.send((new SendMessageCommand({
   MessageBody: JSON.stringify({
       xyz: "value-for-attr-xyz"
   }),
   QueueUrl: <sqs-q-url>
}))

问题是队列从未将消息投递到Lambda,已验证Lambda拥有从该队列接收消息的权限,消息在deliveryDelay超时后被删除。


解决方案

问题出在Lambda接收的SQS事件结构上:你发送的消息Body是JSON字符串,但Lambda收到的事件里,body字段是原始字符串,不是解析后的JSON对象。你之前的过滤器直接匹配body.xyz,相当于在字符串上查找xyz属性,自然无法匹配,导致消息不会被投递到Lambda。

修正后的Terraform配置需要使用parse函数解析body字符串,再匹配目标字段:

resource "aws_lambda_event_source_mapping" "my_sqs_trigger" {
    event_source_arn = <sqs_q_arn>
    function_name = <function_arn>
    filter_criteria {
      filter {
        pattern = jsonencode({
          body = {
            parse = "$.xyz = 'value-for-attr-xyz'"
          }
        })
      }
    }
}

或者更完整的写法(效果一致):

resource "aws_lambda_event_source_mapping" "my_sqs_trigger" {
    event_source_arn = <sqs_q_arn>
    function_name = <function_arn>
    filter_criteria {
      filter {
        pattern = jsonencode({
          body = [{
            exists = true
            value = {
              parse = {
                expression = "$.xyz"
                value = "value-for-attr-xyz"
              }
            }
          }]
        })
      }
    }
}

这样配置后,过滤器会先解析body字符串为JSON对象,再检查xyz字段的值是否匹配,符合条件的消息就会被正确投递到Lambda。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:21:05