mcpField
A
aws-cloudformation-auto-scaling

aws-cloudformation-auto-scaling

github.com/giuseppe-trisciuoglioクラウド・DevOps36565 回インストール7 週間前に更新
リポジトリ

aws-cloudformation-auto-scaling について

AWS CloudFormation でスケーラブルなインフラを構築する開発者向けのスキルです。EC2、ECS、Lambda の Auto Scaling を対象に、グループ、ポリシー、ライフサイクルフック、監視、高可用性の実践を扱います。

主な機能

  1. 01EC2 Auto Scaling グループの作成
  2. 02起動テンプレートとスケーリングポリシーの設定
  3. 03ECS サービスと Lambda のスケーリング設定
  4. 04ライフサイクルフックと CloudWatch アラームの追加
  5. 05テンプレート出力とクロススタック参照の整理

活用シーン

  1. 01EC2 ワークロードの弾力的な容量構築
  2. 02メトリクスに基づくターゲット追跡の設定
  3. 03ライフサイクルフックによるインスタンス終了管理
  4. 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.md
examples.md
reference.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 インスタンスの終了、過剰なプロビジョニング、スケーリング頻度)

関連リソース

コメント