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

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:

  1. 先给Lambda的IAM角色加SQS发消息的权限,在SAM模板的HelloWorldFunction里添加Policies配置:
Properties:
  # 其他原有配置不变
  Policies:
    - SQSSendMessagePolicy:
        QueueName: !GetAtt MyDeadLetterQueue.QueueName
  1. 修改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
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:05:30