如何将私有 HTTP 或 HTTPS 终端节点订阅到我的 Amazon SNS 主题?

上次更新时间:2021 年 6 月 3 日

我想将一个私有 HTTP 或 HTTPS 终端节点订阅到我的 Amazon Simple Notification Service(Amazon SNS)主题。该如何进行设置?

简短描述

要将私有 HTTP 或 HTTPS 终端节点订阅到 Amazon SNS 主题,请执行以下操作:

解决方法

在该私有终端节点所在的 Amazon VPC 中创建一个 Amazon VPC 安全组(LambdaSG)

1.    打开 Amazon VPC 控制台

2.    在左侧导航窗格中的 Security(安全性)下,选择 Security Groups(安全组)。然后选择 Create security group(创建安全组)。

3.    对于 Security group name(安全组名称),输入 LambdaSG

4.    对于 VPC,选择该私有终端节点所在的 Amazon VPC。

5.    选择 Create security group(创建安全组)。

在该私有终端节点所在的 Amazon VPC 和子网中创建一个 Lambda 函数,然后将该函数添加到 LambdaSG 安全组

1.    打开 Lambda 控制台

2.    选择 Create function (创建函数)

3.    选择从头开始创建

4.    对于 Function name(函数名称),输入描述函数用途的名称。例如,Private-endpoint-Amazon-SNS-topic-subscription

5.    对于 Runtime(运行时),选择 Python 3.8

6.    选择 Advanced settings(高级设置)。

7.    对于 VPC - optional(VPC – 可选),选择该私有终端节点所在的 Amazon VPC。此时将显示 Subnets(子网)和 Security groups(安全组)下拉列表。

8.    对于 Subnets(子网),选择该私有终端节点所在的子网。

9.    对于 Security groups(安全组),选择 LambdaSG

10.    选择 Create function(创建函数)。

编辑该私有终端节点的安全组规则,以允许来自该 Lambda 函数安全组的入站连接

1.    打开 Amazon VPC 控制台

2.    在左侧导航窗格中的 Security(安全性)下,选择 Security Groups(安全组)。

3.    选择该私有终端节点的安全组名称。

4.    选择 Edit inbound rules(编辑入站规则)。

5.    对于 Type(类型),选择 HTTPHTTPS,具体取决于您的使用案例。Protocol(协议)和 Port range(端口范围)字段将会自动填充。

6.    对于 Source(源),选择 Custom(自定义)。然后选择 LambdaSG 安全组。

7.    选择 Save rules(保存规则)。

配置该 Lambda 函数,使其将传入的 Amazon SNS 通知传递到该私有终端节点

1.    创建一个 Lambda 部署程序包,其中包含您的 Lambda 函数的 Python 请求库。按照 教程:在 Python 3.8 中创建 Lambda 函数创建部署程序包部分的说明进行操作。对于第 3 步,将教程中提供的代码替换为以下示例代码片段。

使用请求库将从 Amazon SNS 传入的通知发布到私有终端节点的 Python 代码片段

重要提示:请将 url 值替换为您的私有终端节点的 URL。

import json
import requests
 
def lambda_handler(event, context):
    url = "<PRIVATE_HTTP/S_ENDPOINT_URL>"
 
    sns_message_payload = event["Records"][0]["Sns"]
 
    sns_message_headers = {
        "x-amz-sns-message-id": sns_message_payload['MessageId'],
        "x-amz-sns-message-type": sns_message_payload["Type"],
        "x-amz-sns-subscription-arn" : event["Records"][0]["EventSubscriptionArn"],
        "x-amz-sns-topic-arn" : sns_message_payload["TopicArn"]
    }
 
    try:
        r = requests.post(url = url, data = json.dumps(sns_message_payload), headers = sns_message_headers)
    except Exceptions as e:
        print(e)
 
    print(r.content)
 
    return {
        'statusCode': 200,
        'body': json.dumps(r.content)
    }

2.    使用部署软件包更新您之前创建的 Lambda 函数

将该 Lambda 函数订阅到您的 Amazon SNS 主题


这篇文章对您有帮助吗?


您是否需要账单或技术支持?