aws-cloudformation-auto-scaling
aws-cloudformation-auto-scaling について
AWS CloudFormation でスケーラブルなインフラを構築する開発者向けのスキルです。EC2、ECS、Lambda の Auto Scaling を対象に、グループ、ポリシー、ライフサイクルフック、監視、高可用性の実践を扱います。
主な機能
- 01EC2 Auto Scaling グループの作成
- 02起動テンプレートとスケーリングポリシーの設定
- 03ECS サービスと Lambda のスケーリング設定
- 04ライフサイクルフックと CloudWatch アラームの追加
- 05テンプレート出力とクロススタック参照の整理
活用シーン
- 01EC2 ワークロードの弾力的な容量構築
- 02メトリクスに基づくターゲット追跡の設定
- 03ライフサイクルフックによるインスタンス終了管理
- 04Auto Scaling グループ情報の他スタックへの出力
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill aws-cloudformation-auto-scalingインストール後、Claude Code で/aws-cloudformation-auto-scalingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/constraints.mdexamples.mdreference.md詳細
AWS CloudFormation Auto Scaling
概要
AWS CloudFormation テンプレートを使用して、本番環境に対応した Auto Scaling インフラストラクチャを作成します。このスキルでは、EC2、ECS、Lambda の Auto Scaling グループ、起動設定、起動テンプレート、スケーリングポリシー、ライフサイクルフック、高可用性とコスト最適化のベストプラクティスを扱います。
使用する場面
次のような場合にこのスキルを使用します。
- EC2 インスタンス用の Auto Scaling グループを作成するとき
- 起動設定または起動テンプレートを構成するとき
- スケーリングポリシー(ステップ、ターゲット追跡、シンプル)を実装するとき
- ライフサイクル管理用のライフサイクルフックを追加するとき
- ECS サービスのスケーリングを作成するとき
- Lambda のプロビジョニングされた同時実行数のスケーリングを実装するとき
- Parameters、Outputs、Mappings、Conditions を使用してテンプレートを整理するとき
- エクスポート/インポートを使用してスタック間参照を実装するとき
- 多様性を確保するために混合インスタンスポリシーを使用するとき
手順
CloudFormation で Auto Scaling インフラストラクチャを作成するには、次の手順に従います。
1. パラメータを定義する
AWS 固有のパラメータタイプを使用して、キャパシティとインスタンスの設定を指定します。
Parameters:
MinSize:
Type: Number
Default: 2
Description: Minimum number of instances
MaxSize:
Type: Number
Default: 10
Description: Maximum number of instances
DesiredCapacity:
Type: Number
Default: 2
Description: Desired number of instances
InstanceType:
Type: AWS::EC2::Instance::Type
Default: t3.micro
Description: EC2 instance type
AmiId:
Type: AWS::EC2::Image::Id
Description: AMI ID for instances
SubnetIds:
Type: List<AWS::EC2::Subnet::Id>
Description: Subnets for Auto Scaling group
2. 起動設定を作成する
インスタンスの起動設定を定義します。
Resources:
MyLaunchConfiguration:
Type: AWS::AutoScaling::LaunchConfiguration
Properties:
LaunchConfigurationName: !Sub "${AWS::StackName}-lc"
ImageId: !Ref AmiId
InstanceType: !Ref InstanceType
KeyName: !Ref KeyName
SecurityGroups:
- !Ref InstanceSecurityGroup
InstanceMonitoring: Enabled
UserData:
Fn::Base64: |
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
3. Auto Scaling グループを作成する
最小、最大、希望キャパシティとネットワークを指定します。
Resources:
MyAutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
AutoScalingGroupName: !Sub "${AWS::StackName}-asg"
MinSize: !Ref MinSize
MaxSize: !Ref MaxSize
DesiredCapacity: !Ref DesiredCapacity
VPCZoneIdentifier: !Ref SubnetIds
LaunchConfigurationName: !Ref MyLaunchConfiguration
TargetGroupARNs:
- !Ref MyTargetGroup
HealthCheckType: ELB
HealthCheckGracePeriod: 300
Tags:
- Key: Environment
Value: !Ref Environment
PropagateAtLaunch: true
4. ロードバランサーとの統合を構成する
トラフィックを分散するために ALB を設定します。
Resources:
MyTargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Name: !Sub "${AWS::StackName}-tg"
Port: 80
Protocol: HTTP
VpcId: !Ref VPCId
HealthCheckPath: /
TargetType: instance
MyLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Name: !Sub "${AWS::StackName}-alb"
Scheme: internet-facing
Type: application
Subnets:
- !Ref PublicSubnet1
- !Ref PublicSubnet2
5. スケーリングポリシーを追加する
ターゲット追跡スケーリングを実装します。
Resources:
TargetTrackingPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
PolicyName: !Sub "${AWS::StackName}-target-tracking"
PolicyType: TargetTrackingScaling
AutoScalingGroupName: !Ref MyAutoScalingGroup
TargetTrackingConfiguration:
PredefinedMetricSpecification:
PredefinedMetricType: ASGAverageCPUUtilization
TargetValue: 70
DisableScaleIn: false
6. ライフサイクルフックを構成する
インスタンスを適切に管理するためのフックを実装します。
Resources:
LifecycleHookTermination:
Type: AWS::AutoScaling::LifecycleHook
Properties:
LifecycleHookName: !Sub "${AWS::StackName}-termination-hook"
AutoScalingGroupName: !Ref MyAutoScalingGroup
LifecycleTransition: autoscaling:EC2_INSTANCE_TERMINATING
HeartbeatTimeout: 300
NotificationTargetARN: !Ref SNSTopic
RoleARN: !Ref LifecycleHookRole
7. モニタリングを設定する
スケーリングのトリガーとなる CloudWatch アラームを構成します。
Resources:
HighCpuAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Sub "${AWS::StackName}-high-cpu"
MetricName: CPUUtilization
Namespace: AWS/EC2
Dimensions:
- Name: AutoScalingGroupName
Value: !Ref MyAutoScalingGroup
Statistic: Average
Period: 60
EvaluationPeriods: 3
Threshold: 70
ComparisonOperator: GreaterThanThreshold
8. 出力とスタック間参照を構成する
他のスタックで使用できるように ASG 設定をエクスポートします。
Outputs:
AutoScalingGroupName:
Description: Name of the Auto Scaling Group
Value: !Ref MyAutoScalingGroup
Export:
Name: !Sub "${AWS::StackName}-AutoScalingGroupName"
AutoScalingGroupArn:
Description: ARN of the Auto Scaling Group
Value: !GetAtt MyAutoScalingGroup.AutoScalingGroupArn
Export:
Name: !Sub "${AWS::StackName}-AutoScalingGroupArn"
例
Auto Scaling テンプレートの全体例
VPC、ASG、ALB、スケーリングポリシーを含む、エンドツーエンドのテンプレートです。
AWSTemplateFormatVersion: '2010-09-09'
Description: Auto Scaling Group with ALB integration
Parameters:
Environment:
Type: String
Default: production
InstanceType:
Type: AWS::EC2::Instance::Type
Default: t3.micro
AmiId:
Type: AWS::EC2::Image::Id
VpcId:
Type: AWS::EC2::VPC::Id
SubnetIds:
Type: List<AWS::EC2::Subnet::Id>
Resources:
InstanceSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security group for ASG instances
VpcId: !Ref VpcId
SecurityGroupEgress:
- CidrIp: 0.0.0.0/0
IpProtocol: "-1"
TargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Name: !Sub "${AWS::StackName}-tg"
Port: 80
Protocol: HTTP
VpcId: !Ref VpcId
HealthCheckPath: /health
TargetType: instance
LaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateName: !Sub "${AWS::StackName}-lt"
ImageId: !Ref AmiId
InstanceType: !Ref InstanceType
SecurityGroupIds:
- !Ref InstanceSecurityGroup
AutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
AutoScalingGroupName: !Sub "${AWS::StackName}-asg"
MinSize: 2
MaxSize: 10
DesiredCapacity: 4
LaunchTemplate:
LaunchTemplateId: !Ref LaunchTemplate
Version: !GetAtt LaunchTemplate.LatestVersionNumber
VPCZoneIdentifier: !Ref SubnetIds
TargetGroupARNs:
- !Ref TargetGroup
HealthCheckType: ELB
HealthCheckGracePeriod: 300
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-instance"
PropagateAtLaunch: true
ScalingPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
PolicyName: !Sub "${AWS::StackName}-cpu-policy"
PolicyType: TargetTrackingScaling
AutoScalingGroupName: !Ref AutoScalingGroup
TargetTrackingConfiguration:
PredefinedMetricSpecification:
PredefinedMetricType: ASGAverageCPUUtilization
TargetValue: 70
Outputs:
AutoScalingGroupName:
Value: !Ref AutoScalingGroup
Export:
Name: !Sub "${AWS::StackName}-ASG-Name"
検証コマンド
デプロイ前にテンプレートを検証し、変更をテストします。
# Validate CloudFormation template
aws cloudformation validate-template --template-body file://template.yaml
# Create change set to preview changes
aws cloudformation create-change-set \
--stack-name my-asg-stack \
--template-body file://template.yaml \
--change-set-type CREATE
# Describe change set
aws cloudformation describe-change-set \
--stack-name my-asg-stack \
--change-set-name <change-set-id>
# Execute change set
aws cloudformation execute-change-set \
--stack-name my-asg-stack \
--change-set-name <change-set-id>
確認コマンド
デプロイ後に ASG の正常性と設定を確認します。
# Describe Auto Scaling Groups
aws autoscaling describe-auto-scaling-groups \
--auto-scaling-group-names my-asg-stack-asg
# Check instance health
aws autoscaling describe-auto-scaling-instances \
--instance-ids <instance-id>
# Verify scaling policies
aws autoscaling describe-policies \
--auto-scaling-group-name my-asg-stack-asg
# Review scaling activities
aws autoscaling describe-scaling-activities \
--auto-scaling-group-name my-asg-stack-asg
制約と警告
リソースの上限
- ASG の最大サイズ:10000 インスタンス(これを超える場合は上限引き上げを申請してください)
- アカウントあたりの起動設定は最大 20 個(代わりに起動テンプレートを使用してください)
- ライフサイクルフック:ASG あたり 50 個
- スケーリングポリシー:ASG あたり 20 個(ターゲット追跡の上限)
- クールダウン期間:デフォルトは 300 秒(慎重に短縮してください)
運用上の警告
- 1 回の更新で、同じ ASG の起動設定と起動テンプレートの両方を更新しないでください
- 適切な更新とインスタンスのリフレッシュには、必ず
UpdatePolicyを使用してください HealthCheckGracePeriodは、想定されるインスタンスの初期化時間以上に設定してください- ライフサイクルフックのタイムアウトは、適切なシャットダウン処理に必要な時間を確保してください
- スポットインスタンス:予期しない終了を避けるため、
InstanceMaintenancePolicyを設定してください
セキュリティ上の警告
- 認証情報をハードコードせず、IAM インスタンスプロファイルを使用してください
- Auto Scaling 用のサービスリンクロール(
aws-autoscaling.amazonaws.com)を使用してください - 情報漏えいを防ぐため、ASG の describe 権限を制限してください
- EBS 暗号化用の KMS キーは、ASG と同じリージョンに作成する必要があります
- スタック間参照のエクスポート名は、リージョンごとに一意である必要があります
ベストプラクティス
高可用性
- 複数の AZ にインスタンスを分散させます
- ヘルスチェックを備えた ALB を使用して、自動ルーティングを行います
- 適切なシャットダウンのためにライフサイクルフックを実装します
- 適切な終了ポリシーを構成します
- 多様性を確保するために混合インスタンスポリシーを使用します
- 適切なヘルスチェック猶予期間を設定します
コスト最適化
- 障害に強いワークロードにはスポットインスタンスを使用します
- インスタンスの適正サイズ化を実施します
- 積極的なスケールインポリシーを構成します
- 予測可能なパターンにはスケジュールスケーリングを使用します
- 定期的にモニタリングし、最適化します
- 過剰なプロビジョニングを避けるため、適切な最小キャパシティを設定します
モニタリング
- 主要なメトリクスに対して CloudWatch アラームを作成します
- メトリクスに基づくスケーリングポリシーを実装します
- ログ記録と分析にライフサイクルフックを使用します
- スケーリングイベントの SNS 通知を設定します
- トラブルシューティングのために詳細なモニタリングを実装します
- 最適な応答のために複数のスケーリングポリシーを使用します
セキュリティ
- 最小権限のアクセス許可を持つ IAM ロールを使用します
- KMS で EBS ボリュームを暗号化します
- 制限の厳しいセキュリティグループを設定します
- 適切なサブネットを持つ VPC を使用します
- 機密性の高い設定には Parameter Store を実装します
- 広範なマネージドポリシーを避けます(具体的なアクセス許可を使用します)
- 適切なインスタンスプロファイルを設定します
参考資料
詳細な実装ガイダンスについては、以下を参照してください。
- constraints.md - リソース制限(ASG の制限、スケーリングポリシーの制限、ライフサイクルフックの制限)、スケーリングの制約(クールダウン期間、ヘルスチェックの猶予期間、最小/最大キャパシティ)、運用上の制約(混合インスタンスポリシー、予測スケーリング、インスタンス更新)、セキュリティ上の制約(IAM ロール、サービスにリンクされたロール、KMS のアクセス許可)、およびコストに関する考慮事項(Spot インスタンスの終了、過剰なプロビジョニング、スケーリング頻度)