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 리소스의 섹션을 참조하세요.

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 인스턴스가 생성될 두 AWS::EC2::Subnet 리소스의 논리명인 myPublicSubnet1myPublicSubnet2를 지정합니다.

  2. LaunchTemplate 속성은 논리명이 myLaunchTemplateAWS::EC2::LaunchTemplate 리소스를 지정합니다.

  3. TargetGroupARNs 속성은 트래픽을 Auto Scaling 그룹으로 라우팅하는 데 사용되는 Application Load Balancer 또는 Network Load Balancer의 대상 그룹을 나열합니다. 이 예에서는 논리명이 myTargetGroupAWS::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 속성을 추가하는 방법을 보여줍니다.

샘플 생성 정책은 auto scaling이 준비가 되면 AWS CloudFormation이 Count 개수의 성공 신호를 받을 때까지 CREATE_COMPLETE 상태가 되지 않도록 합니다. auto scaling이 준비되었음을 알리기 위해 시작 템플릿의 사용자 데이터(표시되지 않음)에 추가된 cfn-signal 헬퍼 스크립트가 인스턴스에서 실행됩니다. 인스턴스가 지정된 Timeout 내에 신호를 보내지 않으면 CloudFormation은 인스턴스가 생성되지 않은 것으로 가정하고, 리소스 생성이 실패하고, CloudFormation은 스택을 롤백합니다.

샘플 업데이트 정책은 CloudFormation에 AutoScalingRollingUpdate 속성을 사용하여 롤링 업데이트를 수행하도록 지시합니다. 롤링 업데이트는 MaxBatchSize에 기반한 작은 배치(이 예에서는 인스턴스 단위)의 Auto Scaling 그룹, PauseTime에 기반한 업데이트의 배치 간 일시 중지 시간을 변경합니다. MinInstancesInService 속성은 CloudFormation에서 이전 인스턴스를 업데이트하는 동안 Auto Scaling 그룹 내에서 작동해야 하는 최소 인스턴스 수를 지정합니다.

WaitOnResourceSignals 속성이 true로 설정되어 있습니다. 업데이트를 계속 진행하려면 CloudFormation이 지정된 PauseTime 내에 각각의 새 인스턴스로부터 신호를 수신해야 합니다. 스택 업데이트가 진행되는 동안 HealthCheck, ReplaceUnhealthy, AZRebalance, AlarmNotificationScheduledActions 같은 EC2 Auto Scaling 프로세스가 일시 중단됩니다. 참고: 이 경우 롤링 업데이트가 제대로 작동하지 않을 수 있으므로 Launch, Terminate 또는 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'

시작 구성 예제

시작 구성 생성

이 예에서는 ImageId, InstanceType, SecurityGroups 속성에 대한 값을 지정하는 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 속성은 템플릿에 정의된 논리명이 mySimpleConfigAWS::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'