概要
AWSにはメッセージキューサービスとしてSimple Queue Service(SQS)が存在します
またSQSで管理しているキューに対してメッセージが入ってきたとき、処理させるLambdaを設定できます
ふと気になってい見てみると1つのキューに対して複数のLambdaが紐付けると知りました。
とはいえ実際にメッセージを処理させるのは1種類のLambdaである方が都合が良いと思いますが複数のメッセージが入ってきたときにどのような挙動になるか見ていきましょう
テスト用の処理
- ログ出力するLambdaを作成
- SQS作成
- SQSのトリガーに作成したLambdaを紐つける
Lambdaの関数名、同時に処理するSQSのメッセージ数、処理しているメッセージの中身をそれぞれ出力させます
exports.handler = async (event, context) => {
console.log(context.functionName)
console.log(event.Records.length)
event.Records.forEach((record) => {
console.log(record.body)
})
}
SQSも合わせて作成し、CloudShellからメッセージを送信して見ましょう
$ aws sqs send-message-batch --queue-url https://sqs.ap-northeast-1.amazonaws.com/[AWSアカウントID]/[SQSのQueue名] --entries \
'{"Id":"1","MessageBody":"Message 1 content"}' \
'{"Id":"2","MessageBody":"Message 2 content"}' \
'{"Id":"3","MessageBody":"Message 3 content"}' \
'{"Id":"4","MessageBody":"Message 4 content"}' \
'{"Id":"5","MessageBody":"Message 5 content"}' \
'{"Id":"6","MessageBody":"Message 6 content"}' \
'{"Id":"7","MessageBody":"Message 7 content"}' \
'{"Id":"8","MessageBody":"Message 8 content"}' \
'{"Id":"9","MessageBody":"Message 9 content"}' \
'{"Id":"10","MessageBody":"Message 10 content"}'
実際のログ出力
今回はLambdaの名前はmy-serverless-app-dev-processMessage1|2
と作成しました
1つ目の画像がprocessMessage1
のログ、2つ目の画像がprocessMessage2
のログとなっています
このことからSQSに複数のLambdaトリガーを設定すると
「どれか1つのLambdaで処理がされた場合、他のLambdaが実行されない」ということが確認できました。
そもそもとして複数のLambdaで処理させる必要があるケースならSQSではなくSNSを使えばうまくいきそうな感じがします
またメッセージ処理を早める目的であればLambdaがメッセージの同時に処理できる数を上げるほうが適切ですね
まとめ
- SQSでは複数のLambdaトリガーを設定できる
- 複数のLambdaを設定した場合、メッセージ単位でどのLambdaに処理させるか決めることはできない
また、複数のLambdaトリガーを設定する事による活用法など知っていればぜひ教えてください
参照
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-sqs.html
https://dev.classmethod.jp/articles/compare_sns_with_sqs/