메뉴
AWS CloudFormation
사용 설명서 (API Version 2010-05-15)

연습: 확장 가능한 로드 밸런싱 웹 서버 생성

이 템플릿은 Auto Scaling 및 Elastic Load Balancing을 사용하고 여러 가용 영역을 사용하도록 구성된 샘플 웹 사이트를 생성합니다. 또한 이 템플릿에 포함된 CloudWatch 경보는 정의된 임계값을 초과할 때 Auto Scaling 정책을 실행하여 Auto Scaling 그룹에 인스턴스를 추가하거나 제거합니다.

이 템플릿은 하나 이상의 Amazon EC2 인스턴스를 생성합니다. 이 템플릿에서 스택을 생성할 경우 사용한 AWS 리소스에 대한 요금이 청구됩니다.

참고

이 템플릿에서는 해당 계정이 EC2-VPC 플랫폼을 지원하는 것으로 가정합니다. 다시 말해, 인스턴스에서 인터넷에 액세스할 수 있도록 하는 기본 VPC가 있습니다. 기본 VPC 인증서가 없는 경우 하나를 생성할 수 있습니다. 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서Amazon EC2 및 Amazon Virtual Private Cloud를 참조하십시오.

https://s3.amazonaws.com/cloudformation-templates-us-east-1/AutoScalingMultiAZWithNotifications.template에서 이 샘플 템플릿의 최신 버전을 받을 수 있습니다.

Auto Scaling Multi-AZ 템플릿

Copy
{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "AWS CloudFormation Sample Template AutoScalingMultiAZWithNotifications: Create a multi-az, load balanced and Auto Scaled sample web site running on an Apache Web Serever. The application is configured to span all Availability Zones in the region and is Auto-Scaled based on the CPU utilization of the web servers. Notifications will be sent to the operator email address on scaling events. The instances are load balanced with a simple health check against the default web page. **WARNING** This template creates one or more Amazon EC2 instances and an Elastic Load Balancer. You will be billed for the AWS resources used if you create a stack from this template.", "Parameters" : { "InstanceType" : { "Description" : "WebServer EC2 instance type", "Type" : "String", "Default" : "t2.small", "AllowedValues" : [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge"] , "ConstraintDescription" : "must be a valid EC2 instance type." }, "OperatorEMail": { "Description": "EMail address to notify if there are any scaling operations", "Type": "String", "AllowedPattern": "([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)", "ConstraintDescription": "must be a valid email address." }, "KeyName" : { "Description" : "The EC2 Key Pair to allow SSH access to the instances", "Type" : "AWS::EC2::KeyPair::KeyName", "ConstraintDescription" : "must be the name of an existing EC2 KeyPair." }, "SSHLocation" : { "Description" : "The IP address range that can be used to SSH to the EC2 instances", "Type": "String", "MinLength": "9", "MaxLength": "18", "Default": "0.0.0.0/0", "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})", "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x." } }, "Mappings" : { "Region2Examples" : { "us-east-1" : { "Examples" : "https://s3.amazonaws.com/cloudformation-examples-us-east-1" }, "us-west-2" : { "Examples" : "https://s3-us-west-2.amazonaws.com/cloudformation-examples-us-west-2" }, "us-west-1" : { "Examples" : "https://s3-us-west-1.amazonaws.com/cloudformation-examples-us-west-1" }, "eu-west-1" : { "Examples" : "https://s3-eu-west-1.amazonaws.com/cloudformation-examples-eu-west-1" }, "eu-west-2" : { "Examples" : "https://s3-eu-west-2.amazonaws.com/cloudformation-examples-eu-west-2" }, "eu-central-1" : { "Examples" : "https://s3-eu-central-1.amazonaws.com/cloudformation-examples-eu-central-1" }, "ap-southeast-1" : { "Examples" : "https://s3-ap-southeast-1.amazonaws.com/cloudformation-examples-ap-southeast-1" }, "ap-northeast-1" : { "Examples" : "https://s3-ap-northeast-1.amazonaws.com/cloudformation-examples-ap-northeast-1" }, "ap-northeast-2" : { "Examples" : "https://s3-ap-northeast-2.amazonaws.com/cloudformation-examples-ap-northeast-2" }, "ap-southeast-2" : { "Examples" : "https://s3-ap-southeast-2.amazonaws.com/cloudformation-examples-ap-southeast-2" }, "ap-south-1" : { "Examples" : "https://s3-ap-south-1.amazonaws.com/cloudformation-examples-ap-south-1" }, "us-east-2" : { "Examples" : "https://s3-us-east-2.amazonaws.com/cloudformation-examples-us-east-2" }, "ca-central-1" : { "Examples" : "https://s3-ca-central-1.amazonaws.com/cloudformation-examples-ca-central-1" }, "sa-east-1" : { "Examples" : "https://s3-sa-east-1.amazonaws.com/cloudformation-examples-sa-east-1" }, "cn-north-1" : { "Examples" : "https://s3.cn-north-1.amazonaws.com.cn/cloudformation-examples-cn-north-1" } } , "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "PV64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "PV64" }, "m1.medium" : { "Arch" : "PV64" }, "m1.large" : { "Arch" : "PV64" }, "m1.xlarge" : { "Arch" : "PV64" }, "m2.xlarge" : { "Arch" : "PV64" }, "m2.2xlarge" : { "Arch" : "PV64" }, "m2.4xlarge" : { "Arch" : "PV64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "PV64" }, "c1.xlarge" : { "Arch" : "PV64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSInstanceType2NATArch" : { "t1.micro" : { "Arch" : "NATPV64" }, "t2.nano" : { "Arch" : "NATHVM64" }, "t2.micro" : { "Arch" : "NATHVM64" }, "t2.small" : { "Arch" : "NATHVM64" }, "t2.medium" : { "Arch" : "NATHVM64" }, "t2.large" : { "Arch" : "NATHVM64" }, "m1.small" : { "Arch" : "NATPV64" }, "m1.medium" : { "Arch" : "NATPV64" }, "m1.large" : { "Arch" : "NATPV64" }, "m1.xlarge" : { "Arch" : "NATPV64" }, "m2.xlarge" : { "Arch" : "NATPV64" }, "m2.2xlarge" : { "Arch" : "NATPV64" }, "m2.4xlarge" : { "Arch" : "NATPV64" }, "m3.medium" : { "Arch" : "NATHVM64" }, "m3.large" : { "Arch" : "NATHVM64" }, "m3.xlarge" : { "Arch" : "NATHVM64" }, "m3.2xlarge" : { "Arch" : "NATHVM64" }, "m4.large" : { "Arch" : "NATHVM64" }, "m4.xlarge" : { "Arch" : "NATHVM64" }, "m4.2xlarge" : { "Arch" : "NATHVM64" }, "m4.4xlarge" : { "Arch" : "NATHVM64" }, "m4.10xlarge" : { "Arch" : "NATHVM64" }, "c1.medium" : { "Arch" : "NATPV64" }, "c1.xlarge" : { "Arch" : "NATPV64" }, "c3.large" : { "Arch" : "NATHVM64" }, "c3.xlarge" : { "Arch" : "NATHVM64" }, "c3.2xlarge" : { "Arch" : "NATHVM64" }, "c3.4xlarge" : { "Arch" : "NATHVM64" }, "c3.8xlarge" : { "Arch" : "NATHVM64" }, "c4.large" : { "Arch" : "NATHVM64" }, "c4.xlarge" : { "Arch" : "NATHVM64" }, "c4.2xlarge" : { "Arch" : "NATHVM64" }, "c4.4xlarge" : { "Arch" : "NATHVM64" }, "c4.8xlarge" : { "Arch" : "NATHVM64" }, "g2.2xlarge" : { "Arch" : "NATHVMG2" }, "g2.8xlarge" : { "Arch" : "NATHVMG2" }, "r3.large" : { "Arch" : "NATHVM64" }, "r3.xlarge" : { "Arch" : "NATHVM64" }, "r3.2xlarge" : { "Arch" : "NATHVM64" }, "r3.4xlarge" : { "Arch" : "NATHVM64" }, "r3.8xlarge" : { "Arch" : "NATHVM64" }, "i2.xlarge" : { "Arch" : "NATHVM64" }, "i2.2xlarge" : { "Arch" : "NATHVM64" }, "i2.4xlarge" : { "Arch" : "NATHVM64" }, "i2.8xlarge" : { "Arch" : "NATHVM64" }, "d2.xlarge" : { "Arch" : "NATHVM64" }, "d2.2xlarge" : { "Arch" : "NATHVM64" }, "d2.4xlarge" : { "Arch" : "NATHVM64" }, "d2.8xlarge" : { "Arch" : "NATHVM64" }, "hi1.4xlarge" : { "Arch" : "NATHVM64" }, "hs1.8xlarge" : { "Arch" : "NATHVM64" }, "cr1.8xlarge" : { "Arch" : "NATHVM64" }, "cc2.8xlarge" : { "Arch" : "NATHVM64" } } , "AWSRegionArch2AMI" : { "us-east-1" : {"PV64" : "ami-2a69aa47", "HVM64" : "ami-6869aa05", "HVMG2" : "ami-a41a3fb3"}, "us-west-2" : {"PV64" : "ami-7f77b31f", "HVM64" : "ami-7172b611", "HVMG2" : "ami-caf253aa"}, "us-west-1" : {"PV64" : "ami-a2490dc2", "HVM64" : "ami-31490d51", "HVMG2" : "ami-00347e60"}, "eu-west-1" : {"PV64" : "ami-4cdd453f", "HVM64" : "ami-f9dd458a", "HVMG2" : "ami-e2f7bd91"}, "eu-west-2" : {"PV64" : "NOT_SUPPORTED", "HVM64" : "ami-886369ec", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"PV64" : "ami-6527cf0a", "HVM64" : "ami-ea26ce85", "HVMG2" : "ami-d2ff04bd"}, "ap-northeast-1" : {"PV64" : "ami-3e42b65f", "HVM64" : "ami-374db956", "HVMG2" : "ami-4c78d52d"}, "ap-northeast-2" : {"PV64" : "NOT_SUPPORTED", "HVM64" : "ami-2b408b45", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"PV64" : "ami-df9e4cbc", "HVM64" : "ami-a59b49c6", "HVMG2" : "ami-f3f95990"}, "ap-southeast-2" : {"PV64" : "ami-63351d00", "HVM64" : "ami-dc361ebf", "HVMG2" : "ami-3a122e59"}, "ap-south-1" : {"PV64" : "NOT_SUPPORTED", "HVM64" : "ami-ffbdd790", "HVMG2" : "ami-21a7d34e"}, "us-east-2" : {"PV64" : "NOT_SUPPORTED", "HVM64" : "ami-f6035893", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"PV64" : "NOT_SUPPORTED", "HVM64" : "ami-730ebd17", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"PV64" : "ami-1ad34676", "HVM64" : "ami-6dd04501", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"PV64" : "ami-77559f1a", "HVM64" : "ami-8e6aa0e3", "HVMG2" : "NOT_SUPPORTED"} } }, "Resources" : { "NotificationTopic": { "Type": "AWS::SNS::Topic", "Properties": { "Subscription": [ { "Endpoint": { "Ref": "OperatorEMail" }, "Protocol": "email" } ] } }, "WebServerGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "AvailabilityZones" : { "Fn::GetAZs" : ""}, "LaunchConfigurationName" : { "Ref" : "LaunchConfig" }, "MinSize" : "1", "MaxSize" : "3", "LoadBalancerNames" : [ { "Ref" : "ElasticLoadBalancer" } ], "NotificationConfiguration" : { "TopicARN" : { "Ref" : "NotificationTopic" }, "NotificationTypes" : [ "autoscaling:EC2_INSTANCE_LAUNCH", "autoscaling:EC2_INSTANCE_LAUNCH_ERROR", "autoscaling:EC2_INSTANCE_TERMINATE", "autoscaling:EC2_INSTANCE_TERMINATE_ERROR"] } }, "CreationPolicy" : { "ResourceSignal" : { "Timeout" : "PT15M", "Count" : "1" } }, "UpdatePolicy": { "AutoScalingRollingUpdate": { "MinInstancesInService": "1", "MaxBatchSize": "1", "PauseTime" : "PT15M", "WaitOnResourceSignals": "true" } } }, "LaunchConfig" : { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Metadata" : { "Comment" : "Install a simple application", "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [] } }, "files" : { "/var/www/html/index.html" : { "content" : { "Fn::Join" : ["\n", [ "<img src=\"", {"Fn::FindInMap" : ["Region2Examples", {"Ref" : "AWS::Region"}, "Examples"]}, "/cloudformation_graphic.png\" alt=\"AWS CloudFormation Logo\"/>", "<h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>" ]]}, "mode" : "000644", "owner" : "root", "group" : "root" }, "/etc/cfn/cfn-hup.conf" : { "content" : { "Fn::Join" : ["", [ "[main]\n", "stack=", { "Ref" : "AWS::StackId" }, "\n", "region=", { "Ref" : "AWS::Region" }, "\n" ]]}, "mode" : "000400", "owner" : "root", "group" : "root" }, "/etc/cfn/hooks.d/cfn-auto-reloader.conf" : { "content": { "Fn::Join" : ["", [ "[cfn-auto-reloader-hook]\n", "triggers=post.update\n", "path=Resources.LaunchConfig.Metadata.AWS::CloudFormation::Init\n", "action=/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource LaunchConfig ", " --region ", { "Ref" : "AWS::Region" }, "\n", "runas=root\n" ]]} } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" }, "cfn-hup" : { "enabled" : "true", "ensureRunning" : "true", "files" : ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]} } } } } }, "Properties" : { "KeyName" : { "Ref" : "KeyName" }, "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }, "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ], "InstanceType" : { "Ref" : "InstanceType" }, "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -xe\n", "yum update -y aws-cfn-bootstrap\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource LaunchConfig ", " --region ", { "Ref" : "AWS::Region" }, "\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerGroup ", " --region ", { "Ref" : "AWS::Region" }, "\n" ]]}} } }, "WebServerScaleUpPolicy" : { "Type" : "AWS::AutoScaling::ScalingPolicy", "Properties" : { "AdjustmentType" : "ChangeInCapacity", "AutoScalingGroupName" : { "Ref" : "WebServerGroup" }, "Cooldown" : "60", "ScalingAdjustment" : "1" } }, "WebServerScaleDownPolicy" : { "Type" : "AWS::AutoScaling::ScalingPolicy", "Properties" : { "AdjustmentType" : "ChangeInCapacity", "AutoScalingGroupName" : { "Ref" : "WebServerGroup" }, "Cooldown" : "60", "ScalingAdjustment" : "-1" } }, "CPUAlarmHigh": { "Type": "AWS::CloudWatch::Alarm", "Properties": { "AlarmDescription": "Scale-up if CPU > 90% for 10 minutes", "MetricName": "CPUUtilization", "Namespace": "AWS/EC2", "Statistic": "Average", "Period": "300", "EvaluationPeriods": "2", "Threshold": "90", "AlarmActions": [ { "Ref": "WebServerScaleUpPolicy" } ], "Dimensions": [ { "Name": "AutoScalingGroupName", "Value": { "Ref": "WebServerGroup" } } ], "ComparisonOperator": "GreaterThanThreshold" } }, "CPUAlarmLow": { "Type": "AWS::CloudWatch::Alarm", "Properties": { "AlarmDescription": "Scale-down if CPU < 70% for 10 minutes", "MetricName": "CPUUtilization", "Namespace": "AWS/EC2", "Statistic": "Average", "Period": "300", "EvaluationPeriods": "2", "Threshold": "70", "AlarmActions": [ { "Ref": "WebServerScaleDownPolicy" } ], "Dimensions": [ { "Name": "AutoScalingGroupName", "Value": { "Ref": "WebServerGroup" } } ], "ComparisonOperator": "LessThanThreshold" } }, "ElasticLoadBalancer" : { "Type" : "AWS::ElasticLoadBalancing::LoadBalancer", "Properties" : { "AvailabilityZones" : { "Fn::GetAZs" : "" }, "CrossZone" : "true", "Listeners" : [ { "LoadBalancerPort" : "80", "InstancePort" : "80", "Protocol" : "HTTP" } ], "HealthCheck" : { "Target" : "HTTP:80/", "HealthyThreshold" : "3", "UnhealthyThreshold" : "5", "Interval" : "30", "Timeout" : "5" } } }, "InstanceSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable SSH access and HTTP from the load balancer only", "SecurityGroupIngress" : [ { "IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"} }, { "IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "SourceSecurityGroupOwnerId" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.OwnerAlias"]}, "SourceSecurityGroupName" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.GroupName"]} } ] } } }, "Outputs" : { "URL" : { "Description" : "The URL of the website", "Value" : { "Fn::Join" : [ "", [ "http://", { "Fn::GetAtt" : [ "ElasticLoadBalancer", "DNSName" ]}]]} } } }

템플릿 연습

예제 템플릿에는 LoadBalancer를 사용하는 Auto Scaling 그룹이 포함됩니다. 이 그룹은 수신 규칙, CloudWatch 경보 및 Auto Scaling 정책을 정의하는 보안 그룹입니다.

템플릿에는 세 개의 입력 파라미터가 있습니다. InstanceType은 Auto Scaling 그룹에 사용하는 EC2 인스턴스의 유형이며 기본값은 m1.small입니다. WebServerPort는 웹 서버용 TCP 포트이며 기본값은 8888입니다. KeyName은 Auto Scaling 그룹에 사용할 EC2 키 페어의 이름입니다. 스택을 생성할 때 KeyName을 지정해야 합니다(스택 생성 시 기본값이 없는 파라미터를 지정해야 함).

AWS::AutoScaling::AutoScalingGroup 리소스 WebServerGroup은 다음 Auto Scaling 그룹 구성을 선언합니다.

  • AvailabilityZones는 Auto Scaling 그룹의 EC2 인스턴스가 생성될 가용 영역을 지정합니다. Fn::GetAZs 함수 호출 { "Fn::GetAZs" : "" }는 스택이 생성되는 리전의 모든 가용 영역을 지정합니다.

  • MinSizeMaxSize는 Auto Scaling 그룹의 최소 및 최대 EC2 인스턴스 수를 설정합니다.

  • LoadBalancerNames는 Auto Scaling 그룹으로 트래픽을 라우팅하는 데 사용되는 LoadBalancer를 나열합니다. 이 그룹의 LoadBalancer는 ElasticLoadBalancer 리소스입니다.

AWS::AutoScaling::LaunchConfiguration 리소스 LaunchConfig는 WebServerGroup Auto Scaling 그룹의 EC2 인스턴스에 사용하기 위해 다음 구성을 선언합니다.

  • KeyName은 사용할 EC2 키 페어로 KeyName 입력 파라미터의 값을 가져옵니다.

  • UserData는 애플리케이션에 전달되는 WebServerPort 파라미터의 Base64 인코딩 값입니다.

  • SecurityGroups는 Auto Scaling 그룹의 EC2 인스턴스에 대한 방화벽 수신 규칙이 포함된 EC2 보안 그룹의 목록입니다. 이 예제에는 보안 그룹이 하나만 있으며, 이 그룹을 AWS::EC2::SecurityGroup 리소스: InstanceSecurityGroup으로 선언합니다. 이 보안 그룹에는 1) 모든 IP 주소("CidrIp" : "0.0.0.0/0")에서 포트 22(SSH 액세스용)에 액세스할 수 있도록 하는 TCP 수신 규칙 및 2) LoadBalancer의 소스 보안 그룹을 지정하여 ElasticLoadBalancer 리소스에서 WebServerPort 포트에 액세스할 수 있도록 하는 TCP 수신 규칙 등 두 가지 수신 규칙이 포함됩니다. GetAtt 함수는 ElasticLoadBalancer 리소스에서 SourceSecurityGroup.OwnerAlias 및 SourceSecurityGroup.GroupName 속성을 가져오는 데 사용됩니다. Elastic Load Balancing 보안 그룹에 대한 자세한 내용은 Amazon EC2-Classic에서 보안 그룹 관리 또는 Amazon VPC에서 보안 그룹 관리를 참조하십시오.

  • ImageId는 중첩 맵 세트의 평가된 값입니다. 올바른 이미지 ID를 선택하기 위한 로직이 템플릿에 포함되도록 맵을 추가했습니다. 이 로직은 InstanceType 파라미터(AWSInstanceType2Arch는 인스턴스 유형을 아키텍처 32 또는 64에 매핑) 및 스택이 생성되는 리전(AWSRegionArch2AMI는 리전과 아키텍처를 이미지 ID에 매핑)을 사용하여 지정된 인스턴스 유형을 기반으로 합니다.

    Copy
    { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ]}

    예를 들어, 이 템플릿을 사용하여 us-east-2 리전에서 스택을 생성하고 m1.small을 InstanceType으로 지정하면 AWS CloudFormation은 AWSInstanceType2Arch의 내부 맵을 다음과 같이 평가합니다.

    Copy
    { "Fn::FindInMap" : [ "AWSInstanceType2Arch", "m1.small", "Arch" ] }

    AWSInstanceType2Arch 매핑에서 m1.small 키의 Arch 값은 32로 매핑되고, 이것을 외부 맵의 값으로 사용합니다. 키는 스택이 생성되는 리전인 AWS::Region 가상 파라미터의 평가된 값입니다. 예를 들어, AWS::Region은 us-east-1입니다. 따라서 외부 맵은 다음과 같이 평가됩니다.

    Copy
    Fn::FindInMap" : [ "AWSRegionArch2AMI", "us-east-1", "32"]

    AWSRegionArch2AMI 매핑에서 us-east-1 키의 값 32는 ami-6411e20d에 매핑됩니다. 따라서 ImageId는 ami-6411e20d가 됩니다.

AWS::ElasticLoadBalancing::LoadBalancer 리소스 ElasticLoadBalancer는 다음 LoadBalancer 구성을 선언합니다.

  • AvailabilityZones는 LoadBalancer가 트래픽을 분산하는 가용 영역의 목록입니다. 이 예에서 Fn::GetAZs 함수 호출 { "Fn::GetAZs" : "" }는 스택이 생성되는 리전의 모든 가용 영역을 지정합니다.

  • Listeners는 LoadBalancer가 요청을 수락하는 포트, LoadBalancer가 요청을 전달하는 등록된 EC2 인스턴스의 포트, 요청 라우팅을 위한 프로토콜을 지정하는 로드 밸런싱 라우팅 구성의 목록입니다.

  • HealthCheck는 Elastic Load Balancing에서 LoadBalancer가 트래픽을 라우팅하는 EC2 인스턴스의 상태를 확인하기 위한 구성입니다. 이 예에서 HealthCheck의 대상은 HTTP 프로토콜을 통해 WebServerPort에서 지정된 포트를 사용하는 EC2 인스턴스의 루트 주소입니다. WebServerPort가 8888인 경우 { "Fn::Join" : [ "", ["HTTP:", { "Ref" : "WebServerPort" }, "/"]]} 함수 호출은 문자열 HTTP:8888/로 평가됩니다. 또한 이 함수 호출은 EC2 인스턴스에서 상태 확인 간에 30초의 간격(Interval)을 두도록 합니다. Timeout은 Elastic Load Balancing이 상태를 확인할 대상의 응답을 기다리는 시간의 길이로 정의됩니다(이 예에서는 5초). Timeout 기간이 지난 후에는 Elastic Load Balancing이 EC2 인스턴스의 상태 확인을 비정상으로 표시합니다. EC2 인스턴스가 5회 연속으로 상태 확인에 실패하면(UnhealthyThreshold) Elastic Load Balancing은 해당 EC2 인스턴스에 대한 트래픽 라우팅을 중지합니다. 인스턴스의 상태가 3회 연속 정상으로 확인되면 Elastic Load Balancing은 이 EC2 인스턴스를 정상으로 간주하고 해당 인스턴스에 대한 트래픽 라우팅을 다시 시작합니다.

AWS::AutoScaling::ScalingPolicy 리소스 WebServerScaleUpPolicy는 Auto Scaling 그룹 WebServerGroup을 확장하는 Auto Scaling 정책입니다. AdjustmentType 속성은 ChangeInCapacity로 설정됩니다. 따라서 ScalingAdjustment는 추가할 인스턴스 수를 나타냅니다(ScalingAdjustment가 양수인 경우 인스턴스가 추가되고, 음수인 경우 인스턴스가 삭제됨). 이 예에서 ScalingAdjustment는 1입니다. 따라서 정책을 실행하면 그룹의 EC2 인스턴스 수가 1씩 증가합니다. Cooldown 속성은 Auto Scaling이 다른 정책을 시작하거나 관련 작업을 트리거하기 전에 60초 동안 대기하도록 지정합니다.

AWS::CloudWatch::Alarm 리소스 CPUAlarmHigh는 경보가 ALARM 상태일 때 실행할 작업(AlarmActions)으로 조정 정책 WebServerScaleUpPolicy를 지정합니다. 경보는 WebServerGroup Auto Scaling 그룹(Dimensions)의 EC2 인스턴스를 모니터링합니다. 경보는 300초 간격(Period) 동안 WebServerGroup(Dimensions)에서 인스턴스의 평균(Statistic) EC2 인스턴스 CPU 사용률(Namespace 및 MetricName)을 측정합니다. 이 값(300초 동안의 평균 CPU 사용률)이 2회 연속되는 기간(EvaluationPeriod) 동안 90%(ComparisonOperator 및 Threshold) 이상으로 유지되면 경보는 ALARM 상태로 바뀌고 CloudWatch는 위에 설명된 WebServerScaleUpPolicy 정책(AlarmActions)을 실행하여 WebServerGroup을 확장합니다.

CPUAlarmLow 경보는 동일한 지표를 측정하지만 CPU 사용률이 75%(ComparisonOperator 및 Threshold) 미만일 때 트리거되는 경보가 있으며 WebServerScaleDownPolicy 정책을 실행하여 Auto Scaling 그룹 WebServerGroup에서 1 EC2 인스턴스를 제거합니다.