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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:00:20