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

