Amazon Simple Notification Service (Amazon SNS) トピックにプライベート HTTP または HTTPS エンドポイントをサブスクライブしたいと考えています。設定する方法を教えてください。
簡単な説明
プライベート 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. [Author from scratch] を選択します。
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] (タイプ) で、ユースケースに応じて [HTTP] または [HTTPS] を選択します。[Protocol] (プロトコル) および [Port range] (ポート範囲) フィールドは自動的に入力されます。
6. [Source] (ソース) で、[Custom] (カスタム) を選択します。その後、LambdaSG セキュリティグループを選択します。
7. [Save rules] (ルールを保存) を選択します。
受信した Amazon SNS 通知をプライベートエンドポイントに渡すように Lambda 関数を設定する
1. Lambda 関数の Python リクエストライブラリを含む Lambda デプロイパッケージを作成します 。チュートリアル: 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 関数を更新します。
Amazon SNS トピックに Lambda 関数をサブスクライブします。
同じアカウントで Lambda 関数を Amazon SNS のトピックにサブスクライブするにはどうすればよいですか? の手順に従います。