メニュー
AWS Lambda
開発者ガイド

関数エラー (Python)

Lambda 関数で例外が発生した場合、AWS Lambda はエラーを認識して JSON に例外情報をシリアル化し、それを返します。次の例を考えます。

Copy
def always_failed_handler(event, context): raise Exception('I failed!')

この Lambda 関数を呼び出すと、例外が発生し、AWS Lambda が次のエラーメッセージを返します。

Copy
{ "errorMessage": "I failed!", "stackTrace": [ [ "/var/task/lambda_function.py", 3, "my_always_fails_handler", "raise Exception('I failed!')" ] ], "errorType": "Exception" }

スタックの stackTrace JSON 配列が要素をトレースするときに、スタックトレースが返されることに注意してください。

返されるエラー情報の取得方法は、関数呼び出し時にクライアントが指定する呼び出しタイプによって決まります。

  • クライアントが RequestResponse 呼び出しタイプ (同期実行です) を指定した場合、呼び出しを行ったクライアントに結果が返ります。

    たとえば、コンソールは常に RequestResponse 呼び出しタイプを使用するため、[Execution result] セクションに次のようなエラーが表示されます。

    同じ情報は、CloudWatch にも送信され、[Log output] セクションに同じログが表示されます。

  • クライアントが Event 呼び出しタイプ (非同期実行です) を指定した場合は、AWS Lambda は何も返しません。代わりに、CloudWatch Logs にエラー情報がログ記録されます。CloudWatch メトリクスでエラーメトリクスを確認することもできます。

イベントソースに応じて、AWS Lambda はエラーになった Lambda 関数を返す場合があります。たとえば、Kinesis がイベントソースである場合、AWS Lambda は Lambda 関数が成功するかストリームのレコードの有効期限が切れるまで、エラーになった呼び出しを再試行します。

前述の Python コードをテストするには (コンソール)

  1. コンソールで、hello-world 設計図を使用して Lambda 関数を作成します。[runtime] で、[Python 3.6] または [Python 2.7] を選択します。[Handler] の lambda_function.lambda_handler を lambda_function.always_failed_handler と置き換えます。これを行う手順については、 「ステップ 2.1: Hello World Lambda 関数を作成する」を参照してください。

  2. テンプレートコードをこのセクションで提供されたコードに置き換えます。

  3. Lambda コンソールが提供する [Hello World] という [Sample event template] を使用して Lambda 関数をテストします。

関数エラーの処理

カスタムエラー処理を作成して、Lambda 関数から直接例外をスローさせ、AWS Step Functions State Machine 内で直接処理 (再試行またはキャッチ) できます。詳細については、ステートマシンを使用したエラー条件の処理を参照してください。

CreateAccount ステートは、Lambda 関数を使用してお客様の詳細をデータベースに書き込むタスクと考えてください。

  • タスクが成功した場合は、アカウントが作成され、ようこそ E メールが送信されます。

  • 既に存在するユーザー名でアカウントを作成しようとすると、Lambda 関数はエラーを発生させ、ステートマシンによって別のユーザー名を使用してアカウント作成プロセスを再試行するように促されます。

次のコード例はそれを行う方法を示しています。Python のカスタムエラーは Exception クラスを拡張する必要があることに注意してください。

Copy
class AccountAlreadyExistsException(Exception): pass def create_account(event, context): raise AccountAlreadyExistsException('Account is in use!')

Catch ルールを使用してエラーをキャッチするように Step Functions を設定できます。Lambda は実行時にエラー名を例外のシンプルなクラス名に自動的に設定します。

Copy
{ "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:CreateAccount", "Next": "SendWelcomeEmail", "Catch": [ { "ErrorEquals": ["AccountAlreadyExistsException"], "Next": "SuggestAccountName" } ] }, … } }

実行時、AWS Step Functions はエラーをキャッチし、Next 移行に指定されているとおり SuggestAccountName 状態に移行します。

カスタムエラー処理によって、サーバーレスアプリケーションの作成がより簡単になります。この機能は、Lambda プログラミングモデル でサポートされているすべての言語に統合できるため、選択したプログラミング言語でアプリケーションを設計したり、作業途中で混用したり組み合わせたりできます。

AWS Step Functions および AWS Lambda を使用した独自のサーバーレスアプリケーション作成の詳細については、AWS Step Functions を参照してください。

このページの内容: