AWS Lambda の Provisioned Concurrency を平日日中帯のみ有効にする設定を AWS CDK で実装してみた(Application Auto Scaling 使用版)

AWS Lambda の Provisioned Concurrency を平日日中帯のみ有効にする設定を AWS CDK で実装してみた(Application Auto Scaling 使用版)

EventBridge Scheduler を使うよりもシンプルに実装できました。
2026.01.22

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

AWS Application Auto Scaling を使うと、AWS上の“アプリケーションレベルのリソース容量”を自動で増減させることができます。

https://docs.aws.amazon.com/ja_jp/autoscaling/application/userguide/what-is-application-auto-scaling.html

EC2 Auto Scaling が「EC2台数」を対象にするのに対し、Application Auto Scaling は「各サービス固有のキャパシティ設定」を対象にします。こちらにある通り多数のサービスがサポートされています。

その中には、前回のブログで EventBridge Scheduler を使ってスケジュールベースで増減させた Lambda 関数の Provisioned Concurrency も含まれています。

https://docs.aws.amazon.com/ja_jp/autoscaling/application/userguide/services-that-can-integrate-lambda.html

今回は、AWS Lambda の Provisioned Concurrency を Application Auto Scaling で平日日中帯のみ有効にする設定を AWS CDK で実装してみました。

やってみた

インフラ実装

AWS CDK のコードは以下の通りとなります。Lambda 関数を Application Auto Scaling のスケーラブルターゲットに登録しています。

lib/sample-stack.ts
import * as cdk from "aws-cdk-lib";
import * as apigateway from "aws-cdk-lib/aws-apigateway";
import * as applicationautoscaling from "aws-cdk-lib/aws-applicationautoscaling";
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as lambda_nodejs from "aws-cdk-lib/aws-lambda-nodejs";
import { Construct } from "constructs";

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

    /**
     * Lambda 関数
     */
    const sampleFunction = new lambda_nodejs.NodejsFunction(
      this,
      "SampleFunction",
      {
        entry: "src/handler.ts",
        tracing: lambda.Tracing.ACTIVE, // コールドスタート発生状況を X-Ray で確認できるようにするため有効化
      }
    );

    /**
     * Lambda エイリアス
     */
    const sampleFunctionAlias = new lambda.Alias(this, "SampleFunctionAlias", {
      aliasName: "Prod",
      version: sampleFunction.currentVersion,
    });

    /**
     * AutoScaling ターゲット
     */
    const target = sampleFunctionAlias.addAutoScaling({
      // ターゲットトラッキング時の範囲(今回はスケジュールベースのため実際にはこれら値は使われない)
      minCapacity: 0,
      maxCapacity: 0,
    });

    /**
     * スケジュールによるスケールアウト設定(平日8時に同時実行数1にスケールアウト)
     */
    target.scaleOnSchedule("sampleLambdaScaleOut", {
      minCapacity: 5,
      maxCapacity: 5,
      timeZone: cdk.TimeZone.ASIA_TOKYO,
      schedule: applicationautoscaling.Schedule.cron({
        weekDay: "MON-FRI",
        hour: "8",
        minute: "0",
      }),
    });

    /**
     * スケジュールによるスケールイン設定(毎日23時に同時実行数0にスケールイン)
     */
    target.scaleOnSchedule("sampleLambdaScaleIn", {
      minCapacity: 0,
      maxCapacity: 0,
      timeZone: cdk.TimeZone.ASIA_TOKYO,
      schedule: applicationautoscaling.Schedule.cron({
        hour: "23",
        minute: "0",
      }),
    });

    /**
     * API Gateway Rest API Lambda プロキシ統合
     */
    new apigateway.LambdaRestApi(this, "SampleApi", {
      handler: sampleFunctionAlias, // REST API がエイリアスを呼び出すように設定
      deployOptions: {
        tracingEnabled: true, // コールドスタート発生状況を X-Ray で確認できるようにするため有効化
      },
    });
  }
}

Application Auto Scaling のスケジュール設定は ScalingSchedule コンストラクトクラスで実装可能です。今回は使いませんでしたがスケジュールの開始 (startTime) と終了 (endTime) も指定可能です。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_applicationautoscaling.ScalingSchedule.html

minCapacity と maxCapacity はスケールアウト設定では 5、スケールイン設定では 1 に統一しています。minCapacity と maxCapacity を異なる値とすればその範囲内でターゲットトラッキングにより自動で増減させることも可能となりますが、今回は両者を同じ値とすることにより固定としています。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/provisioned-concurrency.html#managing-provisioned-concurency

上記のコードを CDK デプロイします。

デプロイ直後は既定で Provisioned Concurrency は未設定となります。

$ aws lambda get-provisioned-concurrency-config \
  --function-name ${FUNCTION_NAME} \
  --qualifier Prod

An error occurred (ProvisionedConcurrencyConfigNotFoundException) when calling the GetProvisionedConcurrencyConfig operation: No Provisioned Concurrency Config found for this function

CloudFormation スタック上では Auto Scaling ターゲットのリソースが作成されているのを確認できます。

ちなみに Auto Scaling ターゲットのリソースの実体をマネコン上で見れるか探してみましたが見当たりませんでした。それもそのはずで Lambda 関数に対する Auto Scaling は API を使用してのみ管理可能になっているようです。

https://docs.aws.amazon.com/ja_jp/autoscaling/application/userguide/services-that-can-integrate-lambda.html#integrate-register-lambda

動作確認

指定したスケジュール通りに Provisioned Concurrency が設定されているかを確認してみます。

平日日中に Provisioned Concurrency 設定を確認すると、朝8時に指定値 5 で設定されていました。

$ aws lambda get-provisioned-concurrency-config \
  --function-name ${FUNCTION_NAME} \
  --qualifier Prod
{
    "RequestedProvisionedConcurrentExecutions": 5,
    "AvailableProvisionedConcurrentExecutions": 5,
    "AllocatedProvisionedConcurrentExecutions": 5,
    "Status": "READY",
    "LastModified": "2026-01-18T23:00:49+0000"
}

CloudTrail でも、朝8時に Provisioned Concurrency が設定されるイベントが AutoScaling-UpdateDesiredCapacity というユーザー名で記録されていました。

次に夜間には、Provisioned Concurrency 設定が削除されていました。

$ aws lambda get-provisioned-concurrency-config \
  --function-name ${FUNCTION_NAME} \
  --qualifier Prod

An error occurred (ProvisionedConcurrencyConfigNotFoundException) when calling the GetProvisionedConcurrencyConfig operation: No Provisioned Concurrency Config found for this function

CloudTrail でも、夜23時に Application Auto Scaling により Provisioned Concurrency が削除されるイベントが記録されていました。

期待通りの挙動となっていることを確認することができました。

おわりに

AWS Lambda の Provisioned Concurrency を Application Auto Scaling で平日日中帯のみ有効にする設定を AWS CDK で実装してみました。

実現できたことは前回と同じですが、 EventBridge Scheduler を使用した時よりもシンプルなコードで実装できたため、特段の理由が無ければ今回の Application Auto Scaling を使う方式で良いのでは無いでしょうか。

次回は Application Auto Scaling で使用率に基づいたスケーリング(ターゲットトラッキング)を試してみたいと思います。

以上

この記事をシェアする

FacebookHatena blogX

関連記事