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

如何确认由Lambda创建的API网关向Amazon SNS的订阅

解决Lambda创建的API网关接收SNS订阅确认的问题

我来帮你搞定这个SNS订阅确认的难题——尤其是你这种API网关由Lambda动态创建的场景,核心是让你的Lambda能接住SNS发过来的确认请求,提取令牌并完成订阅确认。下面是一步步的具体操作:

1. 先理解SNS订阅确认的核心逻辑

当你把API网关端点订阅到SNS主题后,SNS会自动发送一个POST请求到你的API网关地址,这个请求的体里包含了完成订阅必须的Token、TopicArn和SubscribeURL。你的Lambda需要先识别出这个是订阅确认请求,然后用这些参数调用SNS的ConfirmSubscription API来完成确认。

2. 修改Lambda函数,处理订阅确认请求

因为你的Lambda既要处理正常业务请求,又要处理SNS的确认请求,所以先在代码里加一个判断逻辑,识别并处理订阅确认请求。下面是Python的示例代码(你可以根据自己的运行时调整):

import boto3
import json

# 初始化SNS客户端
sns_client = boto3.client('sns')

def lambda_handler(event, context):
    # 解析API网关传递过来的请求体
    try:
        request_body = json.loads(event['body'])
    except json.JSONDecodeError:
        return {
            'statusCode': 400,
            'body': json.dumps('无效的请求体格式')
        }

    # 判断是否是SNS订阅确认请求
    if request_body.get('Type') == 'SubscriptionConfirmation':
        # 提取关键参数
        confirm_token = request_body['Token']
        target_topic_arn = request_body['TopicArn']

        # 调用SNS确认订阅API
        try:
            sns_client.confirm_subscription(
                TopicArn=target_topic_arn,
                Token=confirm_token
            )
            return {
                'statusCode': 200,
                'body': json.dumps('SNS订阅确认成功!')
            }
        except Exception as e:
            return {
                'statusCode': 500,
                'body': json.dumps(f'订阅确认失败:{str(e)}')
            }

    # 下面是处理正常业务请求的逻辑(根据你的需求调整)
    else:
        return {
            'statusCode': 200,
            'body': json.dumps('处理正常业务请求')
        }

3. 确保API网关的集成配置正确传递请求体

因为你的API网关是Lambda创建的,一定要确认创建API网关的代码里用了AWS_PROXY集成类型——这种集成会完整把API网关的请求体、请求头都传递给Lambda,不需要额外的映射模板,能保证SNS的确认请求原封不动到达Lambda。

举个创建API网关集成的代码片段(用boto3):

import boto3

apigateway_client = boto3.client('apigateway')
region = 'us-east-1'
lambda_arn = 'arn:aws:lambda:us-east-1:你的账号ID:function:my_lambda'

# 创建AWS_PROXY类型的集成
apigateway_client.put_integration(
    restApiId='你的API网关ID',
    resourceId='你的资源ID',
    httpMethod='POST',
    type='AWS_PROXY',
    integrationHttpMethod='POST',
    uri=f'arn:aws:apigateway:{region}:lambda:path/2015-03-31/functions/{lambda_arn}/invocations'
)

4. 给Lambda配置必要的IAM权限

你的Lambda角色需要有调用sns:ConfirmSubscription的权限,否则会报错。给Lambda的执行角色添加以下权限策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sns:ConfirmSubscription",
            "Resource": "arn:aws:sns:us-east-1:你的账号ID:my_sns_topic"
        }
    ]
}

5. 触发并验证订阅确认

  • 如果还没收到SNS的确认请求,可以登录AWS控制台,进入my_sns_topic主题,找到对应的API网关订阅,点击「重新发送确认」按钮,触发SNS发送确认请求。
  • 确认完成后,回到SNS订阅列表,会看到该订阅的状态变为「已确认」。你也可以发送一条测试消息到SNS主题,验证Lambda是否能正常接收消息。

内容的提问来源于stack exchange,提问作者jack.pop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:33:24