📚

Amazon SQS + AWS Lambda について学ぶ

2021/10/17に公開

この記事では、Amazon SQS のキュー内のメッセージを AWS Lambda 関数を利用して処理する仕組みについて僕の理解した内容をまとめます。
※手を動かして開発するような内容は含みませんので、とりあえず開発してみたい人には向いてないかもしれません🙇‍♂️

Amazon SQS で AWS Lambda を使用する

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-sqs.html
こちらのページを僕なりに解釈した図がこちらです。↓

  1. Lambdaのイベントソースマッピングは、標準のキューFIFOキューをサポートしています。
  2. Lambdaはキューをポーリングしてキューメッセージを取得します。
  3. Lambdaはキューメッセージからバッチを読み込み、そのバッチをLambda関数に渡して処理を実行します。
  4. バッチ処理が成功したらキューからメッセージを削除、失敗したらキューにメッセージを戻します。

仕組み自体は結構シンプルですね😄
以下、図では記載しきれなかった内容です。

スケーリングと処理

標準キューの場合

  • Lambdaはロングポーリングを使用して、キューがアクティブになるのを待ちます。
  • メッセージが利用可能→Lambdaはバッチを 最大5つ 読み込み、Lambda関数に渡します。
  • 利用可能なメッセージが残っている場合は、バッチを読み込むプロセスの数を1分あたり 最大60 インスタンスまで増やします。
  • イベントソースマッピングによって同時に処理できるバッチの最大数は 1000

FIFOキューの場合

  • Lambdaは 受信した順序で メッセージを関数に送信します。
  • FIFO キューにメッセージを送信する場合、メッセージグループID を指定します。
  • Lambda はメッセージをグループにソートし、グループに対して一度に1つのバッチのみを送信します。
  • Lambda関数からエラーが返されると、Lambdaは同じグループから追加のメッセージを受信する前に、エラーの影響を受けたメッセージのすべての再試行を行います。

デットレターキュー

正常に処理できないキューメッセージを保持する仕組み。
問題のあるメッセージを分離して、処理が成功しない理由を調べることができるので

  • 繰り返し失敗するキューメッセージを処理の対象外にできる
  • デバッグに役立つ

注意点

  • Lambda関数ではなく、ソースキューのデッドレターキューを設定する
    • 関数で設定したデッドレターキューは、イベントソースキューではなく、関数の非同期呼び出しキューに使用されます。
  • デットレターキューは自動生成されないので、自分で作成する必要がある

標準のキュー

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html
こちらのページを元に標準のキューの特徴をまとめてみました。

例 Amazon SQS メッセージイベント (標準キュー)

{
    "Records": [
        {
            "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
            "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1545082649183",
                "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                "ApproximateFirstReceiveTimestamp": "1545082649185"
            },
            "messageAttributes": {},
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
            "awsRegion": "us-east-2"
        },
        {
            "messageId": "2e1424d4-f796-459a-8184-9c92662be6da",
            "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1545082650636",
                "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                "ApproximateFirstReceiveTimestamp": "1545082650649"
            },
            "messageAttributes": {},
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
            "awsRegion": "us-east-2"
        }
    ]
}

FIFOキュー

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html
こちらのページを元に標準のキューの特徴をまとめてみました。

例 Amazon SQS メッセージイベント (FIFO キュー)

{
    "Records": [
        {
            "messageId": "11d6ee51-4cc7-4302-9e22-7cd8afdaadf5",
            "receiptHandle": "AQEBBX8nesZEXmkhsmZeyIE8iQAMig7qw...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1573251510774",
                "SequenceNumber": "18849496460467696128",
                "MessageGroupId": "1",
                "SenderId": "AIDAIO23YVJENQZJOL4VO",
                "MessageDeduplicationId": "1",
                "ApproximateFirstReceiveTimestamp": "1573251510774"
            },
            "messageAttributes": {},
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:fifo.fifo",
            "awsRegion": "us-east-2"
        }
    ]
}

まとめ

今回はAmazon SQS + AWS Lambda について調べたことをまとめてみました。
AWS関連はど素人なので、間違いがありましたら指摘していただけると嬉しいです🙇‍♂️

Discussion