AWS Lambda を Amazon SQS に使用する - AWS Lambda

AWS Lambda を Amazon SQS に使用する

AWS Lambda 関数を使用して、Amazon Simple Queue Service (Amazon SQS) キュー内のメッセージを処理できます。Lambda イベントソースマッピングは、標準キューFIFO (先入れ先出し) キューをサポートしています。Amazon SQS を使用すると、タスクをキューに送信して非同期的に処理することで、アプリケーションの 1 つのコンポーネントからタスクを任せることができます。

Lambda はキューをポーリングして、キューのメッセージを含むイベントで関数を同期的に呼び出します。Lambda はメッセージをバッチで読み取り、バッチごとに関数を呼び出します。関数が正常にバッチを処理すると、Lambda はキューからそのメッセージを削除します。以下の例では、2 つのメッセージのバッチのイベントを示しています。

例 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 キューの場合、レコードには、重複除外と順序付けに関連する追加属性が含まれます。

例 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" } ] }

Lambda がバッチを読み取る際、メッセージはキューに留まりますが、キューの可視性タイムアウトの間は非表示になります。関数が正常にバッチを処理すると、Lambda はそのメッセージをキューから削除します。関数がスロットリングされた、エラーを返した、または応答しなかった場合は、メッセージが再び表示されるようになります。失敗したバッチのすべてのメッセージはキューに戻るため、関数コードが副作用なしで同じメッセージを複数回処理できることが必要となります。

スケーリングと処理

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

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

関数は、アクティブなメッセージグループの数に並行してスケールできます。詳細については、AWS コンピューティングブログの「イベントソースとしての SQS FIFO」を参照してください。

Lambda で使用するためのキューを設定する

SQS キューを作成して、Lambda 関数のイベントソースとして機能できるようにします。次に、イベントの各バッチを処理できるように Lambda 関数の時間と — スケールアップしたスロットリングエラーに対応して再試行できるように Lambda をキューで設定します。

レコードの各バッチを処理する関数時間を許可するには、ソースキューの可視性タイムアウトを、関数で設定したタイムアウトの少なくとも 6 倍に設定します。関数が前のバッチの処理中に関数の実行がスロットリングされた場合、Lambdaの再試行のために追加時間が与えられます。

メッセージが何回も処理に失敗する場合、Amazon SQS はこのメッセージをデッドレターキューに送信できます。関数がエラーを返すと、Lambda はそのメッセージをキューに残します。可視性タイムアウトが発生すると、Lambda はメッセージをもう一度受信します。多数の受信後に 2 番目のキューにメッセージを送信するには、ソースキューにデッドレターキューを設定します。

注記

Lambda 関数ではなく、ソースキューのデッドレターキューを設定するようにしてください。関数で設定したデッドレターキューは、イベントソースキューではなく、関数の非同期呼び出しキューに使用されます。

関数からエラーが返された場合や、同時実行数の最大値に達しているために関数を呼び出せない場合は、追加の試行で処理が成功する場合があります。メッセージを配信不能キューに送信する前にメッセージが処理される確率を高めるには、送信元キューのリドライブポリシーの maxReceiveCount5 以上に設定します。

実行ロールのアクセス許可

Lambda では、Amazon SQS キューでメッセージを管理するために以下のアクセス権限が必要です。これを関数の実行ロールに追加します。

詳細については、「AWS Lambda 実行ロール」を参照してください。

イベントソースとしてキューを設定する

イベントソースマッピングを作成し、キューから Lambda 関数に項目を送信するように Lambda に通知します。1 つの関数で複数のキューの項目を処理するには、複数のイベントソースマッピングを作成します。Lambda がターゲットの関数を呼び出すと、このイベントには設定可能なバッチサイズまでの複数の項目が含まれている可能性があります。

Lambda コンソールで Amazon SQS から読み取るように関数を設定するには、SQS トリガーを作成します。

トリガーを作成するには

  1. Lambda コンソール (関数ページ) を開きます。

  2. 関数を選択します。

  3. [Designer] で、[Add trigger] を選択します。

  4. トリガータイプを選択します。

  5. 必要なオプションを設定して [追加] を選択します。

Lambda では、Amazon SQS イベントソースの次のオプションがサポートされています。

イベントソースオプション

  • SQS キュー – レコードの読み取り元の Amazon SQS キュー。

  • バッチサイズ – 各バッチのキューから読み取る項目の数で、最大は 10。Lambda がキューから読み取ったバッチの項目数が少ない場合、イベントに含まれている項目が少ない場合があります。

  • 有効 – 項目の処理を停止するためにイベントソースを無効にします。

後でイベントソース設定を管理するには、デザイナーでトリガーを選択します。

バッチの項目全体を処理するために十分な時間で、関数のタイムアウト時間を設定します。項目の処理に長時間かかる場合には、より少ないバッチサイズを選択します。バッチサイズを大きくするとワークロードの効率を向上させることができ、非常に高速になるか、多くのコストがかかります。ただし、関数がエラーを返した場合、バッチ内のすべての項目がキューに戻ります。関数で予約された同時実行数を設定した場合、同時実行数を 5 以上に設定すると、Lambda が関数を呼び出したときにスロットリングエラーが発生する可能性が少なくなります。

イベントソースマッピング API

AWS CLI または AWS SDK を使用してイベントソースマッピングを管理するには、次の API アクションを使用します。

次の例では、AWS CLI を使用して、5 のバッチサイズで、my-function という名前の関数を、Amazon リソースネーム (ARN) によって指定された Amazon SQS キューにマッピングします。

$ aws lambda create-event-source-mapping --function-name my-function --batch-size 5 \ --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue { "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284", "BatchSize": 5, "EventSourceArn": "arn:aws:sqs:us-east-2:123456789012:my-queue", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "LastModified": 1541139209.351, "State": "Creating", "StateTransitionReason": "USER_INITIATED" }