AWS CloudFormation で Amazon EC2 Auto Scaling リソースを設定する - AWS CloudFormation

AWS CloudFormation で Amazon EC2 Auto Scaling リソースを設定する

以下の例では、Amazon EC2 Auto Scaling で使用するテンプレートに含めるさまざまなスニペットを示しています。

単一インスタンスの Auto Scaling グループを作成する

この例に示すのは、作業を進める際に役立つ、単一インスタンスに関連付けられた AWS::AutoScaling::AutoScalingGroup リソースです。Auto Scaling グループの VPCZoneIdentifier プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。LaunchTemplate プロパティは、テンプレートの他の場所で定義されている論理名 myLaunchTemplateAWS::EC2::LaunchTemplate リソースを参照します。

注記

起動テンプレートの例については、Amazon EC2 スニペットの「AWS CloudFormation を使用した起動テンプレートの作成」、および「AWS::EC2::LaunchTemplate リソース」の「Examples」のセクションを参照してください。

JSON

"myASG" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ], "LaunchTemplate" : { "LaunchTemplateId" : { "Ref" : "myLaunchTemplate" }, "Version" : { "Fn::GetAtt" : [ "myLaunchTemplate", "LatestVersionNumber" ] } }, "MaxSize" : "1", "MinSize" : "1" } }

YAML

myASG: Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: - subnetIdAz1 - subnetIdAz2 - subnetIdAz3 LaunchTemplate: LaunchTemplateId: !Ref myLaunchTemplate Version: !GetAtt myLaunchTemplate.LatestVersionNumber MaxSize: '1' MinSize: '1'

ロードバランサーがアタッチされた Auto Scaling グループを作成する

この例に示すのは、複数のサーバー間で負荷を分散する AWS::AutoScaling::AutoScalingGroup リソースです。また、同じテンプレートの他の場所で宣言された AWS リソースの論理名を指定します。

  1. VPCZoneIdentifier プロパティは、Auto Scaling グループの EC2 インスタンスが作成される 2 つの AWS::EC2::Subnet リソースの論理名を、次のように指定します: myPublicSubnet1myPublicSubnet2

  2. LaunchTemplate プロパティは、論理名が myLaunchTemplate である AWS::EC2::LaunchTemplate リソースを指定します。

  3. TargetGroupARNs プロパティは、トラフィックを Auto Scaling グループにルーティングするために使用される Application Load Balancer または Network Load Balancer のターゲットグループのリストを指定します。この例では、1 つのターゲットグループとして、論理名が myTargetGroup である AWS::ElasticLoadBalancingV2::TargetGroup リソースを指定しています。

JSON

"myServerGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "VPCZoneIdentifier" : [ { "Ref" : "myPublicSubnet1" }, { "Ref" : "myPublicSubnet2" } ], "LaunchTemplate" : { "LaunchTemplateId" : { "Ref" : "myLaunchTemplate" }, "Version" : { "Fn::GetAtt" : [ "myLaunchTemplate", "LatestVersionNumber" ] } }, "MaxSize" : "5", "MinSize" : "1", "TargetGroupARNs" : [ { "Ref" : "myTargetGroup" } ] } }

YAML

myServerGroup: Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: - !Ref myPublicSubnet1 - !Ref myPublicSubnet2 LaunchTemplate: LaunchTemplateId: !Ref myLaunchTemplate Version: !GetAtt myLaunchTemplate.LatestVersionNumber MaxSize: '5' MinSize: '1' TargetGroupARNs: - !Ref myTargetGroup

以下も参照してください。

Application Load Balancer の ALBRequestCountPerTarget 事前定義メトリクスに基づくターゲット追跡スケーリングポリシーを関連付けた Auto Scaling グループを作成する詳細な例については、「AWS::AutoScaling::ScalingPolicy リソース」の「」セクションを参照してください。

通知を使用する Auto Scaling グループを作成する

この例に示すのは、指定されたイベントが発生したときに Amazon SNS 通知を送信する AWS::AutoScaling::AutoScalingGroup リソースです。NotificationConfigurations プロパティは、AWS CloudFormation からの通知の送信先となる SNS トピックと、AWS CloudFormation が通知を送信するきっかけとなるイベントを指定します。NotificationTypes で指定したイベントが発生すると、AWS CloudFormation から TopicARN で指定した SNS トピックに通知が送信されます。スタックを起動すると、AWS CloudFormation は、同じテンプレート内で宣言された AWS::SNS::Subscription リソース (snsTopicForAutoScalingGroup) を作成します。

Auto Scaling グループの VPCZoneIdentifier プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。LaunchTemplate プロパティは、同じテンプレート内の別の場所で宣言された AWS::EC2::LaunchTemplate リソースの論理名を参照します。

JSON

"myASG" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "DependsOn": [ "snsTopicForAutoScalingGroup" ], "Properties" : { "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ], "LaunchTemplate" : { "LaunchTemplateId" : { "Ref" : "logicalName" }, "Version" : { "Fn::GetAtt" : [ "logicalName", "LatestVersionNumber" ] } }, "MaxSize" : "5", "MinSize" : "1", "NotificationConfigurations" : [ { "TopicARN" : { "Ref" : "snsTopicForAutoScalingGroup" }, "NotificationTypes" : [ "autoscaling:EC2_INSTANCE_LAUNCH", "autoscaling:EC2_INSTANCE_LAUNCH_ERROR", "autoscaling:EC2_INSTANCE_TERMINATE", "autoscaling:EC2_INSTANCE_TERMINATE_ERROR", "autoscaling:TEST_NOTIFICATION" ] } ] } }

YAML

myASG: Type: AWS::AutoScaling::AutoScalingGroup DependsOn: - snsTopicForAutoScalingGroup Properties: VPCZoneIdentifier: - subnetIdAz1 - subnetIdAz2 - subnetIdAz3 LaunchTemplate: LaunchTemplateId: !Ref logicalName Version: !GetAtt logicalName.LatestVersionNumber MaxSize: '5' MinSize: '1' NotificationConfigurations: - TopicARN: !Ref snsTopicForAutoScalingGroup NotificationTypes: - autoscaling:EC2_INSTANCE_LAUNCH - autoscaling:EC2_INSTANCE_LAUNCH_ERROR - autoscaling:EC2_INSTANCE_TERMINATE - autoscaling:EC2_INSTANCE_TERMINATE_ERROR - autoscaling:TEST_NOTIFICATION

CreationPolicyUpdatePolicy を使用する Auto Scaling グループを作成する

次の例では、AWS::AutoScaling::AutoScalingGroup リソースに CreationPolicy 属性UpdatePolicy の属性を追加する方法を示しています。

サンプルの作成ポリシーは、グループの準備ができたときに AWS CloudFormation が Count の数の成功シグナルを受信するまで、Auto Scaling グループが CREATE_COMPLETE のステータスに到達するのを防ぎます。Auto Scaling グループの準備ができたことを通知するために、起動テンプレートのユーザーデータ (図に示されていません) に追加された cfn-signal ヘルパースクリプトが、インスタンス上で実行されます。インスタンスが指定された Timeout 範囲内でシグナルを送信しない場合では、CloudFormation はインスタンスが作成されていないと想定し、リソースの作成は失敗し、CloudFormation はスタックをロールバックします。

サンプルの更新ポリシーでは、AutoScalingRollingUpdate プロパティを使用して、ローリング更新を実行するように CloudFormation に指示します。ローリング更新は、MaxBatchSize に基づいて小規模なバッチ (この例ではインスタンスごと) で Auto Scaling グループを変更し、PauseTime に基づいて更新のバッチ間の停止時間を変更します。MinInstancesInService 属性は、Auto Scaling が古いインスタンスを更新している間、CloudFormation グループ内で使用中となる必要があるインスタンスの最小数を指定します。

WaitOnResourceSignals 属性は true に設定しています。CloudFormation が更新を続行するには、指定された PauseTime 内に新しいインスタンスからシグナルを受け取る必要があります。スタックの更新の進行中、EC2 Auto Scaling プロセス HealthCheckReplaceUnhealthyAZRebalanceAlarmNotificationScheduledActions は一時停止されます。注: ローリング更新が適切に機能しなくなる可能性があるため、LaunchTerminate、または AddToLoadBalancer (Auto Scaling グループが Elastic Load Balancing で使用されている場合) タイプのプロセスを一時停止しないでください。

Auto Scaling グループの VPCZoneIdentifier プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。LaunchTemplate プロパティは、同じテンプレート内の別の場所で宣言された AWS::EC2::LaunchTemplate リソースの論理名を参照します。

JSON

{ "Resources":{ "myASG":{ "CreationPolicy":{ "ResourceSignal":{ "Count":"3", "Timeout":"PT15M" } }, "UpdatePolicy":{ "AutoScalingRollingUpdate":{ "MinInstancesInService":"3", "MaxBatchSize":"1", "PauseTime":"PT12M5S", "WaitOnResourceSignals":"true", "SuspendProcesses":[ "HealthCheck", "ReplaceUnhealthy", "AZRebalance", "AlarmNotification", "ScheduledActions", "InstanceRefresh" ] } }, "Type":"AWS::AutoScaling::AutoScalingGroup", "Properties":{ "VPCZoneIdentifier":[ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ], "LaunchTemplate":{ "LaunchTemplateId":{ "Ref":"logicalName" }, "Version":{ "Fn::GetAtt":[ "logicalName", "LatestVersionNumber" ] } }, "MaxSize":"5", "MinSize":"3" } } } }

YAML

--- Resources: myASG: CreationPolicy: ResourceSignal: Count: '3' Timeout: PT15M UpdatePolicy: AutoScalingRollingUpdate: MinInstancesInService: '3' MaxBatchSize: '1' PauseTime: PT12M5S WaitOnResourceSignals: true SuspendProcesses: - HealthCheck - ReplaceUnhealthy - AZRebalance - AlarmNotification - ScheduledActions - InstanceRefresh Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: - subnetIdAz1 - subnetIdAz2 - subnetIdAz3 LaunchTemplate: LaunchTemplateId: !Ref logicalName Version: !GetAtt logicalName.LatestVersionNumber MaxSize: '5' MinSize: '3'

ステップスケーリングポリシーを作成する

この例に示すのは、ステップスケーリングポリシーを使用して Auto Scaling グループをスケールアウトする AWS::AutoScaling::ScalingPolicy リソースです。AdjustmentType プロパティには、ChangeInCapacity が指定されています。この場合、ScalingAdjustment は、追加 (ScalingAdjustment が正数の場合) または削除 (負数の場合) するインスタンスの数を表します。この例では、ScalingAdjustment は 1 です。したがって、アラームのしきい値に対して違反があると、ポリシーが実行されて、グループ内の EC2 インスタンスの数が 1 つ増やされます。

AWS::CloudWatch::Alarm リソース CPUAlarmHigh は、アラームが ALARM 状態 (AlarmActions) になったときに実行するアクションとして、スケーリングポリシー ASGScalingPolicyHigh を指定します。Dimensions プロパティは、同じテンプレート内の別の場所で宣言された AWS::AutoScaling::AutoScalingGroup リソースの論理名を参照します。

JSON

{ "Resources":{ "ASGScalingPolicyHigh":{ "Type":"AWS::AutoScaling::ScalingPolicy", "Properties":{ "AutoScalingGroupName":{ "Ref":"logicalName" }, "PolicyType":"StepScaling", "AdjustmentType":"ChangeInCapacity", "StepAdjustments":[ { "MetricIntervalLowerBound":0, "ScalingAdjustment":1 } ] } }, "CPUAlarmHigh":{ "Type":"AWS::CloudWatch::Alarm", "Properties":{ "EvaluationPeriods":"2", "Statistic":"Average", "Threshold":"90", "AlarmDescription":"Scale out if CPU > 90% for 2 minutes", "Period":"60", "AlarmActions":[ { "Ref":"ASGScalingPolicyHigh" } ], "Namespace":"AWS/EC2", "Dimensions":[ { "Name":"AutoScalingGroupName", "Value":{ "Ref":"logicalName" } } ], "ComparisonOperator":"GreaterThanThreshold", "MetricName":"CPUUtilization" } } } }

YAML

--- Resources: ASGScalingPolicyHigh: Type: AWS::AutoScaling::ScalingPolicy Properties: AutoScalingGroupName: !Ref logicalName PolicyType: StepScaling AdjustmentType: ChangeInCapacity StepAdjustments: - MetricIntervalLowerBound: 0 ScalingAdjustment: 1 CPUAlarmHigh: Type: AWS::CloudWatch::Alarm Properties: EvaluationPeriods: 2 Statistic: Average Threshold: 90 AlarmDescription: 'Scale out if CPU > 90% for 2 minutes' Period: 60 AlarmActions: - !Ref ASGScalingPolicyHigh Namespace: AWS/EC2 Dimensions: - Name: AutoScalingGroupName Value: !Ref logicalName ComparisonOperator: GreaterThanThreshold MetricName: CPUUtilization

以下も参照してください。

スケーリングポリシーのテンプレート例については、「AWS::AutoScaling::ScalingPolicy リソース」の「」セクションを参照してください。

混合インスタンスグループの例

属性ベースのインスタンスタイプの選択を使用して Auto Scaling グループを作成する

この例に示すのは、属性ベースのインスタンスタイプを使って混合インスタンスグループを起動するための情報を含む、AWS::AutoScaling::AutoScalingGroup リソースです。VCpuCount プロパティの最小値と最大値を、および MemoryMiB プロパティの最小値を指定します。Auto Scaling グループで使用されるインスタンスタイプはいずれも、必要なインスタンス属性と一致している必要があります。

Auto Scaling グループの VPCZoneIdentifier プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。LaunchTemplate プロパティは、同じテンプレート内の別の場所で宣言された AWS::EC2::LaunchTemplate リソースの論理名を参照します。

JSON

{ "Resources":{ "myASG":{ "Type":"AWS::AutoScaling::AutoScalingGroup", "Properties":{ "VPCZoneIdentifier":[ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ], "MixedInstancesPolicy":{ "LaunchTemplate":{ "LaunchTemplateSpecification":{ "LaunchTemplateId":{ "Ref":"logicalName" }, "Version":{ "Fn::GetAtt":[ "logicalName", "LatestVersionNumber" ] } }, "Overrides":[ { "InstanceRequirements":{ "VCpuCount":{ "Min":2, "Max":4 }, "MemoryMiB":{ "Min":2048 } } } ] } }, "MaxSize":"5", "MinSize":"1" } } } }

YAML

--- Resources: myASG: Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: - subnetIdAz1 - subnetIdAz2 - subnetIdAz3 MixedInstancesPolicy: LaunchTemplate: LaunchTemplateSpecification: LaunchTemplateId: !Ref logicalName Version: !GetAtt logicalName.LatestVersionNumber Overrides: - InstanceRequirements: VCpuCount: Min: 2 Max: 4 MemoryMiB: Min: 2048 MaxSize: '5' MinSize: '1'

起動構成の例

「起動設定を作成する」

この例に示すのは、ImageIdInstanceTypeSecurityGroups プロパティの値を指定する、Auto Scaling グループの AWS::AutoScaling::LaunchConfiguration リソースです。SecurityGroups プロパティは、テンプレート内の他の場所で指定されている AWS::EC2::SecurityGroup リソースの論理名と、myExistingEC2SecurityGroup という既存の EC2 セキュリティグループの両方を指定します。

JSON

"mySimpleConfig" : { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Properties" : { "ImageId" : "ami-02354e95b3example", "InstanceType" : "t3.micro", "SecurityGroups" : [ { "Ref" : "logicalName" }, "myExistingEC2SecurityGroup" ] } }

YAML

mySimpleConfig: Type: AWS::AutoScaling::LaunchConfiguration Properties: ImageId: ami-02354e95b3example InstanceType: t3.micro SecurityGroups: - !Ref logicalName - myExistingEC2SecurityGroup

起動設定を使用して Auto Scaling グループを作成する

この例に示すのは、単一インスタンスに関連付けられた AWS::AutoScaling::AutoScalingGroup リソースです。Auto Scaling グループの VPCZoneIdentifier プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。LaunchConfigurationName プロパティは、論理名がテンプレート内で定義された mySimpleConfig である、AWS::AutoScaling::LaunchConfiguration リソースを参照します。

JSON

"myASG" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ], "LaunchConfigurationName" : { "Ref" : "mySimpleConfig" }, "MaxSize" : "1", "MinSize" : "1" } }

YAML

myASG: Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: - subnetIdAz1 - subnetIdAz2 - subnetIdAz3 LaunchConfigurationName: !Ref mySimpleConfig MaxSize: '1' MinSize: '1'