[AWS CDK] Lambda (デフォルト) を LMI 化したい(あるいはその逆)を行う際の注意点

[AWS CDK] Lambda (デフォルト) を LMI 化したい(あるいはその逆)を行う際の注意点

関数の Lambda (デフォルト) と LMI の直接の変換はできません。一度削除を挟む必要があります。
2026.01.29

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

AWS re:Invent 2025 でAWS Lambda Managed Instances (LMI) が登場しましたね。これにより Lambda 関数は大きく分けて次の 2 つのタイプに分類されるようになりました。

  • Lambda (デフォルト)
  • Lambda Managed Instances

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-managed-instances.html#lambda-managed-instances-comparison

この LMI を導入したいとなった際に、すでに作成済みの Lambda (デフォルト) を LMI 化したい(あるいはその逆)というニーズが出てくるかと思います。

今回は、関数の Lambda (デフォルト) と LMI を変換する際に AWS CDK を利用した場合の注意点について解説します。

はじめに結論

結論として、AWS CDK で LMI を利用する場合、以下の点に注意が必要です。

  • Lambda Managed Instances の関数作成時は以下の操作を同時に行う必要がある。
    • Lambda 関数の作成
    • Capacity Provider への追加
  • Lambda Managed Instances の関数削除時は以下の操作を同時に行う必要がある。
    • Capacity Provider からの削除
    • Lambda 関数の削除

これはつまり、Lambda (デフォルト) 関数を LMI 化 (Capacity Provider に追加) したり、LMI 化された Lambda 関数をデフォルト化 (Capacity Provider から削除) といった直接の変換はできない、ということを意味します。

検証内容

実際に AWS CDK で試してみました。

Capacity Provider への追加時

まず、AWS CDK で LMI 化したい Lambda 関数を Capacity Provider に追加するコードは以下のようになります。

lib/sample-stack.ts
import * as cdk from "aws-cdk-lib";
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],
      },
    );

    /**
     * Lambda 関数 (デフォルトとしてデプロイ済み)
     */
    const lambdaFunction = new lambda_nodejs.NodejsFunction(
      this,
      "LambdaFunction",
      {
        entry: "src/handler.ts",
        runtime: lambda.Runtime.NODEJS_24_X,
      },
    );

    /**
     * Capacity Provider に Lambda 関数を追加(新規追加したコード)
     */
    capacityProvider.addFunction(lambdaFunction);
  }
}

上記では、デフォルトとしてデプロイ済みの Lambda 関数を Capacity Provider に追加し、LMI 化しようとしています。

しかし、デプロイしたら以下のようなエラーが発生しました。

9:10:36 AM | UPDATE_FAILED | AWS::Lambda::Function | LambdaFunctionBF21E41F
Resource handler returned message: "CapacityProviderConfig isn't supported for Lambda Default functions. (Service: Lambda, Status Code: 400, Request ID: 90
331038-8ef4-44a8-8157-c5363e2d2543) (SDK Attempt Count: 1)" (RequestToken: 52633cab-8b14-f1e2-200c-dfe094b1f366, HandlerErrorCode: InvalidRequest)

マネジメントコンソールからも同じエラーが確認できます。

"CapacityProviderConfig isn't supported for Lambda Default functions. とあるので、デフォルトの Lambda 関数にはキャパシティプロバイダーを設定できないことが分かります。

なのでワークアラウンドとしては、下記の手順を踏む必要があります。

  1. LMI 化したい Lambda 関数を削除デプロイ
  2. 関数の作成と、Capacity Provider への追加を同時にデプロイ

Capacity Provider からの削除時

逆に、AWS CDK で LMI 化された Lambda 関数を Capacity Provider から削除する場合はどうなるでしょう。

lib/sample-stack.ts
import * as cdk from "aws-cdk-lib";
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],
      },
    );

    /**
     * Lambda 関数 (LMI としてデプロイ済み)
     */
    const lambdaFunction = new lambda_nodejs.NodejsFunction(
      this,
      "LambdaFunction",
      {
        entry: "src/handler.ts",
        runtime: lambda.Runtime.NODEJS_24_X,
      },
    );

    /**
     * コメントアウトして Capacity Provider から Lambda 関数を削除
     */
    // capacityProvider.addFunction(lambdaFunction);
  }
}

上記では、LMI 化としてデプロイ済みの Lambda 関数を Capacity Provider から削除し、デフォルト化しようとしています。

しかし、デプロイしたら以下のようなエラーが発生しました。

10:22:29 PM | UPDATE_FAILED | AWS::Lambda::Function | LambdaFunctionBF21E41F
Resource handler returned message: "Invalid request provided: Removing CapacityProviderConfig is not supported for Lambda functions." (RequestToken: 532d60
ff-0c3c-0a5d-39ab-d52a53503aff, HandlerErrorCode: InvalidRequest)

マネジメントコンソールからも同じエラーが確認できます。

Removing CapacityProviderConfig is not supported for Lambda functions. とあります。こちらは若干意味が分かりづらいですが、LMI 化された Lambda 関数をキャパシティプロバイダーを削除することはサポートされていない、という意味です。

ワークアラウンドとしては、下記の手順を踏む必要があります。

  1. 関数の削除と、Capacity Provider からの削除を同時にデプロイ
  2. デフォルト化したい Lambda 関数作成を再デプロイ

おわりに

関数の Lambda (デフォルト) と LMI を変換する際に AWS CDK を利用した場合の注意点についてでした。

はじめ "CapacityProviderConfig isn't supported for Lambda Default functions. というエラーが出た際には、CDK パッケージのバージョンが古いのだと勘違いしてハマってしまいました。

しかしよく考えると、マネジメントコンソールの Capacity Provider のメニューには、Lambda 関数の 作成 はありますが、追加のメニューはありません。同じ Lambda 関数だからといっておいそれと変換できるわけではない、ということですね。

LMI を導入したい方が同じ轍を踏まないように、この記事が参考になれば幸いです。

以上

この記事をシェアする

FacebookHatena blogX

関連記事