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

    "Description": "AWS CloudFormation template",

    "Parameters": {

        "KeyName": {
            "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instances",
            "Type": "AWS::EC2::KeyPair::KeyName",
            "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
        },

        "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."
        },

        "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."
        },
        "EnvType" : {
          "Description" : "Environment type.",
          "Default" : "NOEIP",
          "Type" : "String",
          "AllowedValues" : ["EIP", "NOEIP"],
          "ConstraintDescription" : "must specify EIP or NOEIP."
    }

    },
      "Conditions" : {
        "CreateEipResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "EIP"]}
      },
    "Mappings": {
        "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-97785bed",
                "HVMG2": "ami-0a6e3770"
            },
            "us-west-2": {
                "PV64": "ami-7f77b31f",
                "HVM64": "ami-f2d3638a",
                "HVMG2": "ami-ee15a196"
            },
            "us-west-1": {
                "PV64": "ami-a2490dc2",
                "HVM64": "ami-824c4ee2",
                "HVMG2": "ami-0da4a46d"
            },
            "eu-west-1": {
                "PV64": "ami-4cdd453f",
                "HVM64": "ami-d834aba1",
                "HVMG2": "ami-af8013d6"
            },
            "eu-west-2": {
                "PV64": "NOT_SUPPORTED",
                "HVM64": "ami-403e2524",
                "HVMG2": "NOT_SUPPORTED"
            },
            "eu-west-3": {
                "PV64": "NOT_SUPPORTED",
                "HVM64": "ami-8ee056f3",
                "HVMG2": "NOT_SUPPORTED"
            },
            "eu-central-1": {
                "PV64": "ami-6527cf0a",
                "HVM64": "ami-5652ce39",
                "HVMG2": "ami-1d58ca72"
            },
            "ap-northeast-1": {
                "PV64": "ami-3e42b65f",
                "HVM64": "ami-ceafcba8",
                "HVMG2": "ami-edfd658b"
            },
            "ap-northeast-2": {
                "PV64": "NOT_SUPPORTED",
                "HVM64": "ami-863090e8",
                "HVMG2": "NOT_SUPPORTED"
            },
            "ap-northeast-3": {
                "PV64": "NOT_SUPPORTED",
                "HVM64": "ami-83444afe",
                "HVMG2": "NOT_SUPPORTED"
            },
            "ap-southeast-1": {
                "PV64": "ami-df9e4cbc",
                "HVM64": "ami-68097514",
                "HVMG2": "ami-c06013bc"
            },
            "ap-southeast-2": {
                "PV64": "ami-63351d00",
                "HVM64": "ami-942dd1f6",
                "HVMG2": "ami-85ef12e7"
            },
            "ap-south-1": {
                "PV64": "NOT_SUPPORTED",
                "HVM64": "ami-531a4c3c",
                "HVMG2": "ami-411e492e"
            },
            "us-east-2": {
                "PV64": "NOT_SUPPORTED",
                "HVM64": "ami-f63b1193",
                "HVMG2": "NOT_SUPPORTED"
            },
            "ca-central-1": {
                "PV64": "NOT_SUPPORTED",
                "HVM64": "ami-a954d1cd",
                "HVMG2": "NOT_SUPPORTED"
            },
            "sa-east-1": {
                "PV64": "ami-1ad34676",
                "HVM64": "ami-84175ae8",
                "HVMG2": "NOT_SUPPORTED"
            },
            "cn-north-1": {
                "PV64": "ami-77559f1a",
                "HVM64": "ami-cb19c4a6",
                "HVMG2": "NOT_SUPPORTED"
            },
            "cn-northwest-1": {
                "PV64": "ami-80707be2",
                "HVM64": "ami-3e60745c",
                "HVMG2": "NOT_SUPPORTED"
            }
        }

    },

    "Resources": {
        "WebServerSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable HTTP access via port 80 locked down to the load balancer + SSH access",
                "SecurityGroupIngress": [{
                        "IpProtocol": "tcp",
                        "FromPort": "80",
                        "ToPort": "80",
                        "CidrIp": "0.0.0.0/0"
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "22",
                        "ToPort": "22",
                        "CidrIp": {
                            "Ref": "SSHLocation"
                        }
                    }
                ]
            }
        },

        "WebServer": {
            "Type": "AWS::EC2::Instance",
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "configSets": {
                        "install": ["install_cfn"]
                    },
                    "install_cfn": {
                        "files": {
                            "/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.WebServer.Metadata.AWS::CloudFormation::Init\n",
                                        "action=/opt/aws/bin/cfn-init -v ",
                                        "         --stack ", {
                                            "Ref": "AWS::StackName"
                                        },
                                        "         --resource WebServer ",
                                        "         --configsets install ",
                                        "         --region ", {
                                            "Ref": "AWS::Region"
                                        }, "\n"
                                    ]]
                                },
                                "mode": "000400",
                                "owner": "root",
                                "group": "root"
                            }
                        },
                        "services": {
                            "sysvinit": {
                                "cfn-hup": {
                                    "enabled": "true",
                                    "ensureRunning": "true",
                                    "files": ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]
                                }
                            }
                        }
                    }
                }
            },
            "Properties": {
                "ImageId": {
                    "Fn::FindInMap": ["AWSRegionArch2AMI", {
                            "Ref": "AWS::Region"
                        },
                        {
                            "Fn::FindInMap": ["AWSInstanceType2Arch", {
                                "Ref": "InstanceType"
                            }, "Arch"]
                        }
                    ]
                },
                "InstanceType": {
                    "Ref": "InstanceType"
                },
                "SecurityGroups": [{
                    "Ref": "WebServerSecurityGroup"
                }],
                "KeyName": {
                    "Ref": "KeyName"
                },
                "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 WebServer ",
                            "         --configsets install ",
                            "         --region ", {
                                "Ref": "AWS::Region"
                            }, "\n",

                            "/opt/aws/bin/cfn-signal -e $? ",
                            "         --stack ", {
                                "Ref": "AWS::StackName"
                            },
                            "         --resource WebServer ",
                            "         --region ", {
                                "Ref": "AWS::Region"
                            }, "\n"
                        ]]
                    }
                }
            },
            "CreationPolicy": {
                "ResourceSignal": {
                    "Timeout": "PT15M"
                }
            }
        },

        "MountPoint" : {
          "Type" : "AWS::EC2::VolumeAttachment",
          "Properties" : {
            "InstanceId" : { "Ref" : "WebServer" },
            "VolumeId"  : { "Ref" : "NewVolume" },
            "Device" : "/dev/sdb"
          }
        },

        "NewVolume" : {
          "Type" : "AWS::EC2::Volume",
          "Properties" : {
            "Size" : "10",
            "VolumeType" : "gp2",
            "AvailabilityZone" : { "Fn::GetAtt" : [ "WebServer", "AvailabilityZone" ]}
          }
        },
        "MyEIP" : {
             "Type" : "AWS::EC2::EIP",
             "Condition" : "CreateEipResources",
             "Properties" : {
                    "InstanceId" : { "Ref" : "WebServer" }
            }
        }

    },
    "Outputs" : {
    "VolumeId" : {
      "Value" : { "Ref" : "MyEIP" },
      "Condition" : "CreateEipResources"
    }
  }
}