Lambdaのライフサイクルついて学ぶ
概要
AWS Lambdaの起動から終了までのライフサイクル、およびその周辺について学ぶ
Lambdaとは
LambdaはNodeやPythonなどのコードを実行できる環境を提供してくれるサービス
サーバーを用意しなくて良いのでユーザーはビジネスロジックの開発に集中できるのが売り
図のLambda Serviceが何をするかを管理していて、Lambda APIを使用してコードの実行やログ出力などの操作を行っている
実行環境
LambdaからAPIを介して指示が来るのでそれを受けて処理を行う場所
関数の実行に必要なリソース管理を担っている
リソース管理
- 関数を実行するランタイム環境を用意
- ランタイム環境はAmazon Linuxベースのコンテナ
- NodeやPython、Javaなどの主要な言語毎に用意されている
- 各言語の最新のバージョンには追従していない(結構遅れて対応してくるイメージ)
- LambdaからランタイムAPIを使用して関数実行処理される
- 関数が使用できるメモリや最大実行時間などの設定
- 実行環境自体のライフサイクルをサポート
実行環境のライフサイクル
フェーズ | |
---|---|
INIT | 設定されたリソースをベースに実行環境を作成 or フリーズ解除 |
関数コードやLayerをS3からDLしてランタイムを初期化 関数のハンドラーの外部にあるコードの実行 |
|
INITも詳細には3つのサブフェーズ(拡張機能・ランタイム・関数のそれぞれの初期化)からなる | |
INVOKE | Lmabda関数のハンドラーの呼び出し。関数が実行され完了したら次の呼び出し準備に備える |
SHUTDOWN | Lambda関数が一定時間呼び出しされないとシャットダウン |
実行環境自体の削除 |
X-RayでもINIT、INVOKEの順番で動作することが確認できる
再利用
Black Belt P.87から抜粋
INVOKE後にコードの変更がない&時間がそれほど経過してない場合はLambda側でランタイムを再利用する
これによりランタイムの初期化をスキップできるのでパフォーマンス向上する(ウォームスタート)
コールドスタートとウォームスタートのイメージに関してはBlack Belt P.65-69を参照
プロビジョニング済み同時実行
負荷が急激上がったりすると、再利用だけではリクエストを捌けなくなるため実行環境を増やす
すると、コールドスタート処理が多発してレイテンシー増加となる
これを防ぐ方法としてプロビジョニング済みを事前に用意しておくオプションが存在する
プロビジョニング済みの中身としては、Lambda側で意図的に関数実行インスタンスを再利用できるように調整してくれる
具体的にはINIT処理を数時間毎に定期実行してくれている
デメリットとしては、リクエストが来ない時でも初期化処理を行うためコストに跳ね返ってくる
VPCアクセス
LambdaからVPC内のリソースにアクセスすることは多い(例えばVPC内のRDSに接続するなど)
その場合はIPアドレスをアタッチしないとRDSと通信できない
これを実現するために、INIT時にENI(Elastic Network Interface)を付与してくれている
以前はENIの紐付けに時間がかかり処理が遅い原因でしたが、今は事前に用意されたENIを利用してVPCへアクセスする形式へと改善されました
参考資料
-
AWS Lambda 関数の実行の仕組みを知ろう !
- わかりやすい動画付きなのが良い
Discussion