SNSとSQSを使用したファンアウト構成でLambdaにメッセージを送信する方法
はじめに
かつまたです。今回はSNS、2つのSQS、2つのLambda関数を用いてファンアウト構成を作成し、動作確認を行いました。構成図は以下のとおりです。
ファンアウト構成とは
ファンアウト構成とは、1つのソースから複数のターゲットにデータを配信するアーキテクチャパターンです。AWSにおいては、SNSとSQSを組み合わせて実現することが多いです。この構成により、1つのSNSトピックにメッセージを発行すると、そのメッセージが複数のSQSキューに配信され、それぞれのキューが独自にメッセージを処理することができます。
SNSトピック作成
1.マネジメントコンソールから「SNS」を選択し、「トピックの作成」を選択します。
2.適当なトピック名入力し、その他の設定はデフォルトのままで設定します。「トピックの作成」を選択します。
SQSキュー作成
1.「SQS」を選択。「キューの作成」を選択します。
2.「キューのタイプ」として「標準キュー」を選択し、「キュー名」に適当な名前を入力します。その他の設定はデフォルトのままで設定します。「キューの作成」を選択します。
3.同様の手順で2つ目のキューも作成します。
SNSトピックとSQSキューのサブスクリプション設定
1.SQSの作成したキューを選択し、「Amazon SNSトピックにサブスクライブ」をクリックします。
2.先ほど作成したSNSトピックのARNを指定し、「保存」をクリックします。
3.同様の手順で2つ目のSQSキューもサブスクライブします。
Lambda関数の作成
1.「Lambda」に移動し、「関数の作成」をクリック。
2.「関数名」に適当な名前を入力。「ランタイム」に「Python 3.8」を選択。「関数の作成」をクリック。
3.関数コードに以下のコードを入力します。
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')
}
4.SQSをトリガーにLambdaを実行するための権限をLambdaのロールに付与します。
「設定」→「アクセス権限」のロール名をクリックし「IAM」に遷移します。
5.「許可を追加」→「ポリシーをアタッチ」を選択し、検索から「AWSLambdaSQSQueueExecutionRole」を選びアタッチします。これでSQS をトリガーに Lambda を実行するための権限が付与できました。
AWSLambdaSQSQueueExecutionRoleポリシー
5.上記で編集したロールを選択して同様の手順で2つ目のLambda関数を作成します。
SQSキューのトリガーとしてLambdaを設定
1.Lambda関数の詳細ページに移動し「トリガーの追加」をクリックします。
2.「トリガーの設定」として「SQS」を選択し、「キュー」に1つ目のSQSキューを選択します。「追加」をクリック。
トリガー設定
3.同様の手順で2つ目のSQSキューもトリガーとして追加します。
メッセージの送信と確認
1.SNSに戻り、作成したトピックを選択し「メッセージの発行」をクリックします。
2.「メッセージ本文」に適当なメッセージを入力し、「メッセージの発行」をクリックします。
3.Lambdaの作成した関数に移動し、モニタリングの「CloudWatchログを表示」からログストリームを選択しメッセージが処理されたことを確認します。
CloudWatchのログストリーム
ログストリーム内のログ
おわりに
それぞれ2つのSQSとLambdaを作成しメッセージを発行することで、並列にメッセージが届くことを確認することができました。
ご覧いただきありがとうございました。
参考
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。