{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "AWS CloudFormation Sample Template ELB Access Logs and Connection Draining Sample: Creates a load balanced, scalable sample website using Elastic Load Balancer attached to an Auto Scaling group. The ELB has connection draining enabled and also puts access logs into an S3 bucket. ** This template creates one or more Amazon EC2 instances. 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": "m1.small",
"AllowedValues": [
"t1.micro",
"m1.small",
"m1.medium",
"m1.large",
"m1.xlarge",
"m2.xlarge",
"m2.2xlarge",
"m2.4xlarge",
"m3.xlarge",
"m3.2xlarge",
"c1.medium",
"c1.xlarge",
"cc1.4xlarge",
"cc2.8xlarge",
"cg1.4xlarge"
],
"ConstraintDescription": "must be a valid EC2 instance type."
},
"WebServerPort": {
"Description": "TCP/IP port of the web server",
"Type": "String",
"Default": "8888"
},
"KeyName": {
"Description": "Name of an existing EC2 KeyPair to enable SSH access to the instances",
"Type": "String"
},
"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": {
"AWSInstanceType2Arch": {
"t1.micro": {
"Arch": "64"
},
"m1.small": {
"Arch": "64"
},
"m1.medium": {
"Arch": "64"
},
"m1.large": {
"Arch": "64"
},
"m1.xlarge": {
"Arch": "64"
},
"m2.xlarge": {
"Arch": "64"
},
"m2.2xlarge": {
"Arch": "64"
},
"m2.4xlarge": {
"Arch": "64"
},
"m3.xlarge": {
"Arch": "64"
},
"m3.2xlarge": {
"Arch": "64"
},
"c1.medium": {
"Arch": "64"
},
"c1.xlarge": {
"Arch": "64"
}
},
"AWSRegionArch2AMI": {
"us-east-1": {
"32": "ami-aba768c2",
"64": "ami-81a768e8"
},
"us-west-1": {
"32": "ami-458fd300",
"64": "ami-b18ed2f4"
},
"us-west-2": {
"32": "ami-fcff72cc",
"64": "ami-feff72ce"
},
"eu-west-1": {
"32": "ami-018bb975",
"64": "ami-998bb9ed"
},
"sa-east-1": {
"32": "ami-a039e6bd",
"64": "ami-a239e6bf"
},
"ap-southeast-1": {
"32": "ami-425a2010",
"64": "ami-5e5a200c"
},
"ap-southeast-2": {
"32": "ami-b3990e89",
"64": "ami-bd990e87"
},
"ap-northeast-1": {
"32": "ami-7871c579",
"64": "ami-7671c577"
}
},
"Region2ELBAccountId": {
"us-east-1": {
"AccountId": "127311923021"
},
"us-west-1": {
"AccountId": "027434742980"
},
"us-west-2": {
"AccountId": "797873946194"
},
"eu-west-1": {
"AccountId": "156460612806"
},
"ap-northeast-1": {
"AccountId": "582318560864"
},
"ap-southeast-1": {
"AccountId": "114774131450"
},
"ap-southeast-2": {
"AccountId": "783225319266"
},
"sa-east-1": {
"AccountId": "507241528517"
}
}
},
"Resources": {
"ElasticLoadBalancer": {
"Type": "AWS::ElasticLoadBalancing::LoadBalancer",
"Properties": {
"AvailabilityZones": {
"Fn::GetAZs": ""
},
"Listeners": [
{
"LoadBalancerPort": "80",
"InstancePort": {
"Ref": "WebServerPort"
},
"Protocol": "HTTP"
}
],
"HealthCheck": {
"Target": {
"Fn::Join": [
"",
[
"HTTP:",
{
"Ref": "WebServerPort"
},
"/"
]
]
},
"HealthyThreshold": "3",
"UnhealthyThreshold": "5",
"Interval": "30",
"Timeout": "5"
},
"ConnectionDrainingPolicy": {
"Enabled": "true",
"Timeout": "300"
},
"AccessLoggingPolicy": {
"S3BucketName": {
"Ref": "LogsBucket"
},
"S3BucketPrefix": "Logs",
"Enabled": "true",
"EmitInterval": "60"
}
},
"DependsOn": "LogsBucketPolicy"
},
"LogsBucket": {
"Type": "AWS::S3::Bucket",
"DeletionPolicy" : "Retain"
},
"LogsBucketPolicy": {
"Type": "AWS::S3::BucketPolicy",
"Properties": {
"Bucket": {
"Ref": "LogsBucket"
},
"PolicyDocument": {
"Version": "2008-10-17",
"Statement": [
{
"Sid": "ELBAccessLogs20130930",
"Effect": "Allow",
"Resource": {
"Fn::Join": [
"",
[
"arn:aws:s3:::",
{
"Ref": "LogsBucket"
},
"/",
"Logs",
"/AWSLogs/",
{
"Ref": "AWS::AccountId"
},
"/*"
]
]
},
"Principal": {
"AWS": {
"Fn::FindInMap": [
"Region2ELBAccountId",
{
"Ref": "AWS::Region"
},
"AccountId"
]
}
},
"Action": [
"s3:PutObject"
]
}
]
}
}
},
"WebServerGroup": {
"Type": "AWS::AutoScaling::AutoScalingGroup",
"Properties": {
"AvailabilityZones": {
"Fn::GetAZs": ""
},
"LaunchConfigurationName": {
"Ref": "LaunchConfig"
},
"MinSize": "2",
"MaxSize": "2",
"LoadBalancerNames": [
{
"Ref": "ElasticLoadBalancer"
}
]
}
},
"LaunchConfig": {
"Type": "AWS::AutoScaling::LaunchConfiguration",
"Properties": {
"KeyName": {
"Ref": "KeyName"
},
"ImageId": {
"Fn::FindInMap": [
"AWSRegionArch2AMI",
{
"Ref": "AWS::Region"
},
{
"Fn::FindInMap": [
"AWSInstanceType2Arch",
{
"Ref": "InstanceType"
},
"Arch"
]
}
]
},
"UserData": {
"Fn::Base64": {
"Ref": "WebServerPort"
}
},
"SecurityGroups": [
{
"Ref": "InstanceSecurityGroup"
}
],
"InstanceType": {
"Ref": "InstanceType"
}
}
},
"InstanceSecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription": "Enable SSH access and HTTP access on the configured port",
"SecurityGroupIngress": [
{
"IpProtocol": "tcp",
"FromPort": "22",
"ToPort": "22",
"CidrIp": {
"Ref": "SSHLocation"
}
},
{
"IpProtocol": "tcp",
"FromPort": {
"Ref": "WebServerPort"
},
"ToPort": {
"Ref": "WebServerPort"
},
"CidrIp": "0.0.0.0/0"
}
]
}
}
},
"Outputs": {
"URL": {
"Description": "URL of the website",
"Value": {
"Fn::Join": [
"",
[
"http://",
{
"Fn::GetAtt": [
"ElasticLoadBalancer",
"DNSName"
]
}
]
]
}
},
"ELBAccessLogsBucket": {
"Description": "DNS name of the S3 bucket storing ELB Access Logs",
"Value": {
"Fn::GetAtt": [
"LogsBucket",
"DomainName"
]
}
}
}
}