Auto Scaling

【VPC内リージョンサービス】

Auto Scaling は、トラフィックや処理負荷の変化を検知し、必要に応じてインスタンス数を自動的にスケールアップまたはスケールダウンさせる機能です。

EC2 Auto Scalingでは、Launch Template(起動テンプレート) と ASG(Auto Scaling Group) を利用して、希望台数・最小台数・最大台数を柔軟に管理します。

Application Auto Scaling を利用すれば、EC2以外のサービス(ECS、DynamoDB、Lambdaなど)に対してもスケーリングを自動化できます。

CPU使用率やリクエスト数、カスタムメトリクスなどを基準にスケーリングを行い、ターゲット追跡スケーリング、ステップスケーリング、スケジュールスケーリングなど多彩なスケーリングポリシーを設定できます。

スケーリング実行後にはクールダウンと呼ばれる待機時間を設けることで、処理の安定化を図り、不要なスケーリングの繰り返しを防止します。

障害が発生したインスタンスのヘルスリプレース(自動置換)や、マルチAZ(Availability Zone)への分散配置によって、システム全体の可用性を高めます

重要用語

関連サービス

ユースケース

Webサーバー台数の自動増減アクセス数が増えたときにEC2インスタンスを自動的に増やし、夜間などアクセスが少ない時間帯には台数を減らしてコストを抑える。
障害発生インスタンスの自動入れ替え監視ヘルスチェックに失敗したEC2インスタンスを自動的に終了し、新しいインスタンスを起動して常に一定数を維持する。
スケジュールベースのキャパシティ調整平日日中はインスタンス数を増やし、夜間や休日は減らすといったスケジュールを設定し、予測可能な負荷変動に合わせてリソースを調整する。

ベストプラクティス

ターゲット追跡スケーリングの利用CPU使用率などのメトリクスに基づいて自動でインスタンス数を調整する。
ウォームアップ時間の設定新規インスタンスが安定稼働するまでの時間を設定し、早すぎるスケーリング判定を避ける。
複数AZへの分散Auto Scalingグループには複数AZを指定し、障害耐性を向上させる。

高可用性・バックアップ・リトライ

高可用性・バックアップ・リトライ設計のポイント
【デフォルト】AWS内部で冗長化
 ・コントロールプレーン
 ・メタデータ・ポリシー情報
 ・スケーリングイベント管理とモニタリング層
 ・ライフサイクルフックおよび通知インフラ

セキュリティ

関連サービス設定内容
CloudTrail(操作履歴の記録・監査・追跡)【自動記録】
作成・更新・削除・設定変更は自動記録される。(コントロールプレーンAPI)
データ操作は追跡できない(データプレーンAPI)
Config(リソースの構成状態・設定変更を記録)【Configが有効な場合】
グループ/ポリシー変更履歴・スケーリング設定準拠評価
GuardDuty(脅威を自動検出)【GuardDutyが有効な場合】
スケーリングポリシー変更のAPI異常検知
Auto Scaling が使用する SLR の連携パターン
SLR名 : AWSServiceRoleForAutoScaling
SLR が操作するサービス用途
EC2インスタンスの自動スケーリング(起動/終了)
ELBロードバランサーへのインスタンス登録/解除
CloudWatchメトリクスに基づくスケーリングアラームの設定
SNSスケーリングイベントの通知送信
権限設計の原則
Application Auto Scaling が使用する SLR の連携パターン
SLR名 : AWSServiceRoleForApplicationAutoScaling_*
SLR が操作するサービス用途
ECSECSサービスのタスク数の自動スケーリング
DynamoDBテーブルおよびグローバルセカンダリインデックスの読み取り/書き込みキャパシティの自動スケーリング
AuroraAuroraレプリカの自動スケーリング
Lambdaプロビジョニングされた同時実行数の自動スケーリング
SageMakerエンドポイントのインスタンス数の自動スケーリング
CloudWatchメトリクスに基づくスケーリングポリシーの評価
CloudFormationスケーラブルターゲットとスケーリングポリシーのスタック管理
権限設計の原則

ログ・監視

標準メトリクス
メトリクス名説明
GroupDesiredCapacityDesiredインスタンス数
GroupMaxSize最大サイズ設定値
GroupMinSize最小サイズ設定値
GroupTotalInstances総インスタンス数
GroupInServiceInstancesInServiceインスタンス数
GroupPendingInstancesPendingインスタンス数
GroupStandbyInstancesStandbyインスタンス数
GroupTerminatingInstancesTerminatingインスタンス数

制限値(固定値/ハードリミット/ソフトリミット)

ハードリミット制限値
SNS通知設定数/グループ10
ステップ調整数/ステップスケーリングポリシー20

ソフトリミット制限値
Auto Scalingグループ数/リージョン500
起動設定数/リージョン200
スケジュールされたアクション数/グループ125
ライフサイクルフック数/グループ50

AWS CLIのサンプルコード

SSM 接続用の IAMロールを作成する
aws iam create-role \
  --role-name SSMInstanceRole \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [{
      "Effect": "Allow",
      "Principal": {"Service": "ec2.amazonaws.com"},
      "Action": "sts:AssumeRole"
    }]
  }'
SSM 接続用の IAMロールにIAMポリシーをアタッチする(IAMロール名 指定)
aws iam attach-role-policy \
  --role-name SSMInstanceRole \
  --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
SSM 接続用の Instance Profile を作成する
aws iam create-instance-profile \
  --instance-profile-name SSMInstanceProfile
SSM 接続用の Instance Profile にIAMロールを追加する
(Instance Profile名、IAMロール名 指定)
aws iam add-role-to-instance-profile \
  --instance-profile-name SSMInstanceProfile \
  --role-name SSMInstanceRole

起動テンプレートを作成する(AMI ID、SG ID、Instance Profile名 指定)
aws ec2 create-launch-template \
  --launch-template-name my-launch-template \
  --launch-template-data '{
      "ImageId": "ami-xxxxxxxxx",
      "InstanceType": "t3.micro",
      "SecurityGroupIds": ["sg-xxxxxxxxx"],
      "IamInstanceProfile": {
          "Arn": "arn:aws:iam::account-id:instance-profile/SSMInstanceProfile"
      }
  }' \
  --tag-specifications 'ResourceType=launch-template,Tags=[{Key=Name,Value=my-launch-template}]'
起動テンプレート ID を表示する
aws ec2 describe-launch-templates
起動テンプレートを削除する(起動テンプレート ID 指定)
aws ec2 delete-launch-template \
  --launch-template-id lt-xxxxxxxxx

Webサーバ用 ASGを作成する
(起動テンプレート ID、マルチAZのSubnet ID、ターゲットグループ ARN 指定)
aws autoscaling create-auto-scaling-group \
  --auto-scaling-group-name my-asg \
  --launch-template LaunchTemplateId=lt-xxxxxxxxx,Version='$Latest' \
  --min-size 1 \
  --max-size 10 \
  --desired-capacity 2 \
  --vpc-zone-identifier "subnet-xxxxx,subnet-yyyyy" \
  --target-group-arns arn:aws:elasticloadbalancing:region:account-id:targetgroup/my-target-group/xxxxx \
  --health-check-type ELB \
  --health-check-grace-period 300 \
  --tags Key=Name,Value=my-asg,PropagateAtLaunch=true
バッチサーバ用 ASGを作成する
(起動テンプレート ID、マルチAZのSubnet ID)
aws autoscaling create-auto-scaling-group \
  --auto-scaling-group-name my-asg \
  --launch-template LaunchTemplateId=lt-xxxxxxxxx,Version='$Latest' \
  --min-size 1 \
  --max-size 10 \
  --desired-capacity 2 \
  --vpc-zone-identifier "subnet-xxxxx,subnet-yyyyy" \
  --health-check-type EC2 \
  --health-check-grace-period 300 \
  --tags Key=Name,Value=my-asg,PropagateAtLaunch=true
ASGの状態を表示する
aws autoscaling describe-auto-scaling-groups
ASGを削除する(ASG名 指定)
aws autoscaling delete-auto-scaling-group \
  --auto-scaling-group-name my-asg \
  --force-delete

スケーリングポリシーを作成する(ASG名 指定)
aws autoscaling put-scaling-policy \
  --auto-scaling-group-name my-asg \
  --policy-name target-tracking-policy \
  --policy-type TargetTrackingScaling \
  --target-tracking-configuration '{
      "PredefinedMetricSpecification": {
          "PredefinedMetricType": "ASGAverageCPUUtilization"
      },
      "TargetValue": 50.0
  }'
スケーリングポリシーを表示する(ASG名 指定)
aws autoscaling describe-policies \
  --auto-scaling-group-name my-asg
スケーリングポリシーを削除する(ASG名 指定)
aws autoscaling delete-policy \
  --auto-scaling-group-name my-asg \
  --policy-name target-tracking-policy

CloudFormationのサンプルコード

Terraformのサンプルコード

料金計算

課金項目説明
Auto Scaling自体は無料起動されたEC2インスタンスに課金

公式ページ

AWSドキュメント Auto Scaling