Amazon SNSとメッセンジャー連動 #subscribe#AWS Marketplace

AWS

2023.12.8

Topics

はじめに 

こんにちは、エンジニアのFeelです。
この記事はNHN テコラス Advent Calendar 2023の8日目の記事です。

ISVの商品をAWS Marketplaceで発売する際にサブスクリプションとキャンセルを知らせるためにAWS SNSをよく使用していますが、顧客に通知するソース部分に対する特別な検証システムなしで技術支援を続けていたので、今回AWS SNS部分だけのテストプロセスを作成することと、その過程を本ブログに記載することにします。

構成シナリオ

アーキテクチャイメージは下記の様です。
SNS
UserからS3にFileをアップロードおよび削除するアクションEventが発生する際に、SNSをcallします。 SNSは3つのサブスクリプションに関連付けられています。
– Emailサブスクリプションを通じてオペレータにメールを送信します。
– Lambda(mytoficfunction)サブスクリプションを介してCloudWatchロググループにロギングします。
– Lambda(slackfunction)サブスクリプションを介してCloudWatchロググループにログをロギングし、slcakチャネルでWebHookを行います。

 

1. Slack にて WebHook URLの確認

Slack ログイン状態 > 左メニューから > App

検索ボックスに “incoming webhooks” >追加

Post to Channelでhookingするchannel名を選択 >  Incoming WebHooks インテグレーションの参加

Webhook URL を確認(ex :https://hooks.slack.com/services/T03PNV9N9/B066Q4QQFPZ/R2Vl6……….) > 設定を保存する

2. Topicの作成

Amazon SNS > トピック> トピックの作成

メソッドの選択 : ベーシック
パブリッシャー : トピックの所有者のみ
サブスクライバー : 全員

※設定時の注意点
FIFOはSQSだけサポートします。
暗号化をONにすると CMKを選択(デフォルト : alias/aws/sns)する必要があります。
配信ステータスのログ記録
– Log delivery status for these protocols : Lambda, SQS, HTTP/S, Platform application endpoint, Kinesis Data Firehose を支援

3.サブスクリプションの作成 – Email の場合

Amazon SNS > サブスクリプション > サブスクリプションの作成

※Protocol : Amazon Kinesis Data Firehose, SQS, Lambda, Email, HTTP/S, Paltform application endpoint を支援
エンドポイントにAmazon SNS から通知を受信できる E メールアドレスを入力> “サブスクリプションの作成” をクリック
下記のように登録したメールアドレスから通知confirmの要請メールを確認できます。

4. サブスクリプションの作成 – Lambdaの場合

AWS Lambda >関数>関数の作成

トリガーを2つ作成します。
①SNS トピックにプッシュされたメッセージをログに記録するAmazon SNSトリガー

②CloudWatch アラーム通知を Slack に送信する Amazon SNS トリガー

※環境関数はソース上で下記のように定義して使用されます。(参照:https://aws.amazon.com/jp/premiumsupport/knowledge-center/sns-lambda-webhooks-chime-slack-teams/)

 

…………………………………….

def post_slack(argStr):
message = argStr
send_data = {
“text”: message,
}
send_text = json.dumps(send_data)
request = urllib.request.Request(
“https://hooks.slack.com/services/T03PNV9N9/B066Q4QQFPZ/…………”,      //Channel URL
data=send_text.encode(‘utf-8’),
)

with urllib.request.urlopen(request) as response:
slack_message = response.read()

def lambda_handler(event, context):
post_slack(“Lambdaからslackに送るメッセージ: S3ストレージに更新作業が発生しました。”)

…………………………………………

5. テスト (S3にて更新イベントを発生させる)

Amazon SNS > Topics > mytopic > Edit > Access policy > 内容修正(下記のように) > Save changes

# S3によるSNSアクセスの承認

...アクセスポリシーの最後の部分に張り付けます..
{
“Sid”: “s3EventSNSNotification”,
“Effect”: “Allow”,
“Principal”: “*”,
“Action”: “sns:Publish”,
“Resource”: “arn:aws:sns:ap-northeast-1:860391889380:feelTopic”,  //region, AWSアカウント, topic確認
“Condition”: {
“ArnLike”: {
“aws:SourceArn”: “arn:aws:s3:::techo1” //利用するS3バケット
}
}
}

※権限なしでEvent notificationsを生成すると「Unable to validate the following destination configurations」エラーのポップアップが表示します。

Amazon S3 > バケット> バケット名> プロパティ> イベント通知

※イベントタイプは下記のようにしました。

Event types
すべてのオブジェクト作成イベント
すべてのオブジェクト削除イベント
すべてのオブジェクト復元イベント

 

「変更の保存」を押して完了すると下記のようなメールが届きます。

※LambdaをDestinationに直接に連結するのも可能です。 ただし、SNSを利用すれば複数の呼び出し(Email、Lambda、SQSなど)が可能です。Amazon S3 > buckets > mybucket > Upload > 2つ(test.pdf, test.png) をアップロード

Amazon S3 > buckets > mybucket > Upload > 2つ(test.pdf, test.png) を削除

結果チェック 

受信メール確認:2つのメールを受信


slack の awsSlack チャンネルで受信メッセージを確認


CloudWatch > Log groups : ロギングの確認


※合計4回(アップロード2個、削除2個)の行為で2個(拡張子がpdf)だけ動作するためメールが2個のみ発送されます。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら