Amazon Web Services ブログ
AWS Lambda関数の状態の追跡
本投稿は、AWS Lambda の Senior Developer Advocate, Chris Munns の寄稿によるものです。
AWS Lambda関数は、AWS Identity and Access Management(IAM)ロールやAmazon Virtual Private Cloud(Amazon VPC)、ネットワークインターフェイスなど、正常に実行するために他のAWSサービスのリソースを必要とすることがよくあります。関数を作成または更新すると、Lambdaはユーザーに代わって、関数の実行を可能にするのに必要なリソースをプロビジョニングします。ほとんどの場合、このプロセスは非常に高速で、関数を呼び出したり変更する準備はすぐにできます。ただし、この種のアクションで時間がかかってしまうこともあります。
リソースが作成または更新されているときの関数の現在の「状態」をより把握できるように、AWS LambdaのLambda APIアクションによって返される関数情報にいくつかの追加属性が含まれるようになりました。この変更は、関数の呼び出し方法やコードの実行には影響しません。
この投稿では、Lambda関数が到達する可能性のある多様な状態、それらに遷移する条件、およびLambdaサービスが関数をさまざまな状態に遷移させる方法について説明します。詳細については、AWS Lambdaのドキュメント、Lambda APIを使用した関数の状態のモニタリング をご覧ください。
Lambda関数の状態について
Lambda関数が通過する主なライフサイクルは2つあります。これは、Lambda関数が初めて作成されるのか、それともすでに存在し更新されるのかによって異なります。フローに入る前に、関数の状態について説明します。
Pending
Pendingは、すべての関数が作成されたときに通過する最初の状態です。Pending中にLambdaはリソースを作成または設定しようとします。関数はアクティブ状態のときにのみ呼び出すことができるため、関数を操作する呼び出しやその他のAPIアクションは失敗します。関数作成直後に関数の呼び出しや更新をするように構築された自動化処理は、関数がPendingからActiveに移行したかどうかを最初に確認するように実装する必要があります。
Active
関数の最初の作成中にリソースの構成またはプロビジョニングが完了した後、Activeになります。関数は、Active状態でのみ呼び出すことができます。
関数の更新中、状態はActiveに指定されたままですが、Activeな関数の更新の状態を表すLastUpdateStatusと呼ばれる別の属性があります。更新中、呼び出しは、更新操作が正常に完了するまで関数の以前のコードと設定内容にて実行され、更新完了後、新しいコードと設定が使用されます。
Failed
Failed状態は、リソースの設定またはプロビジョニングのいずれかが失敗したことを表す状態です。
Inactive
Lambdaサービスが設定されたリソースを回収するのに十分な時間アイドルになっている関数は、Inactive状態に移行します。Inactive状態の関数を呼び出すと、失敗し、それらのリソースが再作成されるまで関数はPending状態に設定されます。リソースの再作成に失敗した場合、関数はInactive状態に戻ります。
すべての状態について、StateReasonとStateReasonCodeの2つの属性が設定されています。どちらも問題のトラブルシューティングのために存在し、現在の状態に関する詳細情報を提供します。
LastUpdateStatusについて
InProgress
InProgress状態は、既存の関数で更新が行われていることを示します。関数がInProgress状態にある間、関数呼び出しは関数の以前のコードと設定にルーティングされます。
Successful
Successful 状態は、関数の更新が完了したことを示します。関数が更新されると、次の更新までこの状態がセットされたままになります。
Failed
Failed状態は、関数の更新が失敗したことを示します。変更は中止され、関数の以前のコードと設定がActive状態のままになり使用可能となります。
すべてのLastUpdateStatus値には、LastUpdateStatusReasonとLastUpdateStatusReasonCodeの2つの属性が設定されています。これらは、更新に関する問題のトラブルシューティングに役立ちます。
関数状態のライフサイクル
ある状態から別の状態への関数状態の遷移は、関数に対して実行されるアクションに完全に依存しています。関数の状態から状態に手動で移動する方法はありません。
すべての関数について、主要な状態のライフサイクルは次のようになります。
- 作成時に、関数はPending状態になります
- 必要なリソースが正常に作成されると、Active状態に移行します
- リソースまたは関数の作成が何らかの理由で失敗すると、Failed状態に移行します
- 関数が数週間アイドルのままの場合、Inactive状態になります
- Inactiveになった後の最初の呼び出しで、関数は再びPending状態に入ります
- 成功すると、状態が再びActiveに設定されます
- 失敗すると、状態がInactiveに戻ります
- Inactive状態の関数を正常に更新すると、状態が再びActive状態に戻ります
関数を更新する場合、ライフサイクルは次のようになります。
注:関数は、ActiveまたはInactive状態の場合にのみ更新できます。ActiveまたはInactive状態でない関数に対して発行された更新コマンドは、実行前に失敗します。
- 更新時に、関数のLastUpdateStatusがInProgressに設定されます
- 成功すると、LastUpdateStatusがSuccessfulに設定されます
- 失敗すると、LastUpdateStatusがFailedに設定されます
- Inactive状態な関数は、更新が成功した後、Active状態に戻ります。
関数の状態情報へのアクセス
最新のAWS SDKとAWS CLI (バージョン1.16.291以降)を使用して、関数の現在の状態をクエリできます。関数の状態をチェックするコードを簡単に記述できるようにするため、AWS SDKに新しいWaiters の仕組みを追加しました。Waitersは、AWSサービスに非同期操作がある場合に使用できる特定のAWS SDKの機能であり、サービスの状態または状態の変更をポーリングする必要がある場合にWaitersを使用すると、複雑なポーリングコードを記述する必要がなくなり、Lambda関数の状態を簡単に確認できます。これらの詳細については、各SDKのドキュメント(Python 、Node.js 、Java 、Ruby 、Go 、PHP )をご覧ください。
まとめ
関数状態のライフサイクルを活用する最初の機能は、AWS Lambda関数用に2019年9月3日(PST)に発表された「Lambda 関数が VPC 環境で改善されます 」です。この記事で述べたように、Lambdaサービスは関数がVPCに接続するために必要なENIを事前に作成します。これには、完了までに60〜90秒かかる場合があります。関数がPending状態にある間に必要なENIリソースを作成し、そのプロセスが完了した後にActive状態に移行するようになります。関数がActive状態になる前のタイミングで、関数を操作する呼び出しやその他のAPIアクションは失敗することに注意してください。この動作はVPC設定された関数にすでに展開済みとなっています。
「Lambda 関数が VPC 環境で改善されます」の更新履歴に記載のリージョンですでに展開済みです。2019年9月27日(PST)アジア太平洋(東京)の地域へ完全に展開しました。
翻訳はServerless Specialist Solutions Architect 下川 賢介(@_kensh) が担当しました。原文はこちらです。