目次

Application Auto Scaling 完全ガイド v2.0

Compute 以外のリソースのスケーリング基盤

Application Auto Scaling は、「EC2 インスタンス以外の AWS サービス(ECS / DynamoDB / Aurora / Lambda / SageMaker / Comprehend 等)のキャパシティを自動的にスケールする統一サービス」 であり、Target Tracking Scaling / Step Scaling / Scheduled Scaling の 3 つのポリシータイプで、ECS タスク数・DynamoDB RCU/WCU・Aurora リードレプリカ・Lambda プロビジョニング済み同時実行数等を動的に管理します。EC2 Auto Scaling とは異なるサービスで、Compute 以外のマルチサービス対応のスケーリング基盤として機能します。本ドキュメントは Application Auto Scaling の概念・対応サービス・スケーリング戦略・2025-2026 最新動向を体系的に解説する包括的ガイドです。

ドキュメント目的

本ガイドは以下を対象としています。

  • 初心者向け: Application Auto Scaling とは何か、EC2 Auto Scaling との違いを学びたい方
  • 開発者向け: ECS・Lambda・DynamoDB のスケーリングを実装したい方
  • SRE / インフラ向け: マルチサービス統合のスケーリング戦略
  • データエンジニア向け: DynamoDB・Aurora のプロビジョニング最適化
  • 意思決定者向け: コスト最適化・パフォーマンス管理の効率化

2025-2026 年の Application Auto Scaling エコシステム

  • Predictive Scaling 拡張:ECS / DynamoDB への機械学習による予測スケーリング対応
  • カスタムメトリクス連携強化:CloudWatch Metrics Math / Logs Insights との統合
  • Karpenter 統合:ノード自動スケーリングとの連携(Fargate との棲み分け)
  • Step Functions Distributed Map との統合:動的スケーリング対応
  • リアルタイムダッシュボード:スケーリングイベントの CloudWatch ネイティブ可視化
  • クロスアカウントスケーリング:マルチアカウント環境でのスケーリング管理

目次

  1. 概要
  2. Application Auto Scaling が解決する課題
  3. 主な特徴
  4. 対応サービス完全リスト
  5. アーキテクチャと基本概念
  6. スケーリングポリシータイプ
  7. Target Tracking Scaling 詳解
  8. Step Scaling 詳解
  9. Scheduled Scaling 詳解
  10. ECS サービスのスケーリング
  11. DynamoDB のスケーリング
  12. Aurora のスケーリング
  13. Lambda Provisioned Concurrency のスケーリング
  14. SageMaker エンドポイントのスケーリング
  15. その他サービスのスケーリング
  16. カスタムメトリクスの活用
  17. スケーリングポリシーの設計
  18. EC2 Auto Scaling との比較
  19. AWS Auto Scaling との関係
  20. 類似ツール・Karpenter との比較
  21. ベストプラクティス
  22. トラブルシューティング
  23. 2025-2026 最新動向
  24. 学習リソース・参考文献
  25. 実装例・活用シーン
  26. 設計チェックリスト
  27. まとめ
  28. 参考文献

概要

初心者向けメモ: Application Auto Scaling は「EC2 以外のマネージドサービスのスケーリング基盤」です。EC2 インスタンスをスケールするなら EC2 Auto Scaling を使いますが、ECS のタスク数・DynamoDB のキャパシティユニット・Aurora のリードレプリカ数・Lambda のプロビジョニング済み同時実行数等をスケールするには Application Auto Scaling が必要です。統一された API で複数サービスのスケーリングを一元管理できます。

Application Auto Scaling 公式定義:

「AWS サービスのリソース(ECS・DynamoDB・Aurora・Lambda 等)のスケーラブルなターゲットの容量を自動的に調整し、要求に応じてアプリケーションを拡張・縮小する」

参照:What is Application Auto Scaling


Application Auto Scaling が解決する課題

課題 1:非 EC2 リソースのスケーリングが複雑

従来の方法

  • ECS タスク数の調整を手動で行う(CloudWatch アラームの設定も複雑)
  • DynamoDB のプロビジョニング済みキャパシティを定期的に手動調整
  • Lambda のプロビジョニング済み同時実行数をコンソールで管理

Application Auto Scaling 活用

# 統一 API でスケーリングポリシーを定義
aws application-autoscaling put-scaling-policy \
  --policy-name ecs-cpu-scaling \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 70.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "ECSServiceAverageCPUUtilization"
    }
  }'

課題 2:EC2 Auto Scaling では対応できない

DynamoDB のスケーリングはプロビジョニングキャパシティ(RCU/WCU)で管理されており、EC2 インスタンス数とは異なるディメンションです。EC2 Auto Scaling API は EC2 インスタンスのみを対象としていますが、Application Auto Scaling はマルチサービス対応です。

課題 3:複数のスケーリング戦略を組み合わせたい

ビジネス要求により、時間帯に応じたスケーリング(スケジュール)+ 負荷応答型スケーリング(ターゲット追跡)を組み合わせたい場合があり、Application Auto Scaling で統一的に管理できます。


主な特徴

特徴 詳細
マルチサービス対応 ECS / DynamoDB / Aurora / Lambda / SageMaker 等、複数サービスを同一 API で管理
統一スケーリング API register-scalable-target / put-scaling-policy で統一的にスケーリング設定
3 つのスケーリングポリシー Target Tracking(推奨)/ Step Scaling / Scheduled Scaling
カスタムメトリクス対応 CloudWatch の任意のメトリクス(SQS キュー深さ等)をトリガー可能
スケーリング冷却期間設定 スケールアウト・スケールイン後の遅延を独立制御可能
Predictive Scaling(一部対応) 機械学習による予測的スケーリング(ECS / DynamoDB)
無料サービス スケーリング自体に費用は発生しない(対象リソースの利用料のみ)

対応サービス完全リスト

Compute

  • ECS サービス(Fargate / EC2 起動タイプ):タスク数(ecs:service:DesiredCount)
  • Fargate Spot キャパシティプロバイダー:キャパシティ(ecs:capacityprovider:DesiredTaskCount)
  • AppStream 2.0 フリート:インスタンス数(appstream:fleet:DesiredCapacity)

Database

  • DynamoDB テーブル:読み取り(dynamodb:table:ReadCapacityUnits)/ 書き込み(dynamodb:table:WriteCapacityUnits)キャパシティユニット
  • DynamoDB Global Secondary Index(GSI):読み取り / 書き込みキャパシティ
  • Aurora DB クラスター:リードレプリカ数(rds:cluster:ReadReplicaCount)

Serverless / Functions

  • Lambda 関数:プロビジョニング済み同時実行数(lambda:function:ProvisionedConcurrentExecutions)
  • Comprehend:エンドポイントキャパシティユニット(comprehend:document-classifier-endpoint:DesiredInferenceUnits)

Data / Analytics

  • EMR(Elastic MapReduce):マネージドスケーリング対応(コアノード数)
  • Kinesis Data Streams:読み取り / 書き込みキャパシティユニット(kinesis:stream:DesiredWriteCapacityUnits)

ML / Inference

  • SageMaker エンドポイント:インスタンス数(sagemaker:variant:DesiredInstanceCount)
  • SageMaker Serverless エンドポイント:同時実行数(sagemaker:variant:ServerlessProvisionedConcurrentExecutions)

Search / Analytics

  • OpenSearch ドメイン:ウォームノード数(opensearchservice:domain:DesiredWarmNodeCount)
  • OpenSearch Serverless コレクション:OCU(OpenSearch Compute Units)

Message Queue

  • AWS MSK(Managed Streaming for Kafka):ブローカーノード数(MSK Serverless)

Custom Resources

  • カスタムリソース:独自アプリケーションで Application Auto Scaling API に登録したスケーラブルターゲット

アーキテクチャと基本概念

graph LR
    A["CloudWatch メトリクス"] --> B["Application Auto Scaling"]
    C["スケーリングポリシー"] --> B
    D["スケジュール"] --> B
    
    B --> E["スケーリング判定"]
    
    E --> F["Target Tracking"]
    E --> G["Step Scaling"]
    E --> H["Scheduled"]
    
    F --> I["ECS / DynamoDB / Aurora / Lambda / SageMaker / ..."]
    G --> I
    H --> I
    
    I --> J["リソースキャパシティ変更"]
    
    style B fill:#e6ffe6
    style I fill:#fff3cd

Core Concepts

  1. Scalable Target:Application Auto Scaling で管理するリソースの特定のディメンション

    # 例:ECS サービスの DesiredCount(タスク数)
    # resource-id: service/cluster-name/service-name
    # scalable-dimension: ecs:service:DesiredCount
    
  2. Scaling Policy:スケーリングを決定するルール(ターゲット値・ステップ・スケジュール)

  3. CloudWatch Metrics:スケーリング判定に使用するメトリクス(CPU / メモリ / カスタムメトリクス)

  4. Cooldown Period:スケーリングイベント後の待機期間(スケールアウト / スケールイン独立)

  5. Scalable Target Attribute:最小・最大キャパシティ、スケーリング冷却期間


スケーリングポリシータイプ

1. Target Tracking Scaling(推奨)

特徴: 指定した CloudWatch メトリクスをターゲット値に保つように自動スケーリング

{
  "TargetValue": 70.0,
  "PredefinedMetricSpecification": {
    "PredefinedMetricType": "ECSServiceAverageCPUUtilization"
  },
  "ScaleOutCooldown": 60,
  "ScaleInCooldown": 300
}

メリット:

  • 複雑なステップルール設定不要(シンプル)
  • 自動的に適切なスケーリング速度を計算
  • ターゲット値に向かって段階的にスケーリング
  • スケールイン保護あり(突発的なスケールインを防止)

デメリット:

  • 細かいスケーリング挙動をカスタマイズしにくい

2. Step Scaling

特徴: CloudWatch アラームの違反度合いに応じてスケーリング(複数ステップ設定可能)

{
  "AdjustmentType": "PercentChangeInCapacity",
  "StepAdjustments": [
    {
      "MetricIntervalLowerBound": 0,
      "MetricIntervalUpperBound": 10,
      "ScalingAdjustment": 10
    },
    {
      "MetricIntervalLowerBound": 10,
      "ScalingAdjustment": 30
    }
  ]
}

メリット:

  • 細かいスケーリング制御が可能
  • 複数のアラーム条件に対応
  • スケールアウト / スケールインで異なるルール設定可能

デメリット:

  • ステップ設定が複雑
  • Target Tracking より手動調整の負荷が高い

3. Scheduled Scaling

特徴: 指定した日時でキャパシティを固定値に変更

aws application-autoscaling put-scheduled-action \
  --service-namespace ecs \
  --resource-id service/cluster/service \
  --scalable-dimension ecs:service:DesiredCount \
  --scheduled-action-name "scale-up-business-hours" \
  --schedule "cron(0 9 ? * MON-FRI *)" \
  --scalable-target-action MinCapacity=10,MaxCapacity=30

メリット:

  • ビジネスパターンが既知(営業時間等)の場合に効果的
  • 定期的な需要変動に対応

デメリット:

  • 予期しない需要スパイクに対応できない
  • Target Tracking と組み合わせる場合の min/max 調整が必要

Target Tracking Scaling 詳解

Predefined Metrics(事前定義メトリクス)

各サービスで推奨される標準メトリクスが提供されています。

ECS

# CPU 利用率に基づいてスケーリング
aws application-autoscaling put-scaling-policy \
  --policy-name ecs-cpu-tracking \
  --service-namespace ecs \
  --resource-id service/my-cluster/my-service \
  --scalable-dimension ecs:service:DesiredCount \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 70.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "ECSServiceAverageCPUUtilization"
    },
    "ScaleOutCooldown": 60,
    "ScaleInCooldown": 300
  }'

DynamoDB

# 読み取りキャパシティ利用率
aws application-autoscaling put-scaling-policy \
  --policy-name dynamo-read-tracking \
  --service-namespace dynamodb \
  --resource-id table/my-table \
  --scalable-dimension dynamodb:table:ReadCapacityUnits \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 70.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "DynamoDBReadCapacityUtilization"
    },
    "ScaleOutCooldown": 60,
    "ScaleInCooldown": 600
  }'

Custom Metrics(カスタムメトリクス)

CloudWatch にパブリッシュした任意のメトリクスをターゲットに指定可能

# SQS キューの ApproximateNumberOfMessagesVisible をベースにスケーリング
aws application-autoscaling put-scaling-policy \
  --policy-name ecs-queue-based-scaling \
  --service-namespace ecs \
  --resource-id service/my-cluster/worker-service \
  --scalable-dimension ecs:service:DesiredCount \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 10.0,
    "CustomizedMetricSpecification": {
      "MetricName": "ApproximateNumberOfMessagesVisible",
      "Namespace": "AWS/SQS",
      "Statistic": "Average",
      "Dimensions": [
        {
          "Name": "QueueName",
          "Value": "my-worker-queue"
        }
      ]
    },
    "ScaleOutCooldown": 30,
    "ScaleInCooldown": 300
  }'

ターゲット値の設定ガイド

メトリクス 推奨ターゲット値 理由
CPU 利用率 60~80% 100%に近づくと処理遅延のリスク
メモリ利用率 70~80% メモリは予測しにくいため少し余裕
SQS キュー深さ 10~50(タスク当たり) キューの長さ / 期待タスク数
Lambda 同時実行 0.7 倍の予約容量 予約容量に対して 70%
DynamoDB RCU/WCU 70% 利用率が高すぎると throttle のリスク

Step Scaling 詳解

Step Scaling ルールの構造

# 複数のステップを定義してきめ細かいスケーリング
aws application-autoscaling put-scaling-policy \
  --policy-name ecs-step-scaling \
  --service-namespace ecs \
  --resource-id service/my-cluster/my-service \
  --scalable-dimension ecs:service:DesiredCount \
  --policy-type StepScaling \
  --step-scaling-policy-configuration '{
    "AdjustmentType": "PercentChangeInCapacity",
    "MetricAggregationType": "Average",
    "Cooldown": 300,
    "StepAdjustments": [
      {
        "MetricIntervalLowerBound": 0,
        "MetricIntervalUpperBound": 10,
        "ScalingAdjustment": 10
      },
      {
        "MetricIntervalLowerBound": 10,
        "MetricIntervalUpperBound": 20,
        "ScalingAdjustment": 20
      },
      {
        "MetricIntervalLowerBound": 20,
        "ScalingAdjustment": 30
      }
    ]
  }'

MetricIntervalBound の解釈

CPU 利用率が基準値(80%)を超えた場合のステップ:

超過分 0~10%   → +10% スケール
超過分 10~20%  → +20% スケール
超過分 20%以上  → +30% スケール

# つまり CPU が 85% なら → 5% 超過 → +10% スケール
#        CPU が 95% なら → 15% 超過 → +20% スケール
#        CPU が 105% なら → 25% 超過 → +30% スケール

Scheduled Scaling 詳解

Cron Expression での時間指定

# 平日朝 8 時に容量を増やす
cron(0 8 ? * MON-FRI *)

# 平日夜 18 時に元に戻す
cron(0 18 ? * MON-FRI *)

# 土日は最小容量
cron(0 0 ? * SAT,SUN *)

# 毎月 1 日深夜に定期スケーリング
cron(0 2 1 * ? *)

スケジュールスケーリング設定例

# ビジネスアワーズ:容量アップ
aws application-autoscaling put-scheduled-action \
  --service-namespace ecs \
  --resource-id service/cluster/web-service \
  --scalable-dimension ecs:service:DesiredCount \
  --scheduled-action-name "business-hours-scale-up" \
  --schedule "cron(0 8 ? * MON-FRI *)" \
  --timezone "Asia/Tokyo" \
  --scalable-target-action MinCapacity=10,MaxCapacity=50

# オフアワーズ:容量ダウン
aws application-autoscaling put-scheduled-action \
  --service-namespace ecs \
  --resource-id service/cluster/web-service \
  --scalable-dimension ecs:service:DesiredCount \
  --scheduled-action-name "after-hours-scale-down" \
  --schedule "cron(0 20 ? * MON-FRI *)" \
  --timezone "Asia/Tokyo" \
  --scalable-target-action MinCapacity=2,MaxCapacity=10

ECS サービスのスケーリング

Fargate サービスのスケーリング完全例

#!/bin/bash

CLUSTER_NAME="production-cluster"
SERVICE_NAME="web-service"
REGION="ap-northeast-1"

# 1. スケーラブルターゲットの登録
aws application-autoscaling register-scalable-target \
  --service-namespace ecs \
  --resource-id service/$CLUSTER_NAME/$SERVICE_NAME \
  --scalable-dimension ecs:service:DesiredCount \
  --min-capacity 2 \
  --max-capacity 20 \
  --region $REGION

# 2. CPU ターゲット追跡ポリシー
aws application-autoscaling put-scaling-policy \
  --policy-name "${SERVICE_NAME}-cpu-tracking" \
  --service-namespace ecs \
  --resource-id service/$CLUSTER_NAME/$SERVICE_NAME \
  --scalable-dimension ecs:service:DesiredCount \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 70.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "ECSServiceAverageCPUUtilization"
    },
    "ScaleOutCooldown": 60,
    "ScaleInCooldown": 300
  }' \
  --region $REGION

# 3. メモリ利用率ポリシー(オプション)
aws application-autoscaling put-scaling-policy \
  --policy-name "${SERVICE_NAME}-memory-tracking" \
  --service-namespace ecs \
  --resource-id service/$CLUSTER_NAME/$SERVICE_NAME \
  --scalable-dimension ecs:service:DesiredCount \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 80.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "ECSServiceAverageMemoryUtilization"
    },
    "ScaleOutCooldown": 60,
    "ScaleInCooldown": 300
  }' \
  --region $REGION

# 4. スケジュールスケーリング:営業時間帯
aws application-autoscaling put-scheduled-action \
  --service-namespace ecs \
  --resource-id service/$CLUSTER_NAME/$SERVICE_NAME \
  --scalable-dimension ecs:service:DesiredCount \
  --scheduled-action-name "business-hours" \
  --schedule "cron(0 9 ? * MON-FRI *)" \
  --timezone "Asia/Tokyo" \
  --scalable-target-action MinCapacity=10,MaxCapacity=30 \
  --region $REGION

# 5. スケジュールスケーリング:オフアワーズ
aws application-autoscaling put-scheduled-action \
  --service-namespace ecs \
  --resource-id service/$CLUSTER_NAME/$SERVICE_NAME \
  --scalable-dimension ecs:service:DesiredCount \
  --scheduled-action-name "off-hours" \
  --schedule "cron(0 18 ? * MON-FRI *)" \
  --timezone "Asia/Tokyo" \
  --scalable-target-action MinCapacity=2,MaxCapacity=5 \
  --region $REGION

スケーリングポリシーの確認・削除

# スケーリングポリシー一覧確認
aws application-autoscaling describe-scaling-policies \
  --service-namespace ecs \
  --query 'ScalingPolicies[?ResourceId==`service/production-cluster/web-service`]'

# スケーリングポリシー削除
aws application-autoscaling delete-scaling-policy \
  --policy-name "web-service-cpu-tracking" \
  --service-namespace ecs \
  --resource-id service/production-cluster/web-service \
  --scalable-dimension ecs:service:DesiredCount

DynamoDB のスケーリング

DynamoDB 読み取りスケーリング設定

#!/bin/bash

TABLE_NAME="orders-table"

# 1. スケーラブルターゲット登録
aws application-autoscaling register-scalable-target \
  --service-namespace dynamodb \
  --resource-id table/$TABLE_NAME \
  --scalable-dimension dynamodb:table:ReadCapacityUnits \
  --min-capacity 10 \
  --max-capacity 40000

# 2. 読み取りキャパシティのターゲット追跡スケーリング
aws application-autoscaling put-scaling-policy \
  --policy-name "${TABLE_NAME}-read-scaling" \
  --service-namespace dynamodb \
  --resource-id table/$TABLE_NAME \
  --scalable-dimension dynamodb:table:ReadCapacityUnits \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 70.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "DynamoDBReadCapacityUtilization"
    },
    "ScaleOutCooldown": 60,
    "ScaleInCooldown": 600
  }'

# 3. 読み取り用スケジュールスケーリング(夜間に最小化)
aws application-autoscaling put-scheduled-action \
  --service-namespace dynamodb \
  --resource-id table/$TABLE_NAME \
  --scalable-dimension dynamodb:table:ReadCapacityUnits \
  --scheduled-action-name "reduce-read-capacity-night" \
  --schedule "cron(0 22 ? * * *)" \
  --timezone "Asia/Tokyo" \
  --scalable-target-action MinCapacity=10,MaxCapacity=100

# 4. 夜明けに容量復帰
aws application-autoscaling put-scheduled-action \
  --service-namespace dynamodb \
  --resource-id table/$TABLE_NAME \
  --scalable-dimension dynamodb:table:ReadCapacityUnits \
  --scheduled-action-name "restore-read-capacity-morning" \
  --schedule "cron(0 6 ? * * *)" \
  --timezone "Asia/Tokyo" \
  --scalable-target-action MinCapacity=100,MaxCapacity=40000

DynamoDB Global Secondary Index (GSI) のスケーリング

# GSI の読み取りキャパシティをスケーリング
aws application-autoscaling register-scalable-target \
  --service-namespace dynamodb \
  --resource-id table/orders-table/index/gsi-by-customer \
  --scalable-dimension dynamodb:index:ReadCapacityUnits \
  --min-capacity 10 \
  --max-capacity 40000

aws application-autoscaling put-scaling-policy \
  --policy-name "orders-gsi-read-scaling" \
  --service-namespace dynamodb \
  --resource-id table/orders-table/index/gsi-by-customer \
  --scalable-dimension dynamodb:index:ReadCapacityUnits \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 70.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "DynamoDBReadCapacityUtilization"
    }
  }'

Aurora のスケーリング

Aurora Read Replica のスケーリング

#!/bin/bash

DB_CLUSTER_IDENTIFIER="production-aurora-cluster"

# 1. リードレプリカ数のスケーラブルターゲット登録
aws application-autoscaling register-scalable-target \
  --service-namespace rds \
  --resource-id cluster:$DB_CLUSTER_IDENTIFIER \
  --scalable-dimension rds:cluster:ReadReplicaCount \
  --min-capacity 1 \
  --max-capacity 15

# 2. CPU 利用率に基づいてリードレプリカを自動増減
aws application-autoscaling put-scaling-policy \
  --policy-name "${DB_CLUSTER_IDENTIFIER}-read-replica-scaling" \
  --service-namespace rds \
  --resource-id cluster:$DB_CLUSTER_IDENTIFIER \
  --scalable-dimension rds:cluster:ReadReplicaCount \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 70.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "RDSReaderAverageCPUUtilization"
    },
    "ScaleOutCooldown": 300,
    "ScaleInCooldown": 600
  }'

Aurora Serverless v2 の ACU(Aurora Capacity Units)自動スケーリング

Aurora Serverless v2 では、Application Auto Scaling により ACU を自動的に調整できます。

# Aurora Serverless v2 のスケーラブルターゲット登録
aws application-autoscaling register-scalable-target \
  --service-namespace rds \
  --resource-id cluster:serverless-v2-cluster \
  --scalable-dimension rds:cluster:ReadReplicaCount \
  --min-capacity 0.5 \
  --max-capacity 32

Lambda Provisioned Concurrency のスケーリング

#!/bin/bash

FUNCTION_NAME="payment-processor"
FUNCTION_ARN="arn:aws:lambda:ap-northeast-1:123456789012:function:$FUNCTION_NAME"

# 1. プロビジョニング済み同時実行数のスケーラブルターゲット登録
aws application-autoscaling register-scalable-target \
  --service-namespace lambda \
  --resource-id "$FUNCTION_ARN:provisioned" \
  --scalable-dimension lambda:function:ProvisionedConcurrentExecutions \
  --min-capacity 10 \
  --max-capacity 1000

# 2. Lambda の Invocations per Second に基づいてスケーリング
aws application-autoscaling put-scaling-policy \
  --policy-name "${FUNCTION_NAME}-provisioned-concurrency" \
  --service-namespace lambda \
  --resource-id "$FUNCTION_ARN:provisioned" \
  --scalable-dimension lambda:function:ProvisionedConcurrentExecutions \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 0.7,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "LambdaProvisionedConcurrencyUtilization"
    },
    "ScaleOutCooldown": 60,
    "ScaleInCooldown": 300
  }'

SageMaker エンドポイントのスケーリング

#!/bin/bash

ENDPOINT_NAME="recommendation-model-prod"
VARIANT_NAME="AllTraffic"

# 1. エンドポイントバリアントのスケーラブルターゲット登録
aws application-autoscaling register-scalable-target \
  --service-namespace sagemaker \
  --resource-id "endpoint/$ENDPOINT_NAME/variant/$VARIANT_NAME" \
  --scalable-dimension sagemaker:variant:DesiredInstanceCount \
  --min-capacity 1 \
  --max-capacity 10

# 2. 推論リクエストレートに基づいてスケーリング
aws application-autoscaling put-scaling-policy \
  --policy-name "${ENDPOINT_NAME}-instance-scaling" \
  --service-namespace sagemaker \
  --resource-id "endpoint/$ENDPOINT_NAME/variant/$VARIANT_NAME" \
  --scalable-dimension sagemaker:variant:DesiredInstanceCount \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 1000.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "SageMakerVariantInvocationsPerInstance"
    },
    "ScaleOutCooldown": 60,
    "ScaleInCooldown": 600
  }'

その他サービスのスケーリング

AppStream 2.0 フリートのスケーリング

aws application-autoscaling register-scalable-target \
  --service-namespace appstream \
  --resource-id fleet/graphics-fleet \
  --scalable-dimension appstream:fleet:DesiredCapacity \
  --min-capacity 2 \
  --max-capacity 100

aws application-autoscaling put-scaling-policy \
  --policy-name "appstream-fleet-scaling" \
  --service-namespace appstream \
  --resource-id fleet/graphics-fleet \
  --scalable-dimension appstream:fleet:DesiredCapacity \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 75.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "AppStreamAverageCapacityUtilization"
    }
  }'

OpenSearch Serverless コレクションのスケーリング

OpenSearch Serverless は自動的にスケーリングされ、Application Auto Scaling による追加設定は不要です。OCU(OpenSearch Compute Units)が自動に調整されます。

Kinesis Data Streams のスケーリング

aws application-autoscaling register-scalable-target \
  --service-namespace kinesis \
  --resource-id stream/event-stream \
  --scalable-dimension kinesis:stream:DesiredWriteCapacityUnits \
  --min-capacity 10 \
  --max-capacity 4000

aws application-autoscaling put-scaling-policy \
  --policy-name "kinesis-write-scaling" \
  --service-namespace kinesis \
  --resource-id stream/event-stream \
  --scalable-dimension kinesis:stream:DesiredWriteCapacityUnits \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 70.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "KinesisStreamDesiredWriteCapacityUtilization"
    }
  }'

カスタムメトリクスの活用

SQS キュー深さに基づくスケーリング

# CloudWatch カスタムメトリクスを使用した ECS スケーリング
aws application-autoscaling put-scaling-policy \
  --policy-name "ecs-sqs-depth-scaling" \
  --service-namespace ecs \
  --resource-id service/cluster/worker \
  --scalable-dimension ecs:service:DesiredCount \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 10.0,
    "CustomizedMetricSpecification": {
      "MetricName": "ApproximateNumberOfMessagesVisible",
      "Namespace": "AWS/SQS",
      "Statistic": "Average",
      "Dimensions": [
        {
          "Name": "QueueName",
          "Value": "task-queue"
        }
      ]
    },
    "ScaleOutCooldown": 30,
    "ScaleInCooldown": 300
  }'

ビジネスメトリクスに基づくスケーリング

# アプリケーションから CloudWatch にカスタムメトリクスをパブリッシュ
aws cloudwatch put-metric-data \
  --namespace "CustomApp" \
  --metric-name "OrdersPerSecond" \
  --value 150 \
  --unit Count

# このメトリクスをベースにスケーリング
aws application-autoscaling put-scaling-policy \
  --policy-name "custom-orders-scaling" \
  --service-namespace ecs \
  --resource-id service/cluster/order-service \
  --scalable-dimension ecs:service:DesiredCount \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 100.0,
    "CustomizedMetricSpecification": {
      "MetricName": "OrdersPerSecond",
      "Namespace": "CustomApp",
      "Statistic": "Average"
    }
  }'

スケーリングポリシーの設計

設計の 7 つのステップ

  1. リソースとディメンション特定:ECS / DynamoDB など、何をスケールするか
  2. 最小・最大キャパシティ決定:ビジネス要件・コスト制約から決定
  3. スケーリング戦略選択:Target Tracking / Step / Scheduled のいずれか
  4. ターゲット値設定:リソースタイプごとの推奨値から開始
  5. 冷却期間設定:スケールアウト < スケールイン で安定性重視
  6. テストと監視:本番投入前に非本番環境で検証
  7. 継続的改善:CloudWatch メトリクスから調整

冷却期間(Cooldown)の設定

# 推奨ガイドライン
ECS: ScaleOutCooldown=60秒, ScaleInCooldown=300秒
DynamoDB: ScaleOutCooldown=60秒, ScaleInCooldown=600秒
Lambda: ScaleOutCooldown=60秒, ScaleInCooldown=300秒

# 理由:スケールイン冷却を長く設定して、スパイク後の段階的な縮小を防止

EC2 Auto Scaling との比較

観点 EC2 Auto Scaling Application Auto Scaling
対象 EC2 インスタンス ECS / DynamoDB / Aurora / Lambda 等
スケーリング単位 インスタンス数 タスク数 / RCU/WCU / ACU 等
API 名前空間 autoscaling application-autoscaling
主要用途 仮想マシンのスケーリング マネージドサービスの容量管理
Predictive Scaling ✅対応 ✅一部対応(ECS / DynamoDB)
ターゲット追跡 ✅対応 ✅対応(推奨)
スケジュールスケーリング ✅対応 ✅対応
スケーリングポリシー上限 ASG 当たり 50 1 リソース当たり複数可能

AWS Auto Scaling との関係

AWS Auto Scaling は Application Auto Scaling 上位のサービスで、複数リソース・複数サービスのスケーリングを一元管理します。

# AWS Auto Scaling で複数の Application Auto Scaling ポリシーを一括管理
aws autoscaling create-auto-scaling-group \
  --auto-scaling-group-name "multi-resource-group" \
  --resources "ecs-service,dynamodb-table" \
  --scaling-instruction '{
    "ServiceNamespace": "ecs",
    "TargetTrackingConfiguration": {...}
  }'

類似ツール・Karpenter との比較

ツール 対象 用途 特徴
EC2 Auto Scaling EC2 インスタンス インスタンス数の自動調整 AWS ネイティブ、信頼性高
Application Auto Scaling 非 EC2 リソース マネージドサービスの容量管理 統一 API、カスタムメトリクス対応
Karpenter EKS ノード K8s クラスタのノード自動スケーリング 高速、コスト最適化、Spot 対応
KEDA(Kubernetes Event Driven Autoscaling) K8s Pod イベント駆動の Pod スケーリング K8s 標準、外部メトリクス対応
HPA(Horizontal Pod Autoscaler) K8s Pod CPU / メモリに基づく Pod スケーリング K8s 標準、基本機能

Karpenter vs Application Auto Scaling

EKS クラスタの場合:

Application Auto Scaling:
  → ECS on Fargate の場合はこちら
  → ノードではなくタスク数をスケール

Karpenter:
  → EKS の EC2 ノードをスケール
  → Pod 数ではなくノード容量を確保
  → Spot インスタンス活用で大幅コスト削減

ベストプラクティス

✅ やるべきこと

  1. Target Tracking Scaling から開始

    # Step Scaling より簡単で効果的
    PredefinedMetricType で事前定義メトリクスを使用
    
  2. 冷却期間はスケールイン > スケールアウト

    # スケールアウト:60秒
    # スケールイン:300~600秒(スパイク後の安定待機)
    
  3. 最大キャパシティにはビジネスバッファを含める

    # 想定最大需要 × 1.2~1.5
    # 予期しないスパイクに対応可能
    
  4. CloudWatch ダッシュボードで常時監視

    # スケーリングイベントの頻度
    # ターゲット値との乖離
    # 冷却期間中のイベント
    
  5. 定期的にターゲット値を見直し

    # 3~6 ヶ月ごとに実績データを分析
    # CPU 70% が妥当か、80% でいいか確認
    

❌ やってはいけないこと

  1. Step Scaling を複雑に設定しすぎ

    # ステップが 5 個以上になったら設計を見直す
    # Target Tracking に置き換えることを検討
    
  2. スケールイン冷却を短すぎるに設定

    # 30秒でスケールインすると、スパイク直後に急縮小
    # ユーザーエクスペリエンス低下
    
  3. 最小キャパシティを動的に変更

    # 最小値は固定にして、スケジュールスケーリングで min/max を調整
    
  4. 複数のスケーリングポリシーを混在させすぎ

    # Target Tracking + Scheduled + Step を同時設定すると予測不可
    # 基本は Target Tracking + Scheduled の組み合わせ
    
  5. アラーム設定なしでのデプロイ

    # CloudWatch アラーム(スケーリング異常・スケール失敗)を必ず設定
    

トラブルシューティング

Issue 1:スケーリングが起動しない

# 原因確認
1. スケーラブルターゲットが正しく登録されているか
aws application-autoscaling describe-scalable-targets \
  --service-namespace ecs \
  --query 'ScalableTargets[?ResourceId==`service/cluster/service`]'

2. スケーリングポリシーが存在するか
aws application-autoscaling describe-scaling-policies \
  --service-namespace ecs

3. IAM ロール権限
# AWS::ApplicationAutoScaling::Role が作成されているか確認
aws iam get-role --role-name ApplicationAutoscalingECSRole

4. CloudWatch メトリクスが到着しているか
aws cloudwatch get-metric-statistics \
  --namespace AWS/ECS \
  --metric-name CPUUtilization \
  --dimensions Name=ServiceName,Value=my-service

Issue 2:スケールインが激しすぎる

# 原因と対策
1. スケールイン冷却期間を延長
   ScaleInCooldown: 300秒 → 600秒

2. ターゲット値を下げる(スケールインまでの時間短縮)
   TargetValue: 70% → 80%

3. Step Scaling を使用して段階的な縮小
   最小削減幅を 10% に設定

Issue 3:ターゲット値に到達しない

# 原因確認
1. 最大キャパシティに達しているか
aws application-autoscaling describe-scalable-targets \
  --service-namespace ecs \
  --query 'ScalableTargets[0].{Current:CurrentCapacity,Max:MaxCapacity}'

2. スケールアウト冷却期間中か
   CloudWatch で ScalingActivity イベントを確認
   https://console.aws.amazon.com/cloudwatch → Logs

3. リソース側の制限
   ECS タスク:クラスター内のキャパシティ不足
   DynamoDB:パーティション限界
   Lambda:リージョンの同時実行数上限

Issue 4:意図しないスケーリングが発生

# 原因確認
1. スケジュールスケーリングがアクティブか
aws application-autoscaling describe-scheduled-actions \
  --service-namespace ecs

2. Predictive Scaling が有効か
aws application-autoscaling describe-scaling-policies \
  --service-namespace ecs \
  --query 'ScalingPolicies[?PredictiveScalingPolicyConfiguration]'

3. タイムゾーン設定が正確か
   Asia/Tokyo(UTC+9)で設定しているか確認

4. CloudWatch アラーム設定を確認
   誤った Threshold で アラームが起動していないか

Issue 5:コスト削減効果が見られない

# 確認ポイント
1. 実際のスケーリングが発生しているか
   CloudWatch Logs に ScaleOutActivities / ScaleInActivities が記録されているか

2. スケールイン冷却期間が長すぎないか
   600秒(10分)以上の冷却で、スケールインが稀に

3. 最小キャパシティが高すぎないか
   min_capacity を下げて、非ピーク時に 1~2 に設定

4. ターゲット値設定が妥当か
   CPU 70% では常に高めの状態
   → CPU 80% に上げると、より低く維持される場合もある

# スケーリング履歴から実績を分析
aws cloudwatch get-metric-statistics \
  --namespace AWS/ApplicationAutoScaling \
  --metric-name GroupDesiredCapacity \
  --dimensions Name=AutoScalingGroupName,Value=my-resource \
  --start-time 2024-01-01T00:00:00Z \
  --end-time 2024-01-31T23:59:59Z \
  --period 86400 \
  --statistics Average

2025-2026 最新動向

1. Predictive Scaling の拡張

AWS は機械学習により、過去 14 日間のメトリクスから需要を予測し、事前にスケーリングする Predictive Scaling を ECS / DynamoDB に展開。

# Predictive Scaling の有効化(2025)
aws application-autoscaling put-scaling-policy \
  --policy-name "predictive-ecs-scaling" \
  --service-namespace ecs \
  --resource-id service/cluster/service \
  --scalable-dimension ecs:service:DesiredCount \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 70.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "ECSServiceAverageCPUUtilization"
    },
    "PredictiveScalingMaxCapacityBehavior": "SetMaxCapacityAboveMaxCapacity"
  }'

2. カスタムメトリクス機械学習フィルター

CloudWatch Logs Insights から自動抽出したメトリクスを Application Auto Scaling に統合

3. Karpenter との統合

Karpenter で EKS ノードをスケーリング、ECS on Fargate で Application Auto Scaling を使用する統一デザインパターンが確立

4. クロスアカウントスケーリング

AWS Organizations 経由でマルチアカウント環境での一元的なスケーリング管理


学習リソース・参考文献

AWS 公式資料

AWS ブログ・ホワイトペーパー

サードパーティ・OSS


実装例・活用シーン

シーン 1:E-Commerce 注文処理システム

# 時間帯別スケーリング + 負荷応答スケーリング

# 業務時間:最小 20、最大 100 タスク
# 営業時間帯:最小 10、最大 50 タスク
# オフアワーズ:最小 2、最大 10 タスク

# 加えて CPU 70% で自動スケーリング

シーン 2:リアルタイムデータ分析

# Kinesis Data Streams + DynamoDB

# 書き込み容量を自動スケーリング
# 予期しない需要スパイクに対応
# スケールイン冷却を長めに設定(データ一貫性重視)

シーン 3:機械学習推論エンドポイント

# SageMaker エンドポイント
# リクエストレート(Invocations Per Instance)を監視
# スケールアウト:60秒(モデル初期化)
# スケールイン:600秒(突発需要への対応)

設計チェックリスト

  • [ ] 対象リソース・ディメンションが正しく特定されているか
  • [ ] 最小・最大キャパシティが ビジネス・技術要件に合致しているか
  • [ ] スケーリングポリシータイプ(Target / Step / Scheduled)が適切か
  • [ ] ターゲット値が各リソースタイプの推奨値か(CPU 70%、メモリ 75% 等)
  • [ ] スケールアウト冷却 < スケールイン冷却で設定されているか
  • [ ] CloudWatch メトリクス・ダッシュボードが設定済みか
  • [ ] アラーム(スケーリング失敗・異常スケーリング)が設定済みか
  • [ ] 非本番環境で十分なテストが実施されたか
  • [ ] IAM ロール(ApplicationAutoscalingECSRole 等)が作成されているか
  • [ ] 定期的な見直し(3~6 ヶ月)スケジュール設定済みか
  • [ ] 緊急時のスケーリング手動介入手順が文書化されているか
  • [ ] コスト監視メトリクス(利用キャパシティ vs 費用)が設定済みか

まとめ

Application Auto Scaling は 「EC2 以外の AWS マネージドサービスのキャパシティを統一 API で自動管理するサービス」。ECS タスク数・DynamoDB RCU/WCU・Aurora リードレプリカ・Lambda プロビジョニング済み同時実行数等を、Target Tracking / Step / Scheduled の 3 つのポリシータイプで動的に調整します。

採用メリット:

  • 複数リソース・複数サービスの統一管理
  • カスタムメトリクスによる柔軟なスケーリング
  • ビジネス要件(スケジュール)+ 技術要件(負荷)の両立
  • コスト最適化(非利用時間帯の自動縮小)
  • 予測的スケーリング(機械学習)による先制対応

設計のコツ:

  1. Target Tracking Scaling からスタート(簡潔)
  2. スケールイン冷却をスケールアウトより長く設定(安定性)
  3. ターゲット値を各サービスの推奨値から開始(CPU 70% など)
  4. CloudWatch ダッシュボードで常時監視(改善ループ)
  5. 3~6 ヶ月ごとに実績データから調整

Application Auto Scaling は、サーバーレス・マネージドサービス中心のモダンアーキテクチャで必須のコンポーネント。EC2 Auto Scaling と組み合わせることで、エンタープライズ級のマルチレイヤースケーリング基盤が実現できます。


最終更新:2026-04-26
バージョン:v2.0