[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. とあります。こちらは若干意味が分かりづらいですが、関数をキャパシティプロバイダーから削除するのと同時にデフォルト化することはサポートされていない、という意味です。

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

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

おわり��

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

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

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

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

以上

この記事をシェアする

関連記事