最初の Lambda MicroVM を作成する
このチュートリアルでは、AWS Lambda MicroVM イメージを作成し、そのイメージから MicroVM を実行する方法について説明します。最終的には、HTTPS 経由でアクセスできるアプリケーションを実行します。
前提条件
開始する前に 2 つのものが必要です。
-
アプリケーションアーティファクト(ステップ 2 で作成する zip ファイル) を保存する任意の AWS リージョンの Amazon S3 バケット。
-
イメージの作成中に Lambda が引き受ける IAM ビルドロール。Lambda は、このロールを使用して Amazon S3 からコードアーティファクトをダウンロードし、ビルドログを CloudWatch に書き込みます。
次の信頼ポリシーで IAM ロールを作成します。これにより Lambda サービスがロールを引き受けられるようになります。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": ["sts:AssumeRole", "sts:TagSession"] }] }
次のアクセス許可ポリシーをロールにアタッチします。<your-bucket-name> は実際の Amazon S3 バケットの名前に置き換えてください。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::<your-bucket-name>/*" }, { "Effect": "Allow", "Action": ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"], "Resource": "arn:aws:logs:*:*:*" } ] }
注記
Dockerfile がプライベート AWS ECR リポジトリからプルする場合は、ecr:GetAuthorizationToken と ecr:BatchGetImage もアクセス許可ポリシーに追加します。
最初の MicroVM イメージを作成する
MicroVM イメージは、完全に初期化された状態でアプリケーションをキャプチャします。このイメージから MicroVM を実行すると、アプリケーションは直ちに起動するので、ブートや初期化の遅延はありません。
ステップ 1: アプリケーションと Dockerfile を記述する
MicroVM 内で実行するシンプルな HTTP サーバーを作成します。この例では、外部依存関係のない Node.js を使用します。
app.js
// Minimal HTTP server — listens on port 8080 const http = require('http'); const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ status: 'ok', path: req.url })); }); server.listen(8080, () => { console.log('Listening on port 8080'); });
次に、アプリケーションをパッケージ化して起動する Dockerfile を作成します。
Dockerfile
# Use a lightweight Node.js runtime for your application layers FROM node:24-alpine # Set the working directory inside the container WORKDIR /app # Copy your application code COPY app.js . # Declare the port your app listens on EXPOSE 8080 # Start the application — Lambda snapshots the running state CMD ["node", "app.js"]
注記
FROM 命令は、アプリケーションレイヤーのコンテナイメージを設定します。互換性のある任意のコンテナイメージを使用できます。Lambda マネージドベースイメージ (MicroVM オペレーティングシステムとサービスコンポーネントを提供) は、ステップ 3 で --base-image-arn を使用して別途指定します。
アプリケーションが一意の値 (ID、シークレット、または暗号化マテリアル) を生成する場合は、言語の標準の暗号的に安全な擬似乱数生成器 (CSPRNG) ライブラリを使用して、すべての MicroVM にわたって一意になるようにします。アプリケーションが OpenSSL を使用する場合は、スナップショット互換バージョンを含む Lambda ベースコンテナイメージを使用します。詳細については、「MicroVM イメージ」のスナップショットの互換性に関するセクションを参照してください。
ステップ 2: パッケージ化して Amazon S3 にアップロードする
app.js と Dockerfile を zip アーカイブにパッケージ化して Amazon S3 バケットにアップロードします。ターミナルで以下のコマンドを実行します。
zip app.zip app.js Dockerfile aws s3 cp app.zip s3://your-bucket-name/app.zip
ステップ 3: MicroVM イメージを作成する
create-microvm-image を呼び出してビルドを開始します。Lambda が Amazon S3 から zip をダウンロードし、Dockerfile を実行してアプリケーションを起動し、完全に初期化された状態の Firecracker スナップショットをキャプチャします。
aws lambda-microvms create-microvm-image \ --name my-first-microvm-image \ --code-artifact uri=s3://your-bucket-name/app.zip \ --base-image-arn arn:aws:lambda:us-east-1:aws:microvm-image:al2023-1 \ --build-role-arn arn:aws:iam::123456789012:role/MicrovmBuildRole
イメージは CREATING 状態で開始します。次の方法でビルドステータスを確認します。
aws lambda-microvms get-microvm-image \ --image-identifier my-first-microvm-image
ビルドが完了すると、state フィールドが CREATED に変わります。
{ "imageName": "my-first-microvm-image", "imageArn": "arn:aws:lambda:us-east-1:123456789012:microvm-image:my-first-microvm-image", "state": "CREATED", "imageVersion": "1.0", ... }
状態が CREATE_FAILED の場合、CloudWatch で /aws/lambda/microvms/my-first-microvm-image のビルドログを確認します。
最初の MicroVM を実行する
MicroVM イメージが CREATED 状態になったら MicroVM を実行できます。各イメージは、複数の MicroVM (テナント、ユーザーセッション、またはジョブあたり 1 つずつ) を起動できます。
次のコマンドで MicroVM を実行します。
aws lambda-microvms run-microvm \ --image-identifier my-first-microvm-image \ --ingress-network-connectors "arn:aws:lambda:us-east-1:aws:network-connector:aws-network-connector:ALL_INGRESS" \ --egress-network-connectors "arn:aws:lambda:us-east-1:aws:network-connector:aws-network-connector:INTERNET_EGRESS" \ --idle-policy '{"autoResumeEnabled":true,"maxIdleDurationSeconds":900,"suspendedDurationSeconds":300}'
パラメータの説明:
-
--ingress-network-connectors– すべてのポートで MicroVM へのインバウンド HTTPS トラフィックを有効にします。これは Lambda マネージドコネクタです。 -
--egress-network-connectors– MicroVM からのアウトバウンドインターネットアクセスを有効にします。これは Lambda マネージドコネクタです。 -
--idle-policy– 自動一時停止/再開動作を設定します。このポリシーでは、非アクティブ状態が 15 分続くと MicroVM は一時停止します。MicroVM は最大 5 分間一時停止しますが、トラフィックが到着すると自動的に再開します。
レスポンスには、MicroVM ID とエンドポイント URL が含まれます。
{ "microvmId": "mvm-01234567-abcd-ef01-2345-6789abcdef01", "state": "PENDING", "endpoint": "mvm-01234567-abcd-ef01-2345-6789abcdef01.lambda-microvm.us-east-1.on.aws", ... }
セッションが RUNNING になるまで待機します。
aws lambda-microvms get-microvm \ --microvm-identifier mvm-01234567-abcd-ef01-2345-6789abcdef01
MicroVM に接続する
MicroVM エンドポイントへのすべてのリクエストには、認証トークンが必要です。次のコマンドを使用して認証トークンを生成します。
aws lambda-microvms create-microvm-auth-token \ --microvm-identifier mvm-01234567-abcd-ef01-2345-6789abcdef01 \ --expiration-in-minutes 30 \ --allowed-ports '[{"allPorts":{}}]'
レスポンスでは、authToken フィールドにトークンが含まれます。これを使用して、実行中のアプリケーションにリクエストを送信します。
curl https://mvm-01234567-abcd-ef01-2345-6789abcdef01.lambda-microvm.us-east-1.on.aws/ \ -H "X-aws-proxy-auth:<token-value>"
アプリケーションからのレスポンスがあることを確認します。
{"status":"ok","path":"/"}
MicroVM は実行中でトラフィックを処理しています。ステップ 1 で記述したアプリケーションは、エンドポイント URL でライブになります。
クリーンアップ
継続的な課金を回避するために、完了した MicroVM を終了します。
aws lambda-microvms terminate-microvm \ --microvm-identifier mvm-01234567-abcd-ef01-2345-6789abcdef01
次のステップ
-
重要な概念の詳細を確認して、スナップショットプロセス、ライフサイクル状態、ベースイメージについて理解します。
-
「MicroVM イメージ」を参照して、イメージビルドフック、バージョニング、スナップショットの互換性について学習します。
-
「MicroVM の実行」を参照して、SDK の例、ライフサイクルフック、スケーリング戦略を確認します。