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.'
Mappings:
AWSInstanceType2Arch:
c1.medium:
Arch: PV64
c1.xlarge:
Arch: PV64
c3.2xlarge:
Arch: HVM64
c3.4xlarge:
Arch: HVM64
c3.8xlarge:
Arch: HVM64
c3.large:
Arch: HVM64
c3.xlarge:
Arch: HVM64
c4.2xlarge:
Arch: HVM64
c4.4xlarge:
Arch: HVM64
c4.8xlarge:
Arch: HVM64
c4.large:
Arch: HVM64
c4.xlarge:
Arch: HVM64
cc2.8xlarge:
Arch: HVM64
cr1.8xlarge:
Arch: HVM64
d2.2xlarge:
Arch: HVM64
d2.4xlarge:
Arch: HVM64
d2.8xlarge:
Arch: HVM64
d2.xlarge:
Arch: HVM64
g2.2xlarge:
Arch: HVMG2
g2.8xlarge:
Arch: HVMG2
hi1.4xlarge:
Arch: HVM64
hs1.8xlarge:
Arch: HVM64
i2.2xlarge:
Arch: HVM64
i2.4xlarge:
Arch: HVM64
i2.8xlarge:
Arch: HVM64
i2.xlarge:
Arch: HVM64
m1.large:
Arch: PV64
m1.medium:
Arch: PV64
m1.small:
Arch: PV64
m1.xlarge:
Arch: PV64
m2.2xlarge:
Arch: PV64
m2.4xlarge:
Arch: PV64
m2.xlarge:
Arch: PV64
m3.2xlarge:
Arch: HVM64
m3.large:
Arch: HVM64
m3.medium:
Arch: HVM64
m3.xlarge:
Arch: HVM64
m4.10xlarge:
Arch: HVM64
m4.2xlarge:
Arch: HVM64
m4.4xlarge:
Arch: HVM64
m4.large:
Arch: HVM64
m4.xlarge:
Arch: HVM64
r3.2xlarge:
Arch: HVM64
r3.4xlarge:
Arch: HVM64
r3.8xlarge:
Arch: HVM64
r3.large:
Arch: HVM64
r3.xlarge:
Arch: HVM64
t1.micro:
Arch: PV64
t2.large:
Arch: HVM64
t2.medium:
Arch: HVM64
t2.micro:
Arch: HVM64
t2.nano:
Arch: HVM64
t2.small:
Arch: HVM64
AWSInstanceType2NATArch:
c1.medium:
Arch: NATPV64
c1.xlarge:
Arch: NATPV64
c3.2xlarge:
Arch: NATHVM64
c3.4xlarge:
Arch: NATHVM64
c3.8xlarge:
Arch: NATHVM64
c3.large:
Arch: NATHVM64
c3.xlarge:
Arch: NATHVM64
c4.2xlarge:
Arch: NATHVM64
c4.4xlarge:
Arch: NATHVM64
c4.8xlarge:
Arch: NATHVM64
c4.large:
Arch: NATHVM64
c4.xlarge:
Arch: NATHVM64
cc2.8xlarge:
Arch: NATHVM64
cr1.8xlarge:
Arch: NATHVM64
d2.2xlarge:
Arch: NATHVM64
d2.4xlarge:
Arch: NATHVM64
d2.8xlarge:
Arch: NATHVM64
d2.xlarge:
Arch: NATHVM64
g2.2xlarge:
Arch: NATHVMG2
g2.8xlarge:
Arch: NATHVMG2
hi1.4xlarge:
Arch: NATHVM64
hs1.8xlarge:
Arch: NATHVM64
i2.2xlarge:
Arch: NATHVM64
i2.4xlarge:
Arch: NATHVM64
i2.8xlarge:
Arch: NATHVM64
i2.xlarge:
Arch: NATHVM64
m1.large:
Arch: NATPV64
m1.medium:
Arch: NATPV64
m1.small:
Arch: NATPV64
m1.xlarge:
Arch: NATPV64
m2.2xlarge:
Arch: NATPV64
m2.4xlarge:
Arch: NATPV64
m2.xlarge:
Arch: NATPV64
m3.2xlarge:
Arch: NATHVM64
m3.large:
Arch: NATHVM64
m3.medium:
Arch: NATHVM64
m3.xlarge:
Arch: NATHVM64
m4.10xlarge:
Arch: NATHVM64
m4.2xlarge:
Arch: NATHVM64
m4.4xlarge:
Arch: NATHVM64
m4.large:
Arch: NATHVM64
m4.xlarge:
Arch: NATHVM64
r3.2xlarge:
Arch: NATHVM64
r3.4xlarge:
Arch: NATHVM64
r3.8xlarge:
Arch: NATHVM64
r3.large:
Arch: NATHVM64
r3.xlarge:
Arch: NATHVM64
t1.micro:
Arch: NATPV64
t2.large:
Arch: NATHVM64
t2.medium:
Arch: NATHVM64
t2.micro:
Arch: NATHVM64
t2.nano:
Arch: NATHVM64
t2.small:
Arch: NATHVM64
AWSRegionArch2AMI:
ap-northeast-1:
HVM64: ami-374db956
HVMG2: ami-4c78d52d
PV64: ami-3e42b65f
ap-northeast-2:
HVM64: ami-2b408b45
HVMG2: NOT_SUPPORTED
PV64: NOT_SUPPORTED
ap-south-1:
HVM64: ami-ffbdd790
HVMG2: ami-21a7d34e
PV64: NOT_SUPPORTED
ap-southeast-1:
HVM64: ami-a59b49c6
HVMG2: ami-f3f95990
PV64: ami-df9e4cbc
ap-southeast-2:
HVM64: ami-dc361ebf
HVMG2: ami-3a122e59
PV64: ami-63351d00
ca-central-1:
HVM64: ami-730ebd17
HVMG2: NOT_SUPPORTED
PV64: NOT_SUPPORTED
cn-north-1:
HVM64: ami-8e6aa0e3
HVMG2: NOT_SUPPORTED
PV64: ami-77559f1a
eu-central-1:
HVM64: ami-ea26ce85
HVMG2: ami-d2ff04bd
PV64: ami-6527cf0a
eu-west-1:
HVM64: ami-f9dd458a
HVMG2: ami-e2f7bd91
PV64: ami-4cdd453f
eu-west-2:
HVM64: ami-886369ec
HVMG2: NOT_SUPPORTED
PV64: NOT_SUPPORTED
sa-east-1:
HVM64: ami-6dd04501
HVMG2: NOT_SUPPORTED
PV64: ami-1ad34676
us-east-1:
HVM64: ami-6869aa05
HVMG2: ami-a41a3fb3
PV64: ami-2a69aa47
us-east-2:
HVM64: ami-f6035893
HVMG2: NOT_SUPPORTED
PV64: NOT_SUPPORTED
us-west-1:
HVM64: ami-31490d51
HVMG2: ami-00347e60
PV64: ami-a2490dc2
us-west-2:
HVM64: ami-7172b611
HVMG2: ami-caf253aa
PV64: ami-7f77b31f
Region2Examples:
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-south-1:
Examples: https://s3-ap-south-1.amazonaws.com/cloudformation-examples-ap-south-1
ap-southeast-1:
Examples: https://s3-ap-southeast-1.amazonaws.com/cloudformation-examples-ap-southeast-1
ap-southeast-2:
Examples: https://s3-ap-southeast-2.amazonaws.com/cloudformation-examples-ap-southeast-2
ca-central-1:
Examples: https://s3-ca-central-1.amazonaws.com/cloudformation-examples-ca-central-1
cn-north-1:
Examples: https://s3.cn-north-1.amazonaws.com.cn/cloudformation-examples-cn-north-1
eu-central-1:
Examples: https://s3-eu-central-1.amazonaws.com/cloudformation-examples-eu-central-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
sa-east-1:
Examples: https://s3-sa-east-1.amazonaws.com/cloudformation-examples-sa-east-1
us-east-1:
Examples: https://s3.amazonaws.com/cloudformation-examples-us-east-1
us-east-2:
Examples: https://s3-us-east-2.amazonaws.com/cloudformation-examples-us-east-2
us-west-1:
Examples: https://s3-us-west-1.amazonaws.com/cloudformation-examples-us-west-1
us-west-2:
Examples: https://s3-us-west-2.amazonaws.com/cloudformation-examples-us-west-2
Outputs:
URL:
Description: The URL of the website
Value:
Fn::Join:
- ''
- - http://
- Fn::GetAtt:
- ElasticLoadBalancer
- DNSName
Parameters:
InstanceType:
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.
Default: t2.small
Description: WebServer EC2 instance type
Type: String
KeyName:
ConstraintDescription: must be the name of an existing EC2 KeyPair.
Description: The EC2 Key Pair to allow SSH access to the instances
Type: AWS::EC2::KeyPair::KeyName
OperatorEMail:
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.
Description: EMail address to notify if there are any scaling operations
Type: String
SSHLocation:
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.
Default: 0.0.0.0/0
Description: The IP address range that can be used to SSH to the EC2 instances
MaxLength: '18'
MinLength: '9'
Type: String
Resources:
CPUAlarmHigh:
Properties:
AlarmActions:
- Ref: WebServerScaleUpPolicy
AlarmDescription: Scale-up if CPU > 90% for 10 minutes
ComparisonOperator: GreaterThanThreshold
Dimensions:
- Name: AutoScalingGroupName
Value:
Ref: WebServerGroup
EvaluationPeriods: '2'
MetricName: CPUUtilization
Namespace: AWS/EC2
Period: '300'
Statistic: Average
Threshold: '90'
Type: AWS::CloudWatch::Alarm
CPUAlarmLow:
Properties:
AlarmActions:
- Ref: WebServerScaleDownPolicy
AlarmDescription: Scale-down if CPU < 70% for 10 minutes
ComparisonOperator: LessThanThreshold
Dimensions:
- Name: AutoScalingGroupName
Value:
Ref: WebServerGroup
EvaluationPeriods: '2'
MetricName: CPUUtilization
Namespace: AWS/EC2
Period: '300'
Statistic: Average
Threshold: '70'
Type: AWS::CloudWatch::Alarm
ElasticLoadBalancer:
Properties:
AvailabilityZones:
Fn::GetAZs: ''
CrossZone: 'true'
HealthCheck:
HealthyThreshold: '3'
Interval: '30'
Target: HTTP:80/
Timeout: '5'
UnhealthyThreshold: '5'
Listeners:
- InstancePort: '80'
LoadBalancerPort: '80'
Protocol: HTTP
Type: AWS::ElasticLoadBalancing::LoadBalancer
InstanceSecurityGroup:
Properties:
GroupDescription: Enable SSH access and HTTP from the load balancer only
SecurityGroupIngress:
- CidrIp:
Ref: SSHLocation
FromPort: '22'
IpProtocol: tcp
ToPort: '22'
- FromPort: '80'
IpProtocol: tcp
SourceSecurityGroupName:
Fn::GetAtt:
- ElasticLoadBalancer
- SourceSecurityGroup.GroupName
SourceSecurityGroupOwnerId:
Fn::GetAtt:
- ElasticLoadBalancer
- SourceSecurityGroup.OwnerAlias
ToPort: '80'
Type: AWS::EC2::SecurityGroup
LaunchConfig:
Metadata:
AWS::CloudFormation::Init:
config:
files:
/etc/cfn/cfn-hup.conf:
content:
Fn::Join:
- ''
- - '[main]
'
- stack=
- Ref: AWS::StackId
- '
'
- region=
- Ref: AWS::Region
- '
'
group: root
mode: '000400'
owner: root
/etc/cfn/hooks.d/cfn-auto-reloader.conf:
content:
Fn::Join:
- ''
- - '[cfn-auto-reloader-hook]
'
- 'triggers=post.update
'
- 'path=Resources.LaunchConfig.Metadata.AWS::CloudFormation::Init
'
- 'action=/opt/aws/bin/cfn-init -v '
- ' --stack '
- Ref: AWS::StackName
- ' --resource LaunchConfig '
- ' --region '
- Ref: AWS::Region
- '
'
- 'runas=root
'
/var/www/html/index.html:
content:
Fn::Join:
- '
'
- -
-