kakakakakku blog

Weekly Tech Blog: Keep Learning!

Lambda Managed Instances に入門できるパターン「AWS Lambda Hello World on AWS Lambda Managed Instances (Terraform)」

2025年11月にリリースされた「AWS Lambda Managed Instances」を使うと Amazon EC2 上で AWS Lambda 関数を実行できる.AWS Lambda の良さ(お手軽さ)を残しつつ,Amazon EC2 で実行することによってコールドスタートを解消できたり,GPU インスタンスを選択できたり,柔軟さのある選択肢になる.what's new には AWS Graviton4 などの最新世代のプロセッサや高帯域幅ネットワーキングオプションを利用できます。 とも書かれている👌

aws.amazon.com

docs.aws.amazon.com

最近 AWS Serverless Patterns Collection に Terraform 前提で AWS Lambda Managed Instances に入門できるパターン「AWS Lambda Hello World on AWS Lambda Managed Instances (Terraform)」が追加された.さっそく試してみた❗️

github.com

デプロイ

README に書いてある手順通りで問題なくデプロイできる👌

しかし 36 to add になっている通り,想像以上にリソース数が多かった.Amazon EC2 を起動するために VPC が必要で,さらに 3 AZ 構成で NAT Gateway も AZ ごとにデプロイする構成になっていた.あくまで個人的には AWS Lambda Managed Instances に入門するためのパターンとしてはガッツリ構成で重いな〜とは思った.試した後に消し忘れないように🗑️

$ terraform init

$ terraform plan
(中略)
Plan: 36 to add, 0 to change, 0 to destroy.

$ terraform apply

動作確認

さっそく AWS Lambda Managed Instances を試す.まずは README に書いてある aws lambda invoke コマンドで AWS Lambda 関数を実行する.

$ export AWS_REGION=us-east-1

$ aws lambda invoke \
  --function-name hello-world-managed-instances-tf:live \
  --payload file://events/hello-world.json \
  --cli-binary-format raw-in-base64-out \
  response.json
{
    "StatusCode": 200,
    "ExecutedVersion": "1"
}

すると Hello AWS Lambda on Lambda Managed Instances というレスポンスが返ってきた.AWS Lambda 関数の実装はイベントに指定したメッセージに Hello を付与してオウム返しをする簡単なものになっている👏

$ cat response.json | jq .
{
  "response": "Hello AWS Lambda on Lambda Managed Instances"
}

今度はイベントを hello-world.json ファイルから渡すのではなく標準入力から渡して AWS Lambda 関数を実行する.

$ echo '{"name":"Lambda Managed Instances"}' | aws lambda invoke \
  --function-name hello-world-managed-instances-tf:live \
  --payload file:///dev/stdin \
  --cli-binary-format raw-in-base64-out \
  custom-response.json
{
    "StatusCode": 200,
    "ExecutedVersion": "1"
}

するとまた同じようにイベントに指定したメッセージに Hello を付与したレスポンスが返ってきた👌

$ cat custom-response.json | jq .
{
  "response": "Hello Lambda Managed Instances"
}

とまぁここまでの動作確認だと普通に AWS Lambda 関数を実行しているだけで,AWS Lambda Managed Instances を使って Amazon EC2 上で実行されているという感覚はないと思う🥲 動作確認の次は Terraform でデプロイしたリソースを確認していく!

キャパシティプロバイダを確認する

AWS Lambda Managed Instances では新しくキャパシティプロバイダ (Capacity Provider) という設定が必要になる.キャパシティプロバイダには VPC 設定・インスタンス条件・スケーリング設定などを設定する.

docs.aws.amazon.com

$ aws lambda get-capacity-provider --capacity-provider-name $(terraform output -raw capacity_provider_name)
{
    "CapacityProvider": {
        "CapacityProviderArn": "arn:aws:lambda:us-east-1:000000000000:capacity-provider:lambda-capacity-provider-tf",
        "State": "Active",
        "VpcConfig": {
            "SubnetIds": [
                "subnet-00481e4aa1e0cf9b6",
                "subnet-01349eb05169192e1",
                "subnet-0dd16fe84335e4182"
            ],
            "SecurityGroupIds": [
                "sg-03c3191cc643797a2"
            ]
        },
        "PermissionsConfig": {
            "CapacityProviderOperatorRoleArn": "arn:aws:iam::000000000000:role/hello-world-managed-instances-tf-capacity-provider-role"
        },
        "InstanceRequirements": {
            "Architectures": [
                "arm64"
            ]
        },
        "CapacityProviderScalingConfig": {
            "ScalingMode": "Auto"
        },
        "LastModified": "2026-02-21T05:21:22.400Z"
    }
}

Amazon EC2 インスタンスを確認する

キャパシティプロバイダ経由で自動的に起動する Amazon EC2 インスタンスを確認する.今回は m8g.xlarge のインスタンスが3つ起動していた.

$ CAPACITY_PROVIDER_ARN=$(terraform output -raw capacity_provider_arn)
$ aws ec2 describe-instances \
  --filters "Name=tag:aws:lambda:capacity-provider,Values=$CAPACITY_PROVIDER_ARN" \
  --query 'Reservations[*].Instances[*].[InstanceId,InstanceType,State.Name,LaunchTime,SubnetId,PrivateIpAddress]' \
  --output table
---------------------------------------------------------------------------------------------------------------------------
|                                                    DescribeInstances                                                    |
+---------------------+-------------+----------+----------------------------+----------------------------+----------------+
|  i-035a166b1fa59c0a7|  m8g.xlarge |  running |  2026-02-21T05:21:58+00:00 |  subnet-0dd16fe84335e4182  |  10.0.119.70   |
|  i-0227e3232ea01b0ab|  m8g.xlarge |  running |  2026-02-21T05:21:58+00:00 |  subnet-01349eb05169192e1  |  10.0.166.226  |
|  i-050c137b5640ee1bb|  m8g.xlarge |  running |  2026-02-21T05:21:59+00:00 |  subnet-00481e4aa1e0cf9b6  |  10.0.137.160  |
+---------------------+-------------+----------+----------------------------+----------------------------+----------------+

ちなみに AWS Lambda Managed Instances で使えるインスタンスタイプの一覧は料金ページにあった💡(見つからなくて結構探した...😇)

aws.amazon.com

Amazon CloudWatch Logs を確認する

次に AWS Lambda 関数のログを確認すると initializationType の値が AWS Lambda Managed Instances になっていた.いくつかのログを抜粋して載せておく📝

platform.initStart

{
    "time": "2026-02-21T05:22:38.931Z",
    "type": "platform.initStart",
    "record": {
        "initializationType": "lambda-managed-instances",
        "phase": "init",
        "runtimeVersion": "python:3.13.mainlinev2.v3",
        "runtimeVersionArn": "arn:aws:lambda:us-east-1::runtime:15b6277d72513ff8127d4dd2d54a7ff6c0dd1340a8508cc2decb1ac9ba7c3441",
        "functionName": "hello-world-managed-instances-tf",
        "functionVersion": "1",
        "instanceId": "2026/02/21/hello-world-managed-instances-tf[1]c125de18cc6b4e578550d7372a1ce776",
        "instanceMaxMemory": 2147483648
    }
}

platform.initReport

{
    "time": "2026-02-21T05:22:38.973Z",
    "type": "platform.initReport",
    "record": {
        "initializationType": "lambda-managed-instances",
        "phase": "init",
        "status": "success",
        "metrics": {
            "durationMs": 41.91
        }
    }
}

platform.start

{
    "time": "2026-02-21T05:43:58.477Z",
    "type": "platform.start",
    "record": {
        "requestId": "3590dba7-b7ee-43ee-92f2-1566efe4e4b2",
        "functionArn": "arn:aws:lambda:us-east-1:000000000000:function:hello-world-managed-instances-tf:1",
        "version": "1"
    }
}

platform.report

{
    "time": "2026-02-21T05:43:58.479Z",
    "type": "platform.report",
    "record": {
        "requestId": "3590dba7-b7ee-43ee-92f2-1566efe4e4b2",
        "metrics": {
            "durationMs": 2.588
        },
        "spans": [
            {
                "name": "responseLatency",
                "start": "2026-02-21T05:43:58.478Z",
                "durationMs": 0.837
            },
            {
                "name": "responseDuration",
                "start": "2026-02-21T05:43:58.479Z",
                "durationMs": 0.078
            }
        ],
        "status": "success"
    }
}

追加検証: メモリサイズを減らしてみる

AWS Lambda Managed Instances ではメモリサイズの最低要件が 2 GB になっている.

docs.aws.amazon.com

意図的に 128 MB に変更して plan / apply を実行してみた.

   runtime          = "python3.13"
   architectures    = ["arm64"]
   description      = "Simple Hello World Lambda function on Managed Instances"
-  memory_size      = 2048
+  memory_size      = 128
   publish          = true

すると apply で Lambda Managed Instance functions must have memory size greater than or equal to 2048 というエラーが出ることを確認できた💡

╷
│ Error: updating Lambda Function (hello-world-managed-instances-tf) configuration: operation error Lambda: UpdateFunctionConfiguration, https response error StatusCode: 400, RequestID: f3d9ccb5-00d0-47cc-94fb-4d5c2e94e4e2, api error ValidationException: 'MemorySize' value failed to satisfy constraint: Lambda Managed Instance functions must have memory size greater than or equal to 2048
│ 
│   with aws_lambda_function.hello_world_function,
│   on main.tf line 412, in resource "aws_lambda_function" "hello_world_function":
│  412: resource "aws_lambda_function" "hello_world_function" {
│ 
╵

追加検証: インスタンスタイプを制限してみる

もともと m8g.xlarge のインスタンスが3つ起動されていた.キャパシティプロバイダの設定で許可するインスタンスタイプを制限できるため m8g.large のみを許可するようにしてみた.Terraform だと aws_lambda_capacity_providerallowed_instance_types で設定できる.

ちなみにキャパシティプロバイダの許可するインスタンスタイプは1度デプロイすると変更できないため新しく作り直した.

resource "aws_lambda_capacity_provider" "lambda_capacity_provider_2" {
  name = "lambda-capacity-provider-tf-2"
  
  vpc_config {
    subnet_ids         = [aws_subnet.private_subnet_1.id, aws_subnet.private_subnet_2.id, aws_subnet.private_subnet_3.id]
    security_group_ids = [aws_security_group.lambda_security_group.id]
  }

  instance_requirements {
    architectures = ["arm64"]
    allowed_instance_types = ["m8g.large"]
  }

  permissions_config {
    capacity_provider_operator_role_arn = aws_iam_role.capacity_provider_role.arn
  }

  tags = {
    Name        = "lambda-capacity-provider-tf-2"
    Environment = "demo"
  }
}

期待通りに AWS Lambda 関数に紐付くキャパシティプロバイダを変更できた.

少し待っていると m8g.large のインスタンスが4つ起動されていた.

まとめ

最近 AWS Serverless Patterns Collection に追加されたパターン「AWS Lambda Hello World on AWS Lambda Managed Instances (Terraform)」を試してみた❗️さらに気になるところは追加検証もしてみた.あくまで AWS Lambda Managed Instances の基本的なデプロイを体験するパターンなのでスケーリングなどは体験できず,別途試す必要がある.

github.com

ちなみに main.tf を読んでいたら不要なタグ実装があって削除するプルリクエストを出しておいた.同じパターンを CDK でデプロイする lambda-managed-instances-cdk もあるからそこからコピーされた系なのかなーと.

github.com

関連記事

aws.amazon.com

X ポスト