AWS SAM中Lambda配置的SQS死信队列未接收消息求助
Lambda失败未触发SQS死信队列的问题解决
问题根源
Lambda的死信队列(DLQ)配置只对异步调用场景生效,而你当前是通过API Gateway触发Lambda,这属于同步调用模式。同步调用时,Lambda执行失败会直接把错误返回给调用方(也就是API Gateway),不会把失败事件转发到DLQ。
两种解决办法
办法1:改成异步触发Lambda
如果业务逻辑允许,把触发方式换成异步调用(比如用SNS、EventBridge,或者直接调用Lambda的异步API),这样Lambda失败后就会自动把事件推去DLQ。
办法2:在Lambda里手动发消息到SQS
要是必须保留API Gateway同步触发,就在Lambda代码里捕获异常,自己把失败信息发到SQS:
- 先给Lambda的IAM角色加SQS发消息的权限,在SAM模板的
HelloWorldFunction里添加Policies配置:
Properties: # 其他原有配置不变 Policies: - SQSSendMessagePolicy: QueueName: !GetAtt MyDeadLetterQueue.QueueName
- 修改Lambda代码,捕获异常并发送消息:
import boto3 import os sqs = boto3.client('sqs') # 从环境变量获取队列URL dlq_url = os.environ['DLQ_URL'] def lambda_handler(event, context): try: raise Exception("Something went wrong") except Exception as e: # 打包失败详情发送到SQS sqs.send_message( QueueUrl=dlq_url, MessageBody=str({ 'trigger_event': event, 'error_message': str(e), 'lambda_request_id': context.request_id, 'function_name': context.function_name }) ) # 重新抛出异常,让API Gateway返回错误给调用方 raise e
- 在SAM模板的
HelloWorldFunction里添加环境变量,传入SQS队列URL:
Properties: # 其他原有配置不变 Environment: Variables: DLQ_URL: !Ref MyDeadLetterQueue
额外检查点
- 确认Lambda的IAM角色确实拥有
sqs:SendMessage权限(办法2必须配置,办法1中SAM会自动添加DLQ相关权限,但建议核对) - 确认SQS队列的权限策略允许当前账号的Lambda发送消息(同一账号下默认无需额外配置,除非修改过队列权限)
内容的提问来源于stack exchange,提问作者Kevin-H2R
相关产品推荐
相关产品推荐

