メニュー
AWS CloudFormation
ユーザーガイド (API Version 2010-05-15)

ウォークスルー: スケーラブルなロードバランシングウェブサーバーの作成

このテンプレートは、Auto Scaling と Elastic Load Balancing を使用したサンプルウェブサイトを作成します。ウェブサイトは、複数のアベイラビリティーゾーンを使用するように設定されます。さらに、このテンプレートには、CloudWatch アラームが含まれており Auto Scaling ポリシーを実行し、しきい値の定義を超えた場合に Auto Scaling グループのインスタンスが追加または削除されます。

このテンプレートでは、1 つ以上の 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 マルチ 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" ]}]]} } } }

テンプレートのウォークスルー

サンプルテンプレートには、Auto Scaling グループと LoadBalancer、Ingress ルールを定義するセキュリティグループ、CloudWatch アラーム、Auto Scaling ポリシーが含まれています。

このテンプレートには 3 つの入力パラメーターが存在します。InstanceType は、Auto Scaling グループに使用する EC2 インスタンスのタイプで、デフォルトは m1.small です。WebServerPort はウェブサーバーに使用する TCP ポートで、デフォルトは 8888 です。KeyName は、Auto Scaling グループに使用するキーペアの名前です。KeyName は、スタックの作成時に指定する必要があります (デフォルト値のないパラメーターはスタックの作成時に指定する必要があります)。

AWS::AutoScaling::AutoScalingGroup リソース WebServerGroup は、次の Auto Scaling グループ設定を宣言します。

  • AvailabilityZones は、Auto Scaling グループの EC2 インスタンスの作成先となるアベイラビリティーゾーンを指定します。Fn::GetAZs 関数の呼び出し ({ "Fn::GetAZs" : "" }) では、スタックの作成先となるリージョンのすべてのアベイラビリティーゾーンが指定されています。

  • MinSize および MaxSize は、Auto Scaling グループでの EC2 インスタンスの最小数と最大数を設定します。

  • LoadBalancerNames は、トラフィックを Auto Scaling グループにルーティングするための LoadBalancer をリストします。このグループの LoadBalancer は ElasticLoadBalancer リソースです。

AWS::AutoScaling::LaunchConfiguration リソースの LaunchConfig では、WebServerGroup Auto Scaling グループ内の EC2 インスタンスに使用する次の設定を宣言しています。

  • KeyName は、使用する EC2 キーペアとして KeyName 入力パラメーターの値を受け取ります。

  • UserData は、アプリケーションに渡される、Base64 エンコードされた WebServerPort パラメーターの値です。

  • SecurityGroups は、Auto Scaling グループ内の EC2 インスタンスでファイアウォールに使用される Ingress ルールを含んだ一連の EC2 セキュリティグループです。この例では、セキュリティグループが 1 つ存在し、AWS::EC2::SecurityGroup リソース (InstanceSecurityGroup) として宣言されています。このセキュリティグループには、2 つの Ingress ルールが存在します。1) ポート 22 (SSH アクセス) のすべての IP アドレス ("CidrIp" : "0.0.0.0/0") からのアクセスを許可する TCP Ingress ルールと、2) ElasticLoadBalancer リソースの WebServerPort ポートからのアクセスを許可する TCP Ingress ルールです (ElasticLoadBalancer のソースセキュリティグループを指定)。ElasticLoadBalancer リソースから SourceSecurityGroup.OwnerAlias プロパティと SourceSecurityGroup.GroupName プロパティを取得するために、GetAtt 関数が使用されています。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 リージョンにスタックを作成し、InstanceType として m1.small を指定した場合、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 は、トラフィックのルーティング先となる EC2 インスタンスの状態を Elastic Load Balancing がチェックするために使用する設定です。この例における HealthCheck の対象は、EC2 インスタンスのルートアドレスです。WebServerPort で指定されたポートを使い、HTTP プロトコルでヘルスチェックが実行されます。WebServerPort が 8888 である場合、{ "Fn::Join" : [ "", ["HTTP:", { "Ref" : "WebServerPort" }, "/"]]} 関数の呼び出しは HTTP:8888/ という文字列として評価されます。また、EC2 インスタンスのヘルスチェックの間隔 (Interval) は 30 秒に設定されています。Timeout は、ヘルスチェックターゲットからのレスポンスを Elastic Load Balancing が待機する時間です (この例では 5 秒)。Timeout 時間が経過すると、Elastic Load Balancing は、EC2 インスタンスの状態を異常と見なします。EC2 インスタンスが連続して 5 回ヘルスチェックで不合格 (UnhealthyThreshold) となった場合、Elastic Load Balancing は、その EC2 インスタンスにトラフィックをルーティングするのを止めます。これは、そのインスタンスが連続して 3 回ヘルスチェックで正常と評価されるまで続きます。連続して 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) の EC2 インスタンスの平均 (Statistic) CPU 使用率 (Namespace および MetricName) が、WebServerGroup (Dimensions) 内のインスタンスを対象に測定されます。この値 (300 秒間の平均 CPU 使用率) が 90% を超えた状態 (ComparisonOperator およびThreshold) が連続して 2 期間 (EvaluationPeriod) 続いた場合、アラームが ALARM 状態に移行し、前述の WebServerScaleUpPolicy ポリシー (AlarmActions) が CloudWatch によって実行され、WebServerGroup が拡大されます。

CPUAlarmLow アラームによって測定されるメトリクスも基本的には同じですが、こちらのアラームは、CPU 使用率が 75% を下回ったとき (ComparisonOperator および Threshold) に作動します。この場合、WebServerScaleDownPolicy ポリシーが実行されて、Auto Scaling グループ WebServerGroup から EC2 インスタンスが 1 つ削除されます。