イベントソースとして SQS を使用して設定されているのに Lambda 関数が呼び出されないのはなぜですか?

所要時間2分
0

Amazon Simple Queue Service (Amazon SQS) キュー内のメッセージを処理するように AWS Lambda 関数を設定しました。しかし、私の Lambda 関数は呼び出されず、キュー内のメッセージは処理しませんでした。

解決策

前提条件

  • まず、Lambda 関数がイベントソースとして Amazon SQS を使用して設定されているかどうかを確認します。
  • 次に、Lambda 関数の AWS Identity and Access Management (IAM) ロールに SQS キューからメッセージを取得するのに必要な権限があるかを確認します。
  • 呼び出しと SQS キューの関数の Amazon CloudWatch メトリクスをチェックして、キューにメッセージがあるかを確認します。メッセージが表示されない、または SQS キューに送信されない場合は、プロデューサーに必要な権限があるかどうかをご確認ください。ユーザーまたはロールには、以下の Amazon SQS と AWS Key Management Service (AWS KMS) のアクセス権限が必要です。
    sqs:SendMessage
    kms:GenerateDataKey
    kms:Decrypt

**注:**キューが暗号化されていない場合は、AWS KMS のアクセス権限は必要ありません。

Lambda 関数と SQS キュー URL が正しいかどうかを確認する

Lambda 関数の Amazon リソースネーム (ARN) と、Lambda 関数のイベントソースマッピングの SQS キュー URL が正しいことを確認します。また、イベントソースマッピングがオンになっているかをご確認ください。

  1. Lambda コンソールを開きます。
  2. ナビゲーションペインで、[関数] を選択します。
  3. 確認したい関数を選択します。
  4. SQS トリガーを選択して展開し、SQS キュー URL が正しいかどうかを確認します。また、トリガーステータスがオンになっているかどうかもご確認ください。詳細については、「Lambda の Amazon SQS トリガーが無効になったのはなぜですか?」をご参照ください。

これらのチェックには、list-event-source-mapping コマンドで実行することもできます。

例:

aws lambda list-event-source-mappings --function-name <my-function> --region <region-name>

**注:入れ替え<my-function>Lambda 関数の名前<region name>**AWS リージョンを置き換えます。

Lambda 関数の権限を確認する

Lambda 実行ロールに SQS キューからメッセージをポーリングする権限がある場合は、SQS キューのアクセスポリシーをご確認ください。Lambda 関数を制限する可能性のある拒否ルールを探してください。

  1. Amazon SQS コンソールを開きます。
  2. ナビゲーションペインで、[Queues] を選択します。
  3. SQS キューを選択し、アクセスポリシータブを選択します。
  4. Lambda トラフィックをブロックする拒否ポリシーがないかどうかをご確認ください。トラフィックをブロックするポリシーがある場合は、Lambda からのリクエストを無視する条件を deny ステートメントに追加します。

Lambda 関数 IAM には次のアクセス権限が必要です。

  • DeleteMessage
  • GetQueueAttributes
  • ReceiveMessage

キューが暗号化されているかを確認する

キューが暗号化されている場合、Lambda 関数の IAM ロールには AWS KMS アクションを実行する権限が必要です。これらの必要な権限がないと、Lambda 関数は SQS キューからのメッセージを取り込むことができません。Amazon SQS キューが AWS KMS 暗号化で設定されている場合は、以下のタスクを実行してください。

  • AWS KMS キーが存在するかどうかを確認します。
  • Lambda 関数ロールに kms:Decrypt permissions 権限があるかを確認します。
  • AWS KMS キーポリシーのアクセス権限が Lambda ロールからのアクションを許可するように設定されているかを確認します。

注: デフォルトキー (Amazon SQS の場合は AWS KMS キー) がある Amazon SQS キューは、別の AWS アカウントで Lambda 関数を呼び出すことはできません。

特定の Lambda 関数がスロットルされているかどうかを確認する

Lambda にはリージョンの同時実行制限があります。AWS リージョン内の他の機能が積極的にこの容量を最大限に活用すると、その機能にスロットルが発生する可能性があります。これは、機能自体が最大容量に達していない場合でも発生する可能性があります。

関数の予約済み同時実行数を 0 に設定すると、その関数では呼び出しは行われません。Amazon SQS からのメッセージはすべてスロットリングされます。Amazon CloudWatch のリージョンの同時実行数 (最大) メトリックスと関数の**スロットル **(SUM) メトリックスをご確認ください。リージョンのキャパシティに達しているかどうか、関数に制限があるかどうかをご確認ください。関数を呼び出して SQS メッセージを処理するのに十分な容量があるかご確認ください。

同じ SQS キューに他のアクティブなコンシューマーがいないかどうかを確認する

SQS キューに複数のアクティブなコンシューマーがいる場合、メッセージはこれらのコンシューマーによって消費される可能性があります。SQS メッセージは、一度に 1 人のコンシューマーのみが使用するように設計されています。そのため、別のコンシューマーが SQS キューを使用している場合、Lambda 関数は SQS キューをポーリングしてもメッセージを受信しない可能性があります。Amazon SQS コンソールを使用して、他の Lambda 呼び出しや Amazon SQS 呼び出しがアクティブでないかどうかご確認ください。

**注:**他のコンシューマーは、SNS キューからプログラムでメッセージを取得している可能性があります。これらの取得はコンソールには表示されません。

SQS イベントソースにフィルタが設定されているかを確認する

SQS イベントソースにフィルタが設定されているかどうかを確認します。SQS イベントソースにフィルタが設定されている場合は、Amazon SQS メッセージをフィルタで除外していないかご確認ください。

  1. Lambda コンソールを開きます。
  2. ナビゲーションペインで、[関数] を選択します。
  3. 確認したい関数を選択します。
  4. SQS トリガーを選択し、フィルタ条件を確認します。トリガー設定にキー名が表示されない場合は、フィルタが設定されていないことを示します。フィルタ条件が設定されている場合は、フィルタを確認して、Lambda による有効なメッセージの処理を許可しているかを確認します。フィルタ条件を一時的に削除するには、[編集] を選択します。
  5. フィルタを削除した後に関数が呼び出される場合は、ユースケースに合わせてフィルタ条件を変更します。

詳細については、「Amazon SQS でフィルタリング」と「Lambda イベントフィルタリングのベストプラクティス」をご参照ください。

関連情報

Amazon SQS での Lambda の使用

Amazon SQS イベントソースの Lambda 関数が最適にスケーリングされないのはなぜですか?

Lambda 関数が有効な Amazon SQS メッセージを再試行してデッドレターキューに入れるのはなぜですか?

AWS公式
AWS公式更新しました 6ヶ月前