{
  "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"
        ]
      }
    }
  }
}
