Lambda での呼び出しに関する問題のトラブルシューティング - AWS Lambda

Lambda での呼び出しに関する問題のトラブルシューティング

Lambda 関数を呼び出すと、Lambda はリクエストを検証し、イベントを関数 (非同期呼び出しの場合はイベントキュー) に送信する前にスケーリングキャパシティーをチェックします。呼び出しエラーは、リクエストのパラメータ、イベント構造、関数の設定、ユーザーのアクセス許可、リソースに対するアクセス許可、または制限に関する問題が原因で発生する場合があります。

関数を直接呼び出した場合は、Lambda からのレスポンスに呼び出しエラーが表示されます。イベントソースマッピングまたは別のサービスを通じて関数を非同期的に呼び出した場合は、ログ、デッドレターキュー、または失敗イベントの送信先にエラーが表示されることがあります。エラー処理オプションと再試行の動作は、関数を呼び出した方法とエラーの種類によって異なります。

Invoke オペレーションが返す可能性のあるエラータイプのリストについては、呼び出し を参照してください。

Lambda: 初期化フェーズ中に関数がタイムアウトします (Sandbox.Timedout)

エラー: Task timed out after 3.00 seconds

初期化フェーズがタイムアウトすると、Lambda は、次の呼び出しリクエストが到着したときに Init フェーズを再実行することで、実行環境を再度初期化します。これは、抑制された初期化と呼ばれます。ただし、関数に短いタイムアウト時間 (通常は 3 秒程度) が設定されている場合、割り当てられたタイムアウト時間中に抑制された初期化が完了せず、Init フェーズが再びタイムアウトすることがあります。また、抑制された初期化は完了しても、呼び出しフェーズが完了するまでの十分な時間が残らないために、Invoke フェーズがタイムアウトします。

タイムアウトエラーを減らすには、以下のうち 1 つ以上の方法を使用します。

  • 関数のタイムアウト時間を延長する: タイムアウトを延長して、Init フェーズと Invoke フェーズが正常に完了する時間を与えます。

  • 関数メモリ割り当てを増やす: メモリを増やすと、比例して CPU 割り当ても増加するため、Init フェーズと Invoke フェーズの両方を高速化できます。

  • 関数の初期化コードを最適化する: 初期化に必要な時間を短縮して、設定されたタイムアウト時間内に Init フェーズと Invoke フェーズを完了できるようにします。

  • エラー処理を追加する: 関数コードで適切なエラー処理を行うと、Lambda 実行環境が失敗し、初期化の試行が繰り返されるのを防ぐことができます。

IAM: lambda:InvokeFunction は許可されていません

エラー: ユーザー (arn:aws:iam::123456789012:user/developer) によるリソース (my-function) に対する lambda:InvokeFunction の実行は許可されていません

ユーザー、または引き受けるロールには、関数を呼び出すための許可が必要です。この要件は、Lambda 関数、および関数を呼び出す他のコンピューティングリソースにも適用されます。AWS マネージドポリシーである AWSLambdaRole をユーザーに追加するか、ターゲット関数での lambda:InvokeFunction アクションを許可するカスタムポリシーを追加します。

注記

IAM アクションの名前 (lambda:InvokeFunction) は、Invoke Lambda API オペレーションを示しています。

詳細については、「AWS Lambda アクセス許可の管理」を参照してください。

Lambda: 有効なブートストラップ (Runtime.InvalidEntrypoint) が見つかりませんでした

エラー: 有効なブートストラップが見つかりませんでした: [/var/task/bootstrap /opt/bootstrap]

このエラーは通常、デプロイパッケージのルートに bootstrap という名前の実行ファイルが含まれていない場合に発生します。例えば、.zip ファイルを使用して provided.al2023 関数をデプロイする場合、bootstrap ファイルは .zip ファイルのディレクトリ内ではなく、ルートにある必要があります。

Lambda: オペレーションは ResourceConflictException を実行できません

エラー: ResourceConflictException: 今回はオペレーションを実行できません。現在、この関数は次の状態にあります: 保留中

関数の作成時に Virtual Private Cloud (VPC) に接続すると、Lambda が Elastic Network Interface を作成するまでの間、関数は Pending 状態になります。この間は、関数を呼び出したり変更したりすることはできません。関数の作成後に VPC に接続すると、更新が保留中である間に関数を呼び出すことができます。ただし、そのコードや設定を変更することはできません。

詳細については、「Lambda 関数の状態」を参照してください。

Lambda: 関数が Pending のままとなっています

エラー: 関数が数分間 Pending 状態で止まっている。

関数が 6 分を超えて Pending 状態で止まっている場合は、以下のいずれかの API オペレーションを呼び出して、ブロックを解除します。

Lambda は保留中のオペレーションをキャンセルし、関数を Failed 状態に移します。その後、再度更新を試みることができます。

Lambda: 1 つの関数がすべての同時実行を使用しています

問題: 1 つの関数がすべての利用可能な同時実行を使用しているため、他の関数がスロットリングされる。

AWS リージョンで AWS アカウントで使用可能な同時実行をプールに分割するには、予約済みの同時実行を使用します。予約同時実行により、関数は常に割り当てられた同時実行にスケールでき、割り当てられた同時実行を超えることはありません。

一般: 他のアカウントまたはサービスで関数を呼び出すことはできません

問題: 関数を直接呼び出すことはできるが、別のサービスやアカウントから呼び出すと関数が実行されない。

他のサービスやアカウントから関数を呼び出すためのアクセス許可を、関数のリソースベースのポリシーで付与します。別のアカウントから呼び出す場合、そのアカウントのユーザーにも関数を呼び出すためのアクセス権限が必要です。

一般: 関数の呼び出しはループしています

問題: 関数がループ内で連続して呼び出される。

これは、通常、関数が管理するリソースが、この関数をトリガーするのと同じ AWS のサービス内にある場合に発生します。例えば、Amazon Simple Storage Service (Amazon S3)バケットにオブジェクトを保存する関数を作成した場合、このバケットにこの関数を再度呼び出す通知が設定されていることがあります。関数の実行を停止するには、使用可能な同時実行数を 0 に設定することで、以降の呼び出しがすべてスロットリングされます。その後、再帰呼び出しの原因となったコードパスまたは設定エラーを特定します。Lambda は、一部の AWS サービスおよび SDK の再帰ループを自動的に検出して停止します。詳細については、「Lambda 再帰ループ検出を使用した無限ループの防止」を参照してください。

Lambda: プロビジョニングされた同時実行によるエイリアスルーティング

問題: エイリアスのルーティング中の、プロビジョニングされた同時実行の Spillover Invocations。

Lambda は、単純な確率モデルを使用して 2 つの関数バージョン間でトラフィックを分散します。低いトラフィックレベルでは、各バージョンで設定されたトラフィックの割合と実際の割合の間に大きな差異が生じる場合があります。関数がプロビジョニングされた同時実行を使用する場合、エイリアスルーティングがアクティブである間に、プロビジョニングされた同時実行インスタンスの数を高く設定することで、過剰呼び出しを防ぐことができます。

Lambda: プロビジョニングされた同時実行によるコールドスタートします

問題: プロビジョニングされた同時実行を有効した後に、コールドスタートが発生します。

関数での同時実行の数が、プロビジョニングされた同時実行の設定済みレベル以下の場合、コールドスタートは発生しないはずです。プロビジョニングされた同時実行が正常に動作しているかどうかを確認するには、次の手順を実行します。

  • 関数バージョンまたはエイリアスでプロビジョニングされた同時実行が有効になっていることを確認してください。

    注記

    プロビジョニング済み同時実行数は、未公開バージョンの関数 ($LATEST) では設定可能ではありません。

  • トリガーで正しい関数バージョンまたはエイリアスが呼び出されることを確認します。例えば、Amazon API Gateway を使用している場合は、API Gateway が、$LATEST ではなく、プロビジョニングされた同時実行で関数バージョンまたはエイリアスを呼び出すことを確認します。プロビジョニングされた同時実行が使用されていることを確認するには、ProvisionedConcurrencyInvocations Amazon CloudWatch メトリクスを確認します。ゼロ以外の値は、関数が初期化された実行環境で呼び出しを処理していることを示します。

  • ProvisionedConcurrencySpilloverInvocations CloudWatch メトリクスをチェックして、関数の同時実行がプロビジョニングされた同時実行の設定済みレベルを超えているかどうかを判別します。ゼロ以外の値は、プロビジョニングされたすべての同時実行が使用中であり、いくつかの呼び出しがコールドスタートで発生したことを示します。

  • 呼び出し頻度 (1 秒あたりのリクエスト数) をご確認ください。プロビジョニングされた同時実行を持つ関数の最大レートは、プロビジョニングされた同時実行ごとに 1 秒あたり 10 件のリクエストです。例えば、100 のプロビジョニングされた同時実行で設定された関数は、1 秒あたり 1,000 件のリクエストを処理できます。呼び出し速度が 1 秒あたり 1,000 件のリクエストを超えると、コールドスタートがいくつか発生する可能性があります。

Lambda: 新しいバージョンによるコールドスタート

問題: 関数の新しいバージョンのデプロイ中にコールドスタートが発生します。

関数エイリアスを更新すると、Lambda は、エイリアスで設定された重みに基づいて、プロビジョニングされた同時実行を新しいバージョンに自動的にシフトします。

エラー: KMSDisabledException: 使用されている KMS キーが無効になっているため、Lambda は環境変数を復号できませんでした。関数の KMS キー設定を確認してください。

このエラーは、AWS Key Management Service (AWS KMS) キーが無効になっている場合、またはキーの使用を Lambda に許可する付与が取り消された場合に発生します。許可がない場合は、別のキーを使用するように関数を設定します。その後、カスタムキーを再割り当てして許可を再作成します。

EFS: 関数は EFS ファイルシステムをマウントできませんでした

エラー: EFSMountFailureException: この関数は、アクセスポイント arn:aws:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd に EFS ファイルシステムをマウントできませんでした。

関数のファイルシステムへのマウントリクエストが拒否されました。関数のアクセス許可を確認し、そのファイルシステムとアクセスポイントが存在していて使用できる状態であることを確認します。

EFS: 関数は EFS ファイルシステムに接続できませんでした

エラー: EFSMountConnectivityException: この関数は、アクセスポイント arn:aws:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd で Amazon EFS ファイルポイントに接続できませんでした。ネットワーク設定を確認して、もう一度試してください。

関数は、NFS プロトコル (TCP ポート 2049) を使用して関数のファイルシステムへの接続を確立できませんでした。VPC のサブネットのセキュリティグループとルーティング設定を確認します。

関数の VPC 設定を更新した後にこれらのエラーが発生した場合は、ファイルシステムのアンマウントと再マウントを試してください。

EFS: タイムアウトのため、関数が EFS ファイルシステムをマウントできませんでした

エラー: EFSMountTimeoutException: この関数は、マウントのタイムアウトのため、アクセスポイント {arn:aws:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd} に EFS ファイルシステムをマウントできませんでした。

関数は、そのファイルシステムに接続できましたが、マウントオペレーションがタイムアウトしました。しばらくしてから再試行し、関数の同時実行数を制限して、ファイルシステムの負荷を軽減することを検討してください。

Lambda: Lambda は時間がかかり過ぎている IO プロセスを検出しました

EFSIOException: 時間がかかりすぎている IO プロセスを Lambda が検出したため、この関数インスタンスは停止されました。

以前の呼び出しがタイムアウトし、Lambda が関数ハンドラーを終了できませんでした。この問題は、接続されたファイルシステムがバーストクレジットを使い果たし、ベースラインスループットが不十分な場合に発生することがあります。スループットを高めるには、ファイルシステムのサイズを増やすか、プロビジョニングされたスループットを使用します。