View a markdown version of this page

AWS Lambda MicroVMs の主要な概念 - AWS Lambda

AWS Lambda MicroVMs の主要な概念

AWS Lambda MicroVMs は、ユーザーが作成および管理する複数のリソースタイプを使用します。このページでは、MicroVM でアプリケーションを構築する基盤 (各リソースタイプ、Lambda が MicroVM イメージをスナップショットに構築する方法、ランタイムを通して MicroVM が遷移するライフサイクル状態) について説明します。

主要なコンセプト

MicroVM

MicroVM は、単一のテナント、ユーザーセッション、またはジョブの分離コンピューティング環境を表すリソースです。各 MicroVM は、オペレーティングシステム機能を備えた Amazon Linux 2023 オペレーティングシステムを実行し、ほぼ瞬時に起動と再開を行います。MicroVM は、インバウンド HTTPS 接続を介してリクエストを受信します。アイドル時に一時停止できますが、メモリとディスクの状態は保持されます。トラフィックが戻ると、一時停止した MicroVM は再開します。

MicroVM イメージ

MicroVM イメージは、MicroVM のアプリケーション環境を定義するリソースです。イメージを作成すると、Lambda がイメージをほぼ瞬時の起動を可能にするスナップショットにビルドします (以下の Lambda がイメージを構築する方法 を参照)。

MicroVM イメージを作成するには、Dockerfile とアプリケーションアーティファクトを含む zip パッケージを Amazon S3 にアップロードします。Lambda が公開したマネージドベースイメージを基盤として使用する必要があります (base-image-arn パラメータで指定します)。Dockerfile は、Lambda がマネージドベースの上に構築するアプリケーションレイヤーを定義します。

MicroVM イメージはバージョニングされます。各バージョンは、特定のコードアーティファクトとベースイメージから生成された単一のビルドを表します。バージョンはビルド状態を通して遷移します (PENDINGIN_PROGRESSSUCCESSFUL または FAILED)。成功したバージョンは ACTIVE または INACTIVE に設定できます。イメージの状態と管理の詳細については、「MicroVM イメージ」を参照してください。

ネットワークコネクタ

ネットワークコネクタは、トラフィックが MicroVM に到達する方法と MicroVM が外部サービスに到達する方法を制御するリソースです。実行時に MicroVM にコネクタを関連付けて、インバウンドアクセスとアウトバウンドアクセスを個別に設定します。

ビルドタイムコネクタとランタイムコネクタは異なる場合があります。その場合、MicroVM はイメージビルド時とランタイム時に異なる環境に到達できます。

インバウンドポートアクセス (JWE 認証を使用)、シェルアクセス、パブリックインターネット出力には、Lambda が提供するデフォルトを使用します。独自のネットワークコネクタを作成して、VPC 経由でアウトバウンドトラフィックをルーティングします。

Lambda がイメージを構築する方法

MicroVM イメージを作成または更新すると、Lambda は Firecracker スナップショットを作成するビルドプロセスを実行します。このスナップショットは、アプリケーションの完全に初期化された状態をキャプチャし、アプリケーションから実行される MicroVM のほぼ即時の起動と再開を可能にします。

ビルドプロセス:

  1. Lambda は、ユーザーが指定したマネージドベースイメージを使用して新しい MicroVM をプロビジョニングします。

  2. Lambda は、依存関係をインストールして環境を設定する Dockerfile 命令を実行します。

  3. Lambda は、ENTRYPOINT コマンドまたは CMD コマンドを使用してアプリケーションを起動します。

  4. /ready フックを有効にした場合、Lambda はアプリケーションが準備状況 (HTTP 200) を通知するのを待機します。

  5. Lambda は、実行中のすべてのプロセスを含むディスクとメモリ状態のスナップショットをキャプチャします。

MicroVM を実行すると、Lambda は、このスナップショットから MicroVM を復元します。アプリケーションは、起動を繰り返すことなく、事前に初期化された状態から再開します。

ビルド中にアプリケーションが一意のコンテンツ (一意の ID、シークレット、ネットワーク接続など) を生成する場合、そのコンテンツは同じイメージバージョンから実行されるすべての MicroVM 間で共有されます。これを回避するには、MicroVM が /run ライフサイクルフックの使用を開始した後に一意のコンテンツを生成します。詳細については、「MicroVM イメージ」のスナップショットの互換性に関するセクションを参照してください。

MicroVM のライフサイクル

実行時、MicroVM は以下のステージを遷移します。

  1. 実行run-microvm を呼び出すことができます。Lambda は、イメージスナップショットから MicroVM を復元し、一意の ID を割り当ててエンドポイントを作成します。MicroVM は PENDING から RUNNING に遷移します。

  2. 実行中 – アプリケーションはエンドポイント URL を介してリクエストを受信して処理します。

  3. 一時停止 — 設定可能なアイドル期間の後 (または suspend-microvm API 経由での指示の後)、MicroVM は SUSPENDING から SUSPENDED に遷移します。メモリとディスクの状態は保持されます。

  4. 再開 – MicroVM は、トラフィックが到着したとき (autoResumeEnabled=true の場合) またはユーザーが resume-microvm を呼び出したときに SUSPENDED から RUNNING に直接遷移移行します。

  5. 終了 – ユーザーが terminate-microvm を呼び出したとき、または最大期間を超えたとき、MicroVM は TERMINATING から TERMINATED に遷移します。

状態

各 MicroVM の状態の説明を次の表に示します。これらの状態により、信頼性の高いアプリケーションの構築と適切なエラー処理の実装が可能になります。

状態 説明
PENDING MicroVM のプロビジョニング処理が行われています。リソースの割り当て処理が行われ、スナップショットがロードされています。
RUNNING MicroVM はアクティブで、エンドポイント URL を介してトラフィックを受け入れています。/run フックが完了しました。
SUSPENDING MicroVM は一時停止中です。/suspend フックが実行中です。ディスクとメモリのチェックポイントが作成されています。
SUSPENDED MicroVM は一時停止されています。状態は保持されます。コンピューティング料金は発生しません。再開または終了できます。
TERMINATING MicroVM は終了処理中です。/terminate フックは実行中です。リソースの解放処理が行われています。
TERMINATED MicroVM が終了しました。これは終了状態です。MicroVM を再開または再起動することはできません。

ステータスの遷移

MicroVM 状態間の有効な遷移と各遷移のトリガーを次の表に示します。

[Initial state] (初期状態) 遷移先の状態 Trigger トリガー)
PENDING RUNNING プロビジョニングが完了し、/run フックが成功する。
RUNNING SUSPENDING アイドル時間を超過する、明示的な suspend-microvm API コール。
SUSPENDING SUSPENDED /suspend フックが完了し、メモリとディスクの状態がチェックポイントされる。
SUSPENDED RUNNING トラフィックの到着 (autoResumeEnabled=true) または明示的な resume-microvm API コール。
RUNNING TERMINATING 明示的な terminate-microvm API コール、または maximumDurationInSeconds の超過。
SUSPENDED TERMINATING suspendedDurationSeconds の超過、または明示的な terminate-microvm API コール。
TERMINATING TERMINATED /terminate フックが完了し、すべてのリソースが解放される。
重要

/run フックが失敗するかタイムアウトした場合、MicroVM は RUNNING に遷移することなく TERMINATING に直接遷移することがあります。エラー表示なしでの失敗を回避するには、フックにタイムアウトとエラー処理を実装します。