Lambda MicroVMs × Claude Platform on AWSでClaude Managed Agentsサンドボックスを起動してみた

Lambda MicroVMs × Claude Platform on AWSでClaude Managed Agentsサンドボックスを起動してみた

公式のサンプルをClaude Platform on AWS向けに微修正しつつ、Lambda MicroVMs上にClaude Managed Agentsのセルフホスト型サンドボックス環境を構築してみました。
2026.09.09

リテールアプリ共創部@大阪の岩田です。

2026年6月22日付けでローンチされたLambda MicroVMsですが、ユースケースの1つとしてコーディングアシスタントが紹介されています。

https://aws.amazon.com/about-aws/whats-new/2026/06/aws-lambda-microvms/

実際Lambda MicroVMsのドキュメントを見に行くと、ClaudeのManaged Agents向けのサンドボックス環境としてLambda MicroVMsを利用する仕組みが紹介されています。

Using Lambda MicroVMs as a sandbox for Claude Managed Agents - AWS Lambda

遅ればせながら、本ブログでLambda MicroVMs上にClaudeのManaged Agents向けのサンドボックス環境を構築するサンプルを試してみます。

アーキテクチャ概要

今回構築する環境は以下のようなアーキテクチャになります。

アーキテクチャ概要

※ 画像は https://github.com/aws-samples/sample-lambda-microvm-claude-managed-agents から引用

処理の流れは以下のようになります。

  • Claudeのコンソールからセッションを開始するとウェブフックでAPI GWにリクエストが飛ぶ
  • API GWからLambdaが起動、Lambdaはウェブフックの署名を検証し、問題なければMicroVMを起動する
  • 起動したMicroVM上のワーカーがワークキューに積まれたアイテムを取得・処理してレスポンスをAnthropicのコントロールプレーンに返却。全てのアイテムが処理できたらMicroVMを終了

こちらのプロジェクトはあくまでも最小限のサンプルとなっており、ワークキューから取得したアイテムの処理が完了するたびにMicroVMを終了する仕様になっています。そのため、Lambda MicroVMsのメリットである中断・再開可能という特性を活かしきれておらず、実際に業務で利用したい場合はさらなる作り込みが必要になります。

やってみる

それではさっそくやっていきましょう。以下のリポジトリで公式のサンプルが提供されているので、こちらを利用して環境構築していきます。

https://github.com/aws-samples/sample-lambda-microvm-claude-managed-agents

ただ、私が普段使いしているClaudeの環境に対しては管理者権限を持っていないため、Claude Platform on AWSを使って検証用の組織を作成し、その組織内で必要なリソースを作っていくことにします。Claude Platform on AWSを利用する場合は、各種APIの呼び出しにSIGv4の署名を利用する形になるため、上記リポジトリの内容を一部改変して利用していきます。

ソースコードの準備

基本は aws-samples/sample-lambda-microvm-claude-managed-agents のソースコードを利用しますが、Claude Platform on AWS向けに一部のコードを修正していきます。なお、今回ベースにしたのはコミットハッシュaff9237f387ec2c5debae0f08bba5c526fe6b9edのコードです。

オリジナルの実装はSSM ParameterStoreから環境キーを取得して利用するのですが、Claude Platform on AWSではSigV4の署名で各種のAPIが呼び出せるため、環境キーに関連するコードを削除します。

まずClaudeのWeb Hooksession.status_run_startedを処理してMicroVMを起動するLambda関数のコードを修正します。

src/functions/launcher.py
@@ -176,7 +176,6 @@ def _load_config() -> LauncherConfig:
     return LauncherConfig(
         environment_id=os.environ["ANTHROPIC_ENVIRONMENT_ID"],
         image_identifier=os.environ["MICROVM_IMAGE_IDENTIFIER"],
-        environment_key_param_name=os.environ["ENVIRONMENT_KEY_PARAM_NAME"],
         execution_role_arn=os.environ["MICROVM_EXECUTION_ROLE_ARN"],
         aws_region=region,
         signing_param_name=os.environ.get("SIGNING_PARAM_NAME"),

後ほど紹介するMicroVM側の実装に合わせて、MicroVM起動時のペイロードにワークスペースIDを含める修正も追加します。

src/functions/shared/payload.py
@@ -23,8 +23,8 @@ def build_run_hook_payload(event: WebhookEvent, cfg: LauncherConfig) -> str:
     """Build the run hook payload JSON string for a started session."""
     session: dict[str, Any] = {
         "ANTHROPIC_SESSION_ID": event.session_id,
+        "ANTHROPIC_WORKSPACE_ID": event.workspace_id,
         "ANTHROPIC_ENVIRONMENT_ID": cfg.environment_id,
-        "ENVIRONMENT_KEY_PARAM_NAME": cfg.environment_key_param_name,
         "AWS_REGION": cfg.aws_region,
     }
     if cfg.base_url is not None:
src/functions/shared/types.py
@@ -17,7 +17,6 @@ class LauncherConfig:

     environment_id: str
     image_identifier: str
-    environment_key_param_name: str
     execution_role_arn: str
     aws_region: str
     signing_param_name: Optional[str] = None
@@ -33,6 +32,7 @@ class WebhookEvent:
     event_id: str
     data_type: str
     session_id: str
+    workspace_id: str

     @classmethod
     def from_payload(cls, payload: dict[str, Any]) -> "WebhookEvent":
@@ -41,4 +41,5 @@ class WebhookEvent:
             event_id=payload.get("id", ""),
             data_type=data.get("type", ""),
             session_id=data.get("id", ""),
+            workspace_id=data.get("workspace_id", ""),
         )

これでMicroVM起動時のペイロードからENVIRONMENT_KEY_PARAM_NAMEが削除され、代わりにANTHROPIC_WORKSPACE_IDが渡されるようになります。

続いてMicroVMのベースイメージに追加するjsのコードを修正します。前述の通りClaude Platform on AWSの場合はSigV4の署名で各種APIの呼び出しが可能なので、それに合わせて不要コードの削除等を行います。

まずSDKを通常のAnthropicクライアントSDKからClaude Platform on AWS向けのSDKに変更します。

src/microvm-image/worker/package.json
@@ -9,7 +9,7 @@
   },
   "dependencies": {
     "@anthropic-ai/sdk": "^0.104.1",
-    "@aws-sdk/client-lambda-microvms": "^3.600.0",
-    "@aws-sdk/client-ssm": "^3.600.0"
+    "@anthropic-ai/aws-sdk": "^0.7.0",
+    "@aws-sdk/client-lambda-microvms": "^3.600.0"
   }
 }

続いてメインとなるMicroVM上のワーカー実装の修正です。
差分の全体は以下の通りです。

src/microvm-image/worker/worker.mjs
@@ -17,9 +17,8 @@
 //      the idle policy is only the fallback if the call can't be made.

 import http from "node:http";
-import { SSMClient, GetParameterCommand } from "@aws-sdk/client-ssm";
 import { LambdaMicrovmsClient, TerminateMicrovmCommand } from "@aws-sdk/client-lambda-microvms";
-import Anthropic from "@anthropic-ai/sdk";
+import Anthropic from "@anthropic-ai/aws-sdk";
 import { WorkPoller, EnvironmentWorker } from "@anthropic-ai/sdk/helpers/beta/environments";

 // Hook server config.
@@ -35,38 +34,24 @@ async function readBody(req) {
   return Buffer.concat(chunks).toString("utf-8");
 }

-async function fetchEnvironmentKey(parameterName, region) {
-  const client = new SSMClient({ region });
-  const result = await client.send(
-    new GetParameterCommand({ Name: parameterName, WithDecryption: true }),
-  );
-  const value = result.Parameter?.Value;
-  if (!value) {
-    throw new Error(`SSM parameter ${parameterName} has no value`);
-  }
-  return value;
-}
-
 // Handle exactly the session named in the dispatch.
 async function handleSession(dispatch) {
   const sessionId = dispatch.ANTHROPIC_SESSION_ID;
   const environmentId = dispatch.ANTHROPIC_ENVIRONMENT_ID;
-  const parameterName = dispatch.ENVIRONMENT_KEY_PARAM_NAME;
-  const region = dispatch.AWS_REGION;
-  const baseURL = dispatch.ANTHROPIC_BASE_URL || undefined;

-  const environmentKey = await fetchEnvironmentKey(parameterName, region);
-  const client = new Anthropic({ authToken: environmentKey, baseURL });
-  const worker = new EnvironmentWorker({ client, environmentId, environmentKey, workdir: "/workspace" });
+  const client = new Anthropic({
+    workspaceId: dispatch.ANTHROPIC_WORKSPACE_ID,
+  });
+  const worker = new EnvironmentWorker({ client, environmentId, workdir: "/workspace", environmentKey: 'dummy' });

   console.log(`worker: looking for work item for session ${sessionId}`);
   const poller = new WorkPoller({
     client,
     environmentId,
-    environmentKey,
     reclaimOlderThanMs: 2000,
     drain: true,
     autoStop: false,
+    environmentKey: 'dummy'
   });

   for await (const work of poller) {
@@ -74,7 +59,7 @@ async function handleSession(dispatch) {
       continue;
     }
     console.log(`worker: handling session ${sessionId} (work ${work.id})`);
-    await worker.handleItem({ workId: work.id, environmentId, sessionId, environmentKey });
+    await worker.handleItem({ workId: work.id, environmentId, sessionId });
     console.log(`worker: session ${sessionId} complete`);
     return;
   }   

@anthropic-ai/aws-sdkのクライアントクラスを利用する場合、ワークスペースIDが必須になるため、MicroVM起動時のペイロードで渡されたワークスペースIDをコンストラクタにセットするよう修正しています。また、コンストラクタに環境キーをセットする必要が無くなったので、SSMパラメータストアから環境キーを取得する処理も丸々削除しています。

import Anthropic from "@anthropic-ai/aws-sdk";
//...略
  const client = new Anthropic({
    workspaceId: dispatch.ANTHROPIC_WORKSPACE_ID,
  });

EnvironmentWorkerとWorkPollerのコンストラクタにはenvironmentKey: 'dummy'を渡すようにしています。

   const worker = new EnvironmentWorker({ client, environmentId, workdir: "/workspace", environmentKey: 'dummy' });

   console.log(`worker: looking for work item for session ${sessionId}`);
   const poller = new WorkPoller({
     client,
     environmentId,
     reclaimOlderThanMs: 2000,
     drain: true,
     autoStop: false,
     environmentKey: 'dummy'
   });

各種APIの呼び出しにはSigV4の署名を使うのでenvironmentKeyは不要なのですが、environmentKeyが設定されていないとSDKが内部的に呼び出すcopyClientForHelperでエラーになるため、ダミーの文字列を渡すことで回避しています。

anthropic-sdk-typescript/src/lib/helper-client.ts at ba14b1f4fdf2e840a7b32297965342a099f6201d · anthropics/anthropic-sdk-typescript · GitHub

最後にSAMテンプレートです。
こちらも修正箇所は環境キーに関連する記述の削除に加え、MicroVMの実行ロールからClaude Platform on AWSのAPIを呼び出すための権限を追加しています。

template.yaml
diff --git a/template.yaml b/template.yaml
@@ -26,15 +26,6 @@ Parameters:
     Default: claude-self-hosted-worker
     Description: Name of the built MicroVM image the launcher runs (resolved to a full ARN below).
 
-  EnvironmentKeyParamName:
-    Type: String
-    Default: /claude-microvm-sandbox/anthropic-environment-key
-    Description: >-
-      Name of the SSM Parameter Store SecureString holding the Anthropic
-      environment key. CloudFormation cannot create SecureString parameters, so
-      create this parameter out-of-band after deploy (see README) with
-      `aws ssm put-parameter --type SecureString`.
-
   SigningParamName:
     Type: String
     Default: /claude-microvm-sandbox/anthropic-webhook-signing-secret
@@ -67,9 +58,6 @@ Resources:
           # RunMicroVm requires the full image ARN, not a bare name. Build it
           # from the configured name + this account/region.
           MICROVM_IMAGE_IDENTIFIER: !Sub "arn:${AWS::Partition}:lambda:${AWS::Region}:${AWS::AccountId}:microvm-image:${MicroVmImageIdentifier}"
-          # Name of the SSM SecureString holding the environment key. Passed by
-          # *reference* (name only) into the MicroVM; the launcher never reads it.
-          ENVIRONMENT_KEY_PARAM_NAME: !Ref EnvironmentKeyParamName
           MICROVM_EXECUTION_ROLE_ARN: !GetAtt MicroVmExecutionRole.Arn
           # Webhook signature verification happens in-process (no API GW authorizer).
           SIGNING_PARAM_NAME: !Ref SigningParamName
@@ -370,24 +358,9 @@ Resources:
             Action:
               - "sts:AssumeRole"
               - "sts:TagSession"
+      ManagedPolicyArns:
+        - arn:aws:iam::aws:policy/AnthropicSelfHostedEnvironmentAccess
       Policies:
-        - PolicyName: read-environment-key
-          PolicyDocument:
-            Version: "2012-10-17"
-            Statement:
-              # Read only the environment-key SSM SecureString, scoped to its ARN.
-              - Effect: Allow
-                Action: "ssm:GetParameter"
-                Resource: !Sub "arn:${AWS::Partition}:ssm:${AWS::Region}:${AWS::AccountId}:parameter${EnvironmentKeyParamName}"
-              # kms:Decrypt for the SecureString KMS key, bounded to SSM and to
-              # this one parameter via the PARAMETER_ARN encryption context.
-              - Effect: Allow
-                Action: "kms:Decrypt"
-                Resource: "*"
-                Condition:
-                  StringEquals:
-                    kms:ViaService: !Sub "ssm.${AWS::Region}.amazonaws.com"
-                    kms:EncryptionContext:PARAMETER_ARN: !Sub "arn:${AWS::Partition}:ssm:${AWS::Region}:${AWS::AccountId}:parameter${EnvironmentKeyParamName}"
         - PolicyName: self-terminate
           PolicyDocument:
             Version: "2012-10-17"
@@ -412,6 +385,29 @@ Resources:
                 Resource:
                   - !Sub "arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/microvms/${ImageNamePrefix}*"
                   - !Sub "arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/microvms/${ImageNamePrefix}*:*"
+        - PolicyName: anthropic-inference-get-token
+          PolicyDocument:
+            Version: "2012-10-17"
+            Statement:
+              - Effect: Allow
+                Action:
+                  - "sts:GetWebIdentityToken"
+                Resource: "*"
+                Condition:
+                  ForAnyValue:StringEquals: 
+                    sts:IdentityTokenAudience:
+                      - "https://api.anthropic.com"
+                      - "https://platform.claude.com"
+                  StringEquals:
+                    aws:CalledViaLast: "aws-external-anthropic.amazonaws.com"
+        - PolicyName: anthropic-inference-tag-token
+          PolicyDocument:
+            Version: "2012-10-17"
+            Statement:
+              - Effect: Allow
+                Action:
+                  - "sts:TagGetWebIdentityToken"
+                Resource: "*"               
 
   # --- MicroVM image build prerequisites ----------------------------------
   # These support building the MicroVM image (a separate CLI step), not the
@@ -489,9 +485,6 @@ Outputs:
   MicroVmExecutionRoleArn:
     Description: Execution role the MicroVM assumes to read the environment key.
     Value: !GetAtt MicroVmExecutionRole.Arn
-  EnvironmentKeyParamName:
-    Description: Create this SSM SecureString parameter with the Anthropic environment key.
-    Value: !Ref EnvironmentKeyParamName
   SigningParamName:
     Description: Create this SSM SecureString parameter with the Anthropic webhook signing secret.
     Value: !Ref SigningParamName

組織側の準備

ソースコードが準備できたので、今度はClaude Platform上で作業していきます。
まずホスティングタイプにセルフホスト型を指定して「環境」を作成します。

環境の作成

「環境」が作成できたら後ほど利用するためにIDを控えておきましょう。
作成された環境

続いてエージェントを作成します。今回は特に凝ったことはしないので、空のテンプレートをもとに適当な設定で作成しています。

エージェントの作成

デプロイする

準備ができたのでCFnのスタックをデプロイして必要なリソースを一式作成していきます。以下のコマンドでSAM CLIからデプロイします。

sam build
sam deploy --guided --capabilities CAPABILITY_NAMED_IAM --parameter-overrides "AnthropicEnvironmentId=<作成した環境のID>"

対話形式でパラメータを聞かれるので入力していきます。基本はデフォルト値をそのまま利用していますが、後で実行するシェルスクリプトを楽にするためCFnのスタック名はclaude-microvm-sandboxとしています。

Configuring SAM deploy
======================

	Looking for config file [samconfig.toml] :  Not found

	Setting default arguments for 'sam deploy'
	=========================================
	Stack Name [sam-app]: claude-microvm-sandbox
	AWS Region [ap-northeast-1]: us-east-1
	Parameter ProjectName [claude-microvm-sandbox]:
	Parameter ImageNamePrefix [claude-self-hosted-worker]:
	Parameter AnthropicEnvironmentId [作成したEnvironmentのID]:
	Parameter MicroVmImageIdentifier [claude-self-hosted-worker]:
	Parameter SigningParamName [/claude-microvm-sandbox/anthropic-webhook-signing-secret]:
	#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
	Confirm changes before deploy [y/N]:
	#SAM needs permission to be able to create roles to connect to the resources in your template
	Allow SAM CLI IAM role creation [Y/n]:
	#Preserves the state of previously provisioned resources when an operation fails
	Disable rollback [y/N]:
	LauncherFunction has no authentication. Is this okay? [y/N]: y
	Save arguments to configuration file [Y/n]:
	SAM configuration file [samconfig.toml]:
	SAM configuration environment [default]:

デプロイできたらOutputsを確認しましょう。WebhookUrlにAPI GWのエンドポイントが出力されているのでこれを控えます。
CFnスタックのOutputs

ウェブフック関連の設定

再度Claude Platformに戻り、ウェブフックエンドポイントを作成します。
URLには先程控えたAPI GWのエンドポイントを、サブスクライブするイベントにはsession.status_run_startedを指定します。

ウェブフックの作成

作成が完了すると署名シークレットが発行されるので値を控えておきます。
発行されたウェブフックの署名シークレット

控えたシークレット値はSSM パラメータストアにSecureStringとして登録します。これまでの手順通りに構築していればパラメータ名は/claude-microvm-sandbox/anthropic-webhook-signing-secretです。
※パラメータ名はCFnスタックの出力 SigningParamName からも確認できます。

SSMパラメータストア

MicroVMのイメージを登録

MicroVMのイメージを作成するためシェルスクリプト./src/scripts/build-image.shを実行します。以下のように出力されればOKです。
※何度か検証を繰り返したので、MicroVMのイメージはバージョン5になっています。

Resolving artifact bucket and build role from stack 'claude-microvm-sandbox'...
Discovering a managed base image via list-managed-microvm-images...
Using base image: arn:aws:lambda:us-east-1:aws:microvm-image:al2023-1
Packaging /Users/iwata.tomoya/...略/sample-lambda-microvm-claude-managed-agents/src/microvm-image -> /var/folders/62/l795fhb51jgfcd1vlh1rp_sh0000gn/T/tmp.GpXZluwoFe/app.zip...
Uploading to s3://claude-microvm-sandbox-artifacts-<AWSアカウントID>-us-east-1/deployments/app-20260909-171336.zip...
upload: ../../../../../../../../var/folders/62/l795fhb51jgfcd1vlh1rp_sh0000gn/T/tmp.GpXZluwoFe/app.zip to s3://claude-microvm-sandbox-artifacts-<AWSアカウントID>-us-east-1/deployments/app-20260909-171336.zip
Checking for an existing MicroVM image named 'claude-self-hosted-worker'...
Found existing MicroVM image 'claude-self-hosted-worker' (arn:aws:lambda:us-east-1:<AWSアカウントID>:microvm-image:claude-self-hosted-worker). Updating...
{
    "imageArn": "arn:aws:lambda:us-east-1:<AWSアカウントID>:microvm-image:claude-self-hosted-worker",
    "name": "claude-self-hosted-worker",
    "state": "UPDATING",
    "latestActiveImageVersion": "4.0",
    "createdAt": "2026-09-08T18:46:41.129000+09:00",
    "baseImageArn": "arn:aws:lambda:us-east-1:aws:microvm-image:al2023-1",
    "baseImageVersion": "1.0",
    "buildRoleArn": "arn:aws:iam::<AWSアカウントID>:role/claude-microvm-sandbox-build-role",
    "codeArtifact": {
        "uri": "s3://claude-microvm-sandbox-artifacts-<AWSアカウントID>-us-east-1/deployments/app-20260909-171336.zip"
    },
    "egressNetworkConnectors": [
        "arn:aws:lambda:us-east-1:aws:network-connector:aws-network-connector:INTERNET_EGRESS"
    ],
    "resources": [
        {
            "minimumMemoryInMiB": 2048
        }
    ],
    "hooks": {
        "port": 9000,
        "microvmHooks": {
            "run": "ENABLED",
            "runTimeoutInSeconds": 5,
            "resume": "ENABLED",
            "resumeTimeoutInSeconds": 5,
            "suspend": "ENABLED",
            "suspendTimeoutInSeconds": 5,
            "terminate": "ENABLED",
            "terminateTimeoutInSeconds": 5
        },
        "microvmImageHooks": {
            "ready": "ENABLED",
            "readyTimeoutInSeconds": 300,
            "validate": "ENABLED",
            "validateTimeoutInSeconds": 300
        }
    },
    "updatedAt": "2026-09-09T17:13:51.618000+09:00",
    "imageVersion": "5.0"
}

Image build started. Monitor build logs in CloudWatch:
  /aws/lambda/microvms/claude-self-hosted-worker
The image transitions CREATING -> CREATED on success.

しばらく待つとMicroVMイメージのビルドが完了し、ステータスが成功に遷移するはずなので確認しておきましょう。

MicroVMイメージ

いざセッションを作成

準備ができたのでセッションを作成し、MicroVM上でBashツールを実行してみましょう!
まずはセッションを作成します。

セッションを作成

作成したセッション内でBashツールでuname -aとcat /proc/cmdlineを実行してと依頼してみました。

Bashツールの実行を依頼

しばらく待つとウェブフック処理用のLambdaにログが出力され、MicroVMが起動されました。

INIT_START Runtime Version: python:3.14.mainline.v63	Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:dcc254f24e53b310604e77daf69eb00ee324eb039af7bf7cbfca2e47540298d3
START RequestId: 39f830b5-998f-4077-aeee-f80a08530572 Version: $LATEST
{
    "level": "INFO",
    "location": "_launch_and_dispatch:117",
    "message": "launched microvm_id=microvm-df4bf75a-e323-330c-9ae4-ae1a78abc31d for session_id=sesn_01KfCoXmJhHmQMRH6rG2jnWZ",
    "timestamp": "2026-09-09 08:22:32,306+0000",
    "service": "claude-microvm-sandbox-launcher",
    "cold_start": true,
    "function_name": "claude-microvm-sandbox-launcher",
    "function_memory_size": "1024",
    "function_arn": "arn:aws:lambda:us-east-1:<AWSアカウントID>:function:claude-microvm-sandbox-launcher",
    "function_request_id": "39f830b5-998f-4077-aeee-f80a08530572",
    "xray_trace_id": "1-6aa11743-5010e21f4071f04450e2bd16"
}

END RequestId: 39f830b5-998f-4077-aeee-f80a08530572
REPORT RequestId: 39f830b5-998f-4077-aeee-f80a08530572	Duration: 1099.73 ms	Billed Duration: 4305 ms	Memory Size: 1024 MB	Max Memory Used: 170 MB	Init Duration: 3204.61 ms	
XRAY TraceId: 1-6aa11743-5010e21f4071f04450e2bd16	Sampled: true	

MicroVM側のログです。正常に起動してセッションを処理していることが分かります。

worker: looking for work item for session sesn_01KfCoXmJhHmQMRH6rG2jnWZ
(node:1) ExperimentalWarning: The Fetch API is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
worker: handling session sesn_01KfCoXmJhHmQMRH6rG2jnWZ (work sesn_01KfCoXmJhHmQMRH6rG2jnWZ)
worker: session sesn_01KfCoXmJhHmQMRH6rG2jnWZ complete
(node:1) Warning: NodeVersionSupportWarning: The AWS SDK for JavaScript (v3)
versions published after the first week of January 2027
will require node >=22. You are running node v18.12.1.

To continue receiving updates to AWS services, bug fixes,
and security updates please upgrade to node >=22.

More information can be found at: https://a.co/c895JFp
worker: requested termination of microvm microvm-df4bf75a-e323-330c-9ae4-ae1a78abc31d

ログに出力されていたMicroVMのIDをもとにマネコンを確認してみます。

MicroVMのステータス
正常に起動していたことが分かります。

Claudeプラットフォームの方に戻ると、先程のBashツールの呼び出しが正常に終了していました。

Bashツールの実行結果

uname -aの実行結果は以下の通りでした。

Linux localhost 6.1.166-24.303.amzn2023.aarch64 #1 SMP Wed Mar 25 10:39:29 UTC 2026 aarch64 aarch64 aarch64 GNU/Linux

/proc/cmdlineについては以下のようなコメントが返ってきました。

この起動パラメータから、軽量なマイクロVM(サンドボックス環境)のような構成であることが読み取れます。主な特徴として、

overlay_root=vdb + init=/sbin/overlay-init.sh:オーバーレイファイルシステムで起動
modules_disabled=1, kexec_load_disabled=1:カーネルモジュールロードやkexecが無効化されたセキュリティ強化構成
damon_reclaim.*:DAMON(Data Access MONitor)によるメモリリクレーム機能が有効
pci=off:PCIデバイスなし(最小構成のVM)

セキュリティやリソース管理を意識した、サンドボックス用の軽量VM環境と考えられます。

確かに当たっています!

参考までにセルフホスト型ではないクラウド型の環境で同様の指示をした結果は以下でした。

uname -aの実行結果はこちらです。

Linux vm 6.18.44-fc-v24 #1 SMP PREEMPT_DYNAMIC @0 x86_64 x86_64 x86_64 GNU/Linux

続いて cat /proc/cmdlineの実行結果です。

console=ttyS0 reboot=k panic=1 nomodule random.trust_cpu=1 ipv6.disable=1 swiotlb=noforce rdinit=/process_api -- --firecracker-init --addr 0.0.0.0:2024 --max-ws-buffer-size 32768 --block-local-connections --listen-vsock-port 2024 --log-vsock-port 5002

カーネル引数からFirecracker上で稼働しているのが分かって面白いですね。

Sonnetさんからも以下のようなコメントが得られました。

これから、このマシンは Firecracker マイクロVM(軽量仮想化技術)上で動作していることが分かります。カーネルバージョンは 6.18.44-fc-v24("fc" は Firecracker を示唆)、rdinit=/process_api で起動時に専用のプロセス管理プログラムが実行され、vsock経由でAPI(ポート2024)やログ(ポート5002)と通信する構成になっています。

おまけ~サンドボックス環境からAWSのリソースにアクセスしてみる~

せっかくLambda MicroVMs上でサンドボックス環境が起動できたので、IAMロールの恩恵が受けられることも確認してみました。

MicroVMイメージビルド用のDockerfileにAWS CLIのインストール処理を追加、SAMテンプレートも修正してMicroVM用のIAMロールにDynamoDBのスキャンの権限を追加した後にawscliでDynamoDBのテーブルclaude-microvm-sandbox-idempotencyをスキャンしてみてと依頼してみました。結果は以下の通り、無事にDynamoDBのテーブルにアクセスできていました。

MicroVM上のサンドボックス環境からDynamoDBのテーブルがスキャンできた様子

まとめ

Lambda MicroVMsとClaude Platform on AWSを使ってClaude Managed Agentsのサンドボックスを起動してみました。Anthropicが管理する環境を使う場合と比較すると、MicroVMに割り当てられたIAMロールが使えるというのはなかなか面白いポイントだと思います。アイデア次第ですが、色々とできることが多そうなので、選択肢として覚えておくと良いのではないでしょうか。

参考


Claudeならクラスメソッドにお任せください

クラスメソッドは、Anthropic社とリセラー契約を締結しています。各種製品ガイドから、業種別の活用法、フェーズごとのお悩み解決などサービス支援ページにまとめております。まずはご覧いただき、お気軽にご相談ください。

サービス詳細を見る

この記事をシェアする

AI白書

関連記事