Python の AWS Lambda 関数エラー - AWS Lambda

Python の AWS Lambda 関数エラー

注記

Python 2.7 ランタイムのサポートは、2021 年 7 月 15 日で終了します。詳細については、「ランタイムの非推奨化に関するポリシー」を参照してください。

コードが原因でエラーが発生すると、Lambda によって、エラーの JSON 表現が生成されます。このエラードキュメントは、呼び出しログ (同期呼び出しの場合は出力) で確認できます。

このページでは、Lambda コンソールおよび AWS CLI を使用して Python ランタイムの Lambda 関数の呼び出しエラーを表示する方法について説明します。

仕組み

Lambda 関数を呼び出すと、Lambda は呼び出しリクエストを受け取り、実行ロールのアクセス許可を検証し、イベントドキュメントが有効な JSON ドキュメントであることを確認し、パラメータ値をチェックします。

リクエストが検証に合格した場合、Lambda は関数インスタンスにリクエストを送信します。Lambda ランタイム環境は、イベントドキュメントをオブジェクトに変換して、関数ハンドラーに渡します。

Lambda がエラーを検出した場合、例外のタイプ、メッセージ、およびエラーの原因を示す HTTP ステータスコードを返します。Lambda 関数を呼び出したクライアントまたはサービスは、エラーを処理するか、エラーをエンドユーザーに渡すことができます。正しいエラー処理動作は、アプリケーションの種類、対象ユーザー、エラーの原因によって異なります。

次の一覧は、Lambda から受信できるステータスコードの範囲を示したものです。

2xx

応答に X-Amz-Function-Error ヘッダーのある 2xx 番台のエラーは、Lambda ランタイムまたは関数エラーを示します。2xx シリーズステータスコードは、Lambda がリクエストを受け入れたことを示しますが、エラーコードの代わりに、Lambda は、レスポンスに X-Amz-Function-Error ヘッダーを含めることでエラーを示します。

4xx

4xx一連のエラーは、呼び出し元のクライアントまたはサービスが、要求を変更したり、許可を要求したり、要求を再試行したりすることによって修正できるエラーを示します。4xx以外の一連のエラーは、429 通常、リクエストのエラーを示します。

5xx

5xx シリーズエラーは、Lambda の問題、または関数の構成やリソースの問題を示します。5xx シリーズエラーは、ユーザーの操作なしで解決できる一時的な状態を示す場合があります。これらの問題は、呼び出し側のクライアントやサービスでは対処できませんが、Lambda 関数の所有者によって問題を解決できる場合があります。

呼び出しエラーの詳細な一覧については、「InvokeFunction エラー」を参照してください。

Lambda コンソールの使用

テストイベントを設定し、出力を表示することで、Lambda コンソールで関数を呼び出すことができます。出力は関数の実行ログにも記録され、トレースが有効になっている場合は AWS X-Ray にも記録されます。

Lambda コンソールで関数を呼び出すには

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

  2. テストする関数を選択し、[Test] (テスト) を選択します。

  3. [Test event] (テストイベント) で、[New event] (新しいイベント) を選択します。

  4. テンプレートを選択します。

  5. [Name] (名前) にテストの名前を入力します。テキスト入力ボックスに、JSON テストイベントを入力します。

  6. [Save changes] (変更の保存) をクリックします。

  7. [Test] (テスト) を選択します。

Lambda コンソールで、関数が同期的に呼び出され、結果が表示されます。レスポンス、ログ、その他の情報を表示するには、[Details (詳細)] セクションを展開します。

AWS Command Line Interface (AWS CLI) を使用する

AWS CLI は、コマンドラインシェルでコマンドを使用して AWS サービスとやり取りするためのオープンソースツールです。このセクションの手順を完了するには、以下が必要です。

AWS CLI で Lambda 関数を呼び出すと、AWS CLI はレスポンスを 2 つのドキュメントに分割します。AWS CLIのレスポンスがコマンドプロンプトに表示されます。エラーが発生した場合は、レスポンスにはFunctionErrorフィールドが含まれます。関数によって返されたレスポンスまたはエラーは、出力ファイルに書き込まれます。例えば、output.jsonoutput.txt などです。

次の 読み出し コマンドの例は、関数を呼び出し、 呼び出し応答をoutput.txtファイルに書き込む方法を示しています。

aws lambda invoke \ --function-name my-function \ --cli-binary-format raw-in-base64-out \ --payload '{"key1": "value1", "key2": "value2", "key3": "value3"}' output.txt

AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。このオプションは、AWS CLI 設定ファイルで設定することもできます。

コマンドプロンプトにAWS CLIレスポンスが表示されるはずです:

{ "StatusCode": 200, "FunctionError": "Unhandled", "ExecutedVersion": "$LATEST" }

output.txtファイル内に関数呼び出しレスポンスが表示されるはずです。同じコマンドプロンプトで、次のコマンドを使用してコマンドプロンプトに出力を表示することもできます。

cat output.txt

コマンドプロンプトに呼び出し応答が表示されます。

{"errorMessage": "'action'", "errorType": "KeyError", "stackTrace": [" File \"/var/task/lambda_function.py\", line 36, in lambda_handler\n result = ACTIONS[event['action']](event['number'])\n"]}

また、Lambda は、関数のログに最大 256 KB のエラーオブジェクトを記録します。詳細については、「Python の AWS Lambda 関数ログ作成」を参照してください。

他の AWS サービスでのエラー処理

別の AWS のサービスが関数を呼び出すと、サービスは呼び出しの種類と再試行動作を選択します。AWS のサービスは、スケジュールに従って、リソースのライフサイクルイベントに応答して、またはユーザーからのリクエストを処理するために、関数を呼び出すことができます。サービスによっては、関数を非同期に呼び出し、Lambda でエラーを処理する場合もあれば、再試行するか、ユーザーにエラーを返す場合もあります。

例えば、API Gateway はすべての呼び出しエラーと関数エラーを内部エラーとして扱います。Lambda API が呼び出しリクエストを拒否した場合、API Gateway は 500 エラーコードを返します。関数が実行されてもエラーが返された場合、または誤った形式でレスポンスが返された場合、API Gateway は 502 エラーコードを返します。エラーレスポンスをカスタマイズするには、コードでエラーをキャッチし、レスポンスを必要な形式に加工する必要があります。

エラーの発生元とその原因を特定するには、AWS X-Ray を使用することをお勧めします。X-Ray を使用すると、エラーが発生したコンポーネントを特定し、そのエラーの詳細を確認することができます。次の例は、API Gateway から 502 応答が返された関数エラーを示しています。


          API Gateway での関数エラーのトレースマップ。

詳細については、「AWS Lambda での Python コードの作成」を参照してください。

エラーの例

次のセクションでは、Python を使用して関数を作成、更新、または呼び出すときに発生する可能性のある一般的なエラーを示します Lambda ランタイム

例 ランタイムの例外 - ImportError

{ "errorMessage": "Unable to import module 'lambda_function': Cannot import name '_imaging' from 'PIL' (/var/task/PIL/__init__.py)", "errorType": "Runtime.ImportModuleError" }

このエラーは、AWS Command Line Interface (AWS CLI) を使用して C または C++ ライブラリを含むデプロイパッケージをアップロードした結果です。たとえば、Pillow (PIL)numpy、または pandas ライブラリなどです。

デプロイパッケージを作成するには、AWS SAM オプションで --use-container CLI sam build コマンドを使用することをお勧めします。このオプションで AWS SAM CLI を使用すると、Lambda と互換性のある Lambda のような環境を持つ Docker コンテナを作成できます。

例 JSON シリアル化エラー - Runtime.MarshalError

{ "errorMessage": "Unable to marshal response: Object of type AttributeError is not JSON serializable", "errorType": "Runtime.MarshalError" }

このエラーは、関数コードで使用している base64 エンコードのメカニズムの結果である可能性があります。以下に例を示します。

import base64 encrypted_data = base64.b64encode(payload_enc).decode("utf-8")

このエラーは、関数を作成または更新したときに、.zip ファイルをバイナリファイルとして指定しなかった場合にも発生します。デプロイパッケージ (.zip ファイル) をアップロードするには、fileb:// コマンドオプションを使用することをお勧めします。

aws lambda create-function --function-name my-function --zip-file fileb://my-deployment-package.zip --handler lambda_function.lambda_handler --runtime python3.8 --role arn:aws:iam::your-account-id:role/lambda-ex

サンプルアプリケーション

このガイドの GitHub リポジトリには、エラーの使用方法を示すサンプルアプリケーションが含まれています。各サンプルアプリケーションには、簡易のデプロイとクリーンアップ用のスクリプト、AWS Serverless Application Model (AWS SAM) テンプレート、サポートリソースが含まれています。

Python のサンプル Lambda アプリケーション

  • blank-python - ログ記録、環境変数、AWS X-Ray トレース、レイヤー、単位テスト、AWS SDK の使用を示す Python 関数。

次のステップ