AWS Lambda Managed Instances を API Gateway の Lambda プロキシ統合で実行してみた

AWS Lambda Managed Instances を API Gateway の Lambda プロキシ統合で実行してみた

2025.12.30

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS Lambda Managed Instances (LMI) は、従来の Lambda と同等のイベントソース統合をサポートしています。関数が Capacity Provider 上で稼働するという大きな違いがある一方で、従来の開発体験を維持できるのは嬉しいポイントです。

AWS re:Invent 2025 - Lambda Managed Instances: EC2 Power with Serverless Simplicity (CNS382) より

そこで今回は、AWS Lambda Managed Instances を API Gateway の Lambda プロキシ統合でイベント実行する構成を試してみました。サーバーレスパターンで Web API を実装する際によく用いられる構成ではあるので、念の為に動かしてみた次第です。

やってみた

Lambda ハンドラー

Lambda ハンドラー関数の実装については下記を踏襲して Serverless Express で API バックエンドを実装します。

https://dev.classmethod.jp/articles/serverless-express-v5-nodejs24-on-lambda/

使用するバージョン体系は以下の通りです。

  • Node.js 24
  • Express v5
  • Serverless Express v5 (beta)

ハンドラーコードは以下の通りとなります。

src/handler.ts
import serverlessExpress from "@codegenie/serverless-express";
import express, { Request, Response } from "express";

const app = express();

app.get("/hello", async (_: Request, res: Response): Promise<void> => {
  res.status(200).send({ message: "Hello, world!" });
});

export const handler = serverlessExpress({ app });

インフラ実装

インフラ実装には AWS CDK を使用しました。

VPC は予め作成したものを使用します。

VPC 定義コード
lib/constructs/vpc.ts
import * as ec2 from "aws-cdk-lib/aws-ec2";
import { Construct } from "constructs";

/**
 * VPC 実装
 *
 * MEMO: VPC から各種 AWS サービスへのネットワーク経路確保のために NAT Gateway を配置する
 */
export class VpcConstruct extends Construct {
  public readonly vpc: ec2.Vpc;
  constructor(scope: Construct, id: string) {
    super(scope, id);

    this.vpc = new ec2.Vpc(this, "Default", {
      subnetConfiguration: [
        /**
         * NAT Gateway を配置するためのパブリックサブネット
         */
        {
          name: "Public",
          subnetType: ec2.SubnetType.PUBLIC,
        },

        /**
         * Lambda 関数を配置するためのプライベートサブネット
         */
        {
          name: "PrivateWithEgress",
          subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
        },
      ],
    });
  }
}

CDK スタック全体のソースコードは以下となります。

import * as cdk from "aws-cdk-lib";
import * as apigateway from "aws-cdk-lib/aws-apigateway";
import * as ec2 from "aws-cdk-lib/aws-ec2";
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as lambda_nodejs from "aws-cdk-lib/aws-lambda-nodejs";
import { Construct } from "constructs";

import { VpcConstruct } from "./constructs/vpc";

export class SampleStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    /**
     * VPC 作成
     */
    const vpcConstruct = new VpcConstruct(this, "Vpc");
    const vpc = vpcConstruct.vpc;

    /**
     * セキュリティグループ作成
     */
    const securityGroup = new ec2.SecurityGroup(this, "SecurityGroup", {
      vpc,
    });

    /**
     * Capacity Provider 作成
     */
    const capacityProvider = new lambda.CapacityProvider(
      this,
      "CapacityProvider",
      {
        subnets: vpc.selectSubnets({
          subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
        }).subnets,
        securityGroups: [securityGroup],
      }
    );

    /**
     * LMI 用 Lambda 関数作成
     */
    const lmiFunction = new lambda_nodejs.NodejsFunction(this, "LmiFunction", {
      entry: "src/handler.ts",
      runtime: lambda.Runtime.NODEJS_24_X, // LMI では Node.js 22.x 以上が必須
    });

    /**
     * Capacity Provider に Lambda 関数を追加
     */
    capacityProvider.addFunction(lmiFunction);

    /**
     * API Gateway REST API の作成、Lambda プロキシ統合設定
     */
    new apigateway.LambdaRestApi(this, "RestApi", {
      handler: lmiFunction,
    });
  }
}

上記デプロイにより、プロキシ統合設定と Capacity Provider 設定が行われた Lambda 関数を作成します。

作成された Lambda 関数です。ちゃんと API Gateway がイベントソースとして設定されていますね。

動作確認

API を呼び出すと、期待通りのレスポンスが返りました。

$ curl https://5z5a0wsbbb.execute-api.ap-northeast-1.amazonaws.com/prod/hello
{"message":"Hello, world!"}

メトリクスでも LMI 実行環境上での同時実行が記録されています。

X-Ray のトレースでも、REST API と Lambda 関数の呼び出しが確認できました。

良さそうですね。

おわりに

AWS Lambda Managed Instances を API Gateway の Lambda プロキシ統合で実行してみました。

Lambda プロキシ統合により実行される関数上で Serverless Express を動かす実装はよく用いられるパターンなので、ちゃんと動かせて良かったです。

以上

この記事をシェアする

FacebookHatena blogX

関連記事