{

    "AWSTemplateFormatVersion": "2010-09-09",

    "Description": "AWS CloudFormation Sample Template AutoScalingRollingUpdates: Create a load balanced, Auto Scaled sample website. This example creates an Auto Scaling group behind a load balancer with a simple health check using a basic getting start AMI that has a simple Apache Web Server-based PHP page. The autoscaling launch configuration includes an update policy that will keep 2 instances running while doing an autoscaling rolling upgrade. **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": "m1.small",
            "AllowedValues": [
                "t1.micro",
                "m1.small",
                "m1.medium",
                "m1.large",
                "m1.xlarge",
                "m2.xlarge",
                "m2.2xlarge",
                "m2.4xlarge",
                "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"
        }
    },
    "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"
            },
            "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"
            }
        }
    },
    "Resources": {
        "WebServerGroup": {
            "Type": "AWS::AutoScaling::AutoScalingGroup",
          
            "UpdatePolicy" : {
                "AutoScalingRollingUpdate" : {
                "MaxBatchSize" : "2",
                "MinInstancesInService" : "2",
                "PauseTime" : "PT0M30S"
              }
            },

            "Properties": {
                "AvailabilityZones": {
                    "Fn::GetAZs": ""
                },
                "LaunchConfigurationName": {
                    "Ref": "LaunchConfig"
                },
                "MinSize": "1",
                "MaxSize": "4",
                "DesiredCapacity" : "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"
                }
            }
        },
        "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"
                }
            }
        },
        "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": "0.0.0.0/0"
                    },
                    {
                        "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"
                            ]
                        }
                    ]
                ]
            }
        }
    }

}