
【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 が操作するサービス | 用途 |
|---|---|
| ECS | ECSサービスのタスク数の自動スケーリング |
| DynamoDB | テーブルおよびグローバルセカンダリインデックスの読み取り/書き込みキャパシティの自動スケーリング |
| Aurora | Auroraレプリカの自動スケーリング |
| Lambda | プロビジョニングされた同時実行数の自動スケーリング |
| SageMaker | エンドポイントのインスタンス数の自動スケーリング |
| CloudWatch | メトリクスに基づくスケーリングポリシーの評価 |
| CloudFormation | スケーラブルターゲットとスケーリングポリシーのスタック管理 |
ログ・監視
標準メトリクス
| メトリクス名 | 説明 |
|---|---|
| GroupDesiredCapacity | Desiredインスタンス数 |
| GroupMaxSize | 最大サイズ設定値 |
| GroupMinSize | 最小サイズ設定値 |
| GroupTotalInstances | 総インスタンス数 |
| GroupInServiceInstances | InServiceインスタンス数 |
| GroupPendingInstances | Pendingインスタンス数 |
| GroupStandbyInstances | Standbyインスタンス数 |
| GroupTerminatingInstances | Terminatingインスタンス数 |
制限値(固定値/ハードリミット/ソフトリミット)
| ハードリミット | 制限値 |
|---|---|
| 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インスタンスに課金 |