SQS触发Lambda后SNS异步目标未触发的原因排查
问题根源
Lambda的异步调用目标(成功/失败目标)仅针对异步调用场景生效,比如通过API Gateway异步调用、以InvocationType='Event'参数直接异步调用Lambda等。而SQS作为事件源触发Lambda属于同步执行模式(事件源映射触发的Lambda默认是同步调用),这种场景下Lambda配置的异步成功目标不会被触发。
解决方案
方案1:在Lambda代码内主动调用SNS(已验证可行)
既然已经确认Lambda内通过boto3调用SNS功能正常,直接在Lambda执行成功后添加SNS发布逻辑即可,修改后的代码如下:
import json import logging import boto3 logger = logging.getLogger() logger.setLevel(logging.INFO) sns_client = boto3.client('sns') # 替换为你的SNS主题ARN SNS_TOPIC_ARN = 'arn:aws:sns:*:*:SO-76795744' def lambda_handler(event, context): logger.info('Lambda function is executing!') logger.info(json.dumps(event)) # 执行成功后发布消息到SNS try: sns_client.publish( TopicArn=SNS_TOPIC_ARN, Message=json.dumps({ 'lambda_status': 'success', 'trigger_event': event, 'lambda_response': 'Hello from Lambda!' }), MessageStructure='json' ) logger.info('消息已成功发送到SNS') except Exception as e: logger.error(f'发送SNS消息失败: {str(e)}') return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
方案2:转为异步调用Lambda触发目标(复杂度较高)
如果一定要使用Lambda的异步目标配置,需要调整触发逻辑:
- 移除SQS直接触发Lambda的事件源映射
- 创建中间逻辑(比如另一个Lambda),从SQS拉取消息后,以
InvocationType='Event'的方式异步调用目标Lambda - 此时目标Lambda的异步成功目标会生效,因为调用方式为异步
不过这种方式增加了架构复杂度,不如方案1直接高效。
额外验证点
确认Lambda异步目标配置的基础正确性:
- 目标类型选择SNS主题,ARN填写无误
- 触发条件设置为“执行成功”(状态码范围200-299)
- Lambda执行角色已具备
sns:Publish权限(你已配置,此点无需调整)
内容的提问来源于stack exchange,提问作者Jarad
相关产品推荐
相关产品推荐

