AWS Lambda
開発者ガイド

AWS Lambda を Amazon SQS に使用する

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

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

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

{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "test", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "098f6bcd4621d373cade4e832627b4f6", "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", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082650636", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082650649" }, "messageAttributes": {}, "md5OfBody": "098f6bcd4621d373cade4e832627b4f6", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" } ] }

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

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

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

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

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

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

注記

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

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

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 Command Line Interface を使用して、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" }