SNSとSQSを使用したファンアウト構成でLambdaにメッセージを送信する方法

SNSとSQSを使用したファンアウト構成でLambdaにメッセージを送信する方法

Clock Icon2024.09.10

はじめに

かつまたです。今回はSNS、2つのSQS、2つのLambda関数を用いてファンアウト構成を作成し、動作確認を行いました。構成図は以下のとおりです。
funout-sns-sqs.drawio

ファンアウト構成とは

ファンアウト構成とは、1つのソースから複数のターゲットにデータを配信するアーキテクチャパターンです。AWSにおいては、SNSとSQSを組み合わせて実現することが多いです。この構成により、1つのSNSトピックにメッセージを発行すると、そのメッセージが複数のSQSキューに配信され、それぞれのキューが独自にメッセージを処理することができます。

SNSトピック作成

1.マネジメントコンソールから「SNS」を選択し、「トピックの作成」を選択します。

2.適当なトピック名入力し、その他の設定はデフォルトのままで設定します。「トピックの作成」を選択します。
SNSサクセイ-2.png

SQSキュー作成

1.「SQS」を選択。「キューの作成」を選択します。

2.「キューのタイプ」として「標準キュー」を選択し、「キュー名」に適当な名前を入力します。その他の設定はデフォルトのままで設定します。「キューの作成」を選択します。
SQS作成1-1.png

3.同様の手順で2つ目のキューも作成します。

SNSトピックとSQSキューのサブスクリプション設定

1.SQSの作成したキューを選択し、「Amazon SNSトピックにサブスクライブ」をクリックします。
スクリーンショット 2024-09-09 10.13.25-1.png

2.先ほど作成したSNSトピックのARNを指定し、「保存」をクリックします。
SQSをSNSにサブスク-1.png

3.同様の手順で2つ目のSQSキューもサブスクライブします。

Lambda関数の作成

1.「Lambda」に移動し、「関数の作成」をクリック。

2.「関数名」に適当な名前を入力。「ランタイム」に「Python 3.8」を選択。「関数の作成」をクリック。
lambda作成.png

3.関数コードに以下のコードを入力します。

python
import json

def lambda_handler(event, context):
    for record in event['Records']:
        print("Message Body: ", record['body'])
    return {
        'statusCode': 200,
        'body': json.dumps('Message received and processed')
    }

Lambdaコード編集.png

4.SQSをトリガーにLambdaを実行するための権限をLambdaのロールに付与します。
「設定」→「アクセス権限」のロール名をクリックし「IAM」に遷移します。
スクリーンショット 2024-09-09 13.44.57.png

5.「許可を追加」→「ポリシーをアタッチ」を選択し、検索から「AWSLambdaSQSQueueExecutionRole」を選びアタッチします。これでSQS をトリガーに Lambda を実行するための権限が付与できました。
スクリーンショット 2024-09-09 13.39.35.png

AWSLambdaSQSQueueExecutionRoleポリシー
スクリーンショット 2024-09-09 10.33.51.png

5.上記で編集したロールを選択して同様の手順で2つ目のLambda関数を作成します。
スクリーンショット 2024-09-09 13.41.47.png

SQSキューのトリガーとしてLambdaを設定

1.Lambda関数の詳細ページに移動し「トリガーの追加」をクリックします。

2.「トリガーの設定」として「SQS」を選択し、「キュー」に1つ目のSQSキューを選択します。「追加」をクリック。
Lambdaのトリガー追加.png

トリガー設定
LambdaのトリガーをSQS.png

3.同様の手順で2つ目のSQSキューもトリガーとして追加します。

メッセージの送信と確認

1.SNSに戻り、作成したトピックを選択し「メッセージの発行」をクリックします。
スクリーンショット 2024-09-09 12.07.22.png

2.「メッセージ本文」に適当なメッセージを入力し、「メッセージの発行」をクリックします。
スクリーンショット 2024-09-10 14.55.22

3.Lambdaの作成した関数に移動し、モニタリングの「CloudWatchログを表示」からログストリームを選択しメッセージが処理されたことを確認します。
CloudWatch Logs確認

CloudWatchのログストリーム
ログストリーム

ログストリーム内のログ
スクリーンショット 2024-09-10 14.57.17

おわりに

それぞれ2つのSQSとLambdaを作成しメッセージを発行することで、並列にメッセージが届くことを確認することができました。
ご覧いただきありがとうございました。

参考

https://dcj71ciaiav4i.cloudfront.net/49D0D220-8D0F-11EB-8F39-FD9A62BABEEC/chapter3.html

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.