🍭

Lambdaのライフサイクルついて学ぶ

2021/09/23に公開

概要

AWS Lambdaの起動から終了までのライフサイクル、およびその周辺について学ぶ

Lambdaとは

LambdaはNodeやPythonなどのコードを実行できる環境を提供してくれるサービス
サーバーを用意しなくて良いのでユーザーはビジネスロジックの開発に集中できるのが売り
図のLambda Serviceが何をするかを管理していて、Lambda APIを使用してコードの実行やログ出力などの操作を行っている

AWS公式の出典より
lambfda service

実行環境

LambdaからAPIを介して指示が来るのでそれを受けて処理を行う場所
関数の実行に必要なリソース管理を担っている

リソース管理
  • 関数を実行するランタイム環境を用意
    • ランタイム環境はAmazon Linuxベースのコンテナ
    • NodeやPython、Javaなどの主要な言語毎に用意されている
    • 各言語の最新のバージョンには追従していない(結構遅れて対応してくるイメージ)
    • LambdaからランタイムAPIを使用して関数実行処理される
  • 関数が使用できるメモリや最大実行時間などの設定
  • 実行環境自体のライフサイクルをサポート
実行環境のライフサイクル

AWS公式の出典より
lambfda lifecycle
lambfda lifecycle

フェーズ
INIT 設定されたリソースをベースに実行環境を作成 or フリーズ解除
関数コードやLayerをS3からDLしてランタイムを初期化
関数のハンドラーの外部にあるコードの実行
INITも詳細には3つのサブフェーズ(拡張機能・ランタイム・関数のそれぞれの初期化)からなる
INVOKE Lmabda関数のハンドラーの呼び出し。関数が実行され完了したら次の呼び出し準備に備える
SHUTDOWN Lambda関数が一定時間呼び出しされないとシャットダウン
実行環境自体の削除

X-RayでもINIT、INVOKEの順番で動作することが確認できる

AWS公式の出典より
x-ray

再利用

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公式の出典より
VPC Lambda

参考資料

Discussion