AWS Lambda
開発者ガイド

AWS Lambda を Amazon SQS に使用する

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

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

例 Amazon SQS メッセージイベント

{ "Records": [ { "messageId": "c80e8021-a70a-42c7-a470-796e1186f753", "receiptHandle": "AQEBJQ+/u6NsnT5t8Q/VbVxgdUl4TMKZ5FqhksRdIQvLBhwNvADoBxYSOVeCBXdnS9P+erlTtwEALHsnBXynkfPLH3BOUqmgzP25U8kl8eHzq6RAlzrSOfTO8ox9dcp6GLmW33YjO3zkq5VRYyQlJgLCiAZUpY2D4UQcE5D1Vm8RoKfbE+xtVaOctYeINjaQJ1u3mWx9T7tork3uAlOe1uyFjCWU5aPX/1OHhWCGi2EPPZj6vchNqDOJC/Y2k1gkivqCjz1CZl6FlZ7UVPOx3AMoszPuOYZ+Nuqpx2uCE2MHTtMHD8PVjlsWirt56oUr6JPp9aRGo6bitPIOmi4dX0FmuMKD6u/JnuZCp+AXtJVTmSHS8IXt/twsKU7A+fiMK01NtD5msNgVPoe9JbFtlGwvTQ==", "body": "{\"foo\":\"bar\"}", "attributes": { "ApproximateReceiveCount": "3", "SentTimestamp": "1529104986221", "SenderId": "594035263019", "ApproximateFirstReceiveTimestamp": "1529104986230" }, "messageAttributes": {}, "md5OfBody": "9bb58f26192e4ba00f01e2e7b136bbd8", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:MyQueue", "awsRegion": "us-west-2" } ] }

Lambda は、ロングポーリングを使用して、アクティブになるまでキューをポーリングします。メッセージが利用可能になると、Lambda はバッチを読み込めるようにレートを増加し、同時実行の制限に達するまで関数を呼び出します。Amazon SQS キュー内での Lambda のメッセージ処理のためのスケーリングについては、「スケーリング動作について」を参照してください。

Lambda がキューからメッセージを読み取ると、メッセージはキューの状態を維持しますが、Lambda が削除するまでは非表示となります。関数がエラーを返す、またはキューの可視性タイムアウトまでの処理を完了しない場合、キューは再び表示されます。その後、Lambda によって再度 Lambda 関数に送信されます。失敗したすべてのメッセージはキューに戻るため、関数コードが副作用なしで同じメッセージを複数回処理できることが必要となります。

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

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

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

メッセージが複数化の処理に失敗する場合、Amazon SQS はこれをデッドレターキューに送信できます。ソースキューでデッドレターキューを設定し、処理に失敗したメッセージをトラブルシューティング用に保持します。キューの再処理ポリシーで maxReceiveCount を設定して、スロットリングによるデッドレターキューへのメッセージの送信を少なくとも 5 回は防ぐようにします。

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

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

Amazon SQS キューのイベントソースマッピングを追加するには

  1. Open the Lambda console Functions page.

  2. 関数を選択します。

  3. [トリガーの追加] で、[SQS] を選択します。

  4. [トリガーの設定] でイベントソースを設定します。

    • SQS キュー – ソースキューを指定します。

    • バッチサイズ – 1 回の呼び出しで、キューから読み取り、関数に送信する項目の最大数を指定します。

    • 有効 – イベントソースを無効にするには、チェックボックスをオフにします。

  5. [Add] を選択します。

  6. [Save] を選択します。

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

Lambda API あるいは AWS SDK を使用してイベントソースを設定するには、CreateEventSourceMapping アクションおよび UpdateEventSourceMapping アクションを使用します。

実行ロールのアクセス権限

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

詳細については、「アクセス権限の管理: IAM ロール (実行ロール) を使用する」を参照してください。