Cloudformation ValidationError:Stack(stackname)处于CREATE_COMPLETE状态,无法发出信号

时间:2018-04-12 16:55:00

标签: amazon-cloudformation

我创建了一个aws Cloudformation脚本并启动但是当我查看日志时它显示以下错误:

  

ValidationError:Stack stackarn处于CREATE_COMPLETE状态且无法发出信号

我已经查看了有关此错误的其他帖子,这些帖子表明问题是实例ID是从第一个实例派生的,或者自动缩放组没有所需的容量集,对我来说都不是。

这是我的云形成模板

{
"AWSTemplateFormatVersion": "2010-09-09",
"Metadata": {
    "AWS::CloudFormation::Designer": {
        "90d29d54-61c0-4b64-8f16-bab58c2da737": {
            "size": {
                "width": 510,
                "height": 330
            },
            "position": {
                "x": 650,
                "y": 200
            },
            "z": 0,
            "embeds": [
                "9da7a6f1-462f-45c1-bc0c-10fe6a297ea0",
                "791e1b81-a4ed-4b9a-a1b6-e37f92201579",
                "d4706141-a8d6-4d08-b092-cabedf2d351f",
                "25f02a3f-31da-4e2a-8a3b-31cc9c860451"
            ]
        },
        "25f02a3f-31da-4e2a-8a3b-31cc9c860451": {
            "size": {
                "width": 250,
                "height": 110
            },
            "position": {
                "x": 850,
                "y": 250
            },
            "z": 1,
            "parent": "90d29d54-61c0-4b64-8f16-bab58c2da737",
            "embeds": [
                "9eb6713b-7a7f-46a2-8a53-76738c2069e7",
                "ee1affdf-e6fe-453f-b754-cf2de003f1d8",
                "e8849c27-1095-4667-906a-6f194c39e5bb"
            ]
        },
        "791e1b81-a4ed-4b9a-a1b6-e37f92201579": {
            "size": {
                "width": 60,
                "height": 60
            },
            "position": {
                "x": 940,
                "y": 450
            },
            "z": 1,
            "parent": "90d29d54-61c0-4b64-8f16-bab58c2da737",
            "embeds": []
        },
        "11d6e6db-f8bf-4162-83f4-3b4cdd3ecd9c": {
            "size": {
                "width": 60,
                "height": 60
            },
            "position": {
                "x": 280,
                "y": 340
            },
            "z": 0,
            "embeds": []
        },
        "75f9474e-7e06-4879-8e2e-42f9063117bf": {
            "source": {
                "id": "90d29d54-61c0-4b64-8f16-bab58c2da737"
            },
            "target": {
                "id": "11d6e6db-f8bf-4162-83f4-3b4cdd3ecd9c"
            },
            "z": 0
        },
        "9da7a6f1-462f-45c1-bc0c-10fe6a297ea0": {
            "size": {
                "width": 120,
                "height": 120
            },
            "position": {
                "x": 700,
                "y": 270
            },
            "z": 1,
            "parent": "90d29d54-61c0-4b64-8f16-bab58c2da737",
            "embeds": [
                "93a62438-214b-4c30-906d-c45d73f0a288"
            ]
        },
        "93a62438-214b-4c30-906d-c45d73f0a288": {
            "size": {
                "width": 60,
                "height": 60
            },
            "position": {
                "x": 730,
                "y": 310
            },
            "z": 2,
            "parent": "9da7a6f1-462f-45c1-bc0c-10fe6a297ea0",
            "embeds": [],
            "isassociatedwith": [
                "11d6e6db-f8bf-4162-83f4-3b4cdd3ecd9c"
            ]
            "dependson": [
                "75f9474e-7e06-4879-8e2e-42f9063117bf"
            ]
        },
        "e9956922-4cfe-4d1a-a4c9-814613d2517e": {
            "source": {
                "id": "9da7a6f1-462f-45c1-bc0c-10fe6a297ea0"
            },
            "target": {
                "id": "25f02a3f-31da-4e2a-8a3b-31cc9c860451"
            },
            "z": 1
        },
        "e8849c27-1095-4667-906a-6f194c39e5bb": {
            "size": {
                "width": 60,
                "height": 60
            },
            "position": {
                "x": 870,
                "y": 280
            },
            "z": 2,
            "parent": "25f02a3f-31da-4e2a-8a3b-31cc9c860451",
            "embeds": [],
            "isassociatedwith": [
                "ee1affdf-e6fe-453f-b754-cf2de003f1d8",
                "9eb6713b-7a7f-46a2-8a53-76738c2069e7"
            ]
            "dependson": [
                "93a62438-214b-4c30-906d-c45d73f0a288"
            ]
        },
        "9eb6713b-7a7f-46a2-8a53-76738c2069e7": {
            "size": {
                "width": 60,
                "height": 60
            },
            "position": {
                "x": 940,
                "y": 280
            },
            "z": 2,
            "parent": "25f02a3f-31da-4e2a-8a3b-31cc9c860451",
            "embeds": [],
            "isassociatedwith": [
                "d4706141-a8d6-4d08-b092-cabedf2d351f"
            ]
        },
        "ee1affdf-e6fe-453f-b754-cf2de003f1d8": {
            "size": {
                "width": 60,
                "height": 60
            },
            "position": {
                "x": 1020,
                "y": 280
            },
            "z": 2,
            "parent": "25f02a3f-31da-4e2a-8a3b-31cc9c860451",
            "embeds": [],
            "isassociatedwith": [
                "791e1b81-a4ed-4b9a-a1b6-e37f92201579"
            ]
        },
        "d4706141-a8d6-4d08-b092-cabedf2d351f": {
            "size": {
                "width": 60,
                "height": 60
            },
            "position": {
                "x": 802.9767066348955,
                "y": 452.6381721949601
            },
            "z": 1,
            "parent": "90d29d54-61c0-4b64-8f16-bab58c2da737",
            "embeds": []

        },
        "f2021951-c570-4233-8ccd-a05be043632c": {
            "size": {
                "width": 60,
                "height": 60
            },
            "position": {
                "x": 1260,
                "y": 210
            },
            "z": 0,
            "embeds": []
        },
        "c892fb7e-40c0-4391-be11-3e005ed16251": {
            "size": {
                "width": 60,
                "height": 60
            },
            "position": {
                "x": 1370,
                "y": 210
            },
            "z": 0,
            "embeds": []
        },
        "582ee47a-34d2-4faa-956f-72bbe48b5ca1": {
            "size": {
                "width": 60,
                "height": 60
            },
            "position": {
                "x": 1260,
                "y": 340
            },
            "z": 0,
            "embeds": []
        },
        "68ddbe84-8848-4920-8700-df090e65d755": {
            "size": {
                "width": 60,
                "height": 60
            },
            "position": {
                "x": 1370,
                "y": 340
            },
            "z": 0,
            "embeds": []
        }
    }
},
"Resources": {
    "VPC": {
        "Type": "AWS::EC2::VPC",
        "Properties": {
            "EnableDnsSupport": "true",
            "EnableDnsHostnames": "true",
            "CidrBlock": "10.0.0.0/16"
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "90d29d54-61c0-4b64-8f16-bab58c2da737"
            }
        }
    },
    "PublicSubnet": {
        "Type": "AWS::EC2::Subnet",
        "Properties": {
            "VpcId": {
                "Ref": "VPC"
            },
            "CidrBlock": "10.0.0.0/24"
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "25f02a3f-31da-4e2a-8a3b-31cc9c860451"
            }
        }
    },
    "PublicLoadBalancerSecurityGroup": {
        "Type": "AWS::EC2::SecurityGroup",
        "Properties": {
            "GroupDescription": "Public Elastic Load Balancing security group with HTTP access on port 80 from the Internet",
            "SecurityGroupIngress": [
                {
                    "IpProtocol": "tcp",
                    "FromPort": "80",
                    "ToPort": "80",
                    "CidrIp": "0.0.0.0/0"
                }
            ],
            "SecurityGroupEgress": [
                {
                    "IpProtocol": "tcp",
                    "FromPort": "80",
                    "ToPort": "80",
                    "CidrIp": "0.0.0.0/0"
                }
            ],
            "VpcId": {
                "Ref": "VPC"
            }
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "791e1b81-a4ed-4b9a-a1b6-e37f92201579"
            }
        }
    },
    "InternetGateway": {
        "Type": "AWS::EC2::InternetGateway",
        "Properties": {},
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "11d6e6db-f8bf-4162-83f4-3b4cdd3ecd9c"
            }
        }
    },
    "EC2VPCG4YNHI": {
        "Type": "AWS::EC2::VPCGatewayAttachment",
        "Properties": {
            "VpcId": {
                "Ref": "VPC"
            },
            "InternetGatewayId": {
                "Ref": "InternetGateway"
            }
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "75f9474e-7e06-4879-8e2e-42f9063117bf"
            }
        }
    },
    "PublicRouteTable": {
        "Type": "AWS::EC2::RouteTable",
        "Properties": {
            "VpcId": {
                "Ref": "VPC"
            }
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "9da7a6f1-462f-45c1-bc0c-10fe6a297ea0"
            }
        }
    },
    "PublicRoute": {
        "Type": "AWS::EC2::Route",
        "Properties": {
            "DestinationCidrBlock": "0.0.0.0/0",
            "RouteTableId": {
                "Ref": "PublicRouteTable"
            },
            "GatewayId": {
                "Ref": "InternetGateway"
            }
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "93a62438-214b-4c30-906d-c45d73f0a288"
            }
        },
        "DependsOn": [
            "EC2VPCG4YNHI"
        ]
    },
    "EC2SRTA188EJ": {
        "Type": "AWS::EC2::SubnetRouteTableAssociation",
        "Properties": {
            "RouteTableId": {
                "Ref": "PublicRouteTable"
            },
            "SubnetId": {
                "Ref": "PublicSubnet"
            }
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "e9956922-4cfe-4d1a-a4c9-814613d2517e"
            }
        }
    },
    "WebServerFleet": {
        "Type": "AWS::AutoScaling::AutoScalingGroup",
        "Properties": {
            "MinSize": "1",
            "MaxSize": "10",
            "DesiredCapacity": {
                "Ref": "WebServerCount"
            },
            "VPCZoneIdentifier": [
                {
                    "Ref": "PublicSubnet"
                }
            ],
            "LoadBalancerNames": [
                {
                    "Ref": "PublicElasticLoadBalancer"
                }
            ],
            "LaunchConfigurationName": {
                "Ref": "WebServerLaunchConfig"
            }
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "e8849c27-1095-4667-906a-6f194c39e5bb"
            }
        },
        "DependsOn": [
            "PublicRoute"
        ]
    },
    "WebServerLaunchConfig": {
        "Type": "AWS::AutoScaling::LaunchConfiguration",
        "Properties": {
            "InstanceType": {
                "Ref": "InstanceType"
            },
            "ImageId": {
                "Fn::FindInMap": [
                    "AWSRegionArch2AMI",
                    {
                        "Ref": "AWS::Region"
                    },
                    {
                        "Fn::FindInMap": [
                            "AWSInstanceType2Arch",
                            {
                                "Ref": "InstanceType"
                            },
                            "Arch"
                        ]
                    }
                ]
            },
            "KeyName": {
                "Ref": "KeyName"
            },
            "AssociatePublicIpAddress": "true",
            "UserData": {
                "Fn::Base64": {
                    "Fn::Join": [
                        "",
                        [
                            "#!/bin/bash -xe\n",
                            "yum install -y aws-cfn-bootstrap\n",
                            "# Install the files and packages from the metadata\n",
                            "/opt/aws/bin/cfn-init -v ",
                            "         --stack ",
                            {
                                "Ref": "AWS::StackName"
                            },
                            "         --resource WebServerLaunchConfig ",
                            "         --configsets All ",
                            "         --region ",
                            {
                                "Ref": "AWS::Region"
                            },
                            "\n",
                            "#Install Redis\n",
                            "#rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm\n",
                            "rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm\n",
                            "yum --enablerepo=remi,remi-test -y install redis\n",
                            "chkconfig --add redis\n",
                            "chkconfig --level 345 redis on\n",
                            "service redis start\n",
                            "# Clone GitHub Repository\n",
                            "git clone -b master https://",
                            {
                                "Ref": "GitHubUsername"
                            },
                            ":",
                            {
                                "Ref": "GitHubPassword"
                            },
                            "@github.com/repo /var/www/html\n",
                            "# Update the httpd.conf file and restart the web server\n",
                            "mv -f /var/www/html/resources/conf/httpd.conf /etc/httpd/conf/httpd.conf \n",
                            "service httpd restart\n",
                            "# Install Composer\n",
                            "#chmod 755 -R /usr/local/bin\n",
                            "curl -sS https://getcomposer.org/installer > /tmp/installer\n",
                            "COMPOSER_HOME=/usr/local/composer php < /tmp/installer\n",
                            "mv composer.phar /usr/local/bin/composer.phar \n",
                            "groupadd www\n",
                            "usermod -a -G www ec2-user\n",
                            "usermod -a -G www apache\n",
                            "chown -R root:www /var/www\n",
                            "find /var/www -type d -exec chmod 2775 {} +\n",
                            "find /var/www -type f -exec chmod 0664 {} +\n",
                            "COMPOSER_HOME=/usr/local/composer /usr/local/bin/composer.phar install -d /var/www/html --no-plugins --no-scripts\n",
                            "mkdir /var/www/html/storage/framework\n",
                            "mkdir /var/www/html/storage/framework/views\n",
                            "mkdir /var/www/html/storage/framework/sessions\n",
                            "chmod -R 775 /var/www/html/storage\n",
                            "# Signal the status from cfn-init\n",
                            "/opt/aws/bin/cfn-signal -e $? ",
                            "         --stack ",
                            {
                                "Ref": "AWS::StackName"
                            },
                            "         --resource WebServerFleet ",
                            "         --region ",
                            {
                                "Ref": "AWS::Region"
                            },
                            "\n"
                        ]
                    ]
                }
            },
            "SecurityGroups": [
                {
                    "Ref": "WebServerSecurityGroup"
                }
            ]
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "9eb6713b-7a7f-46a2-8a53-76738c2069e7"
            },
            "AWS::CloudFormation::Init": {
                "configSets": {
                    "All": [
                        "installWebDependencies"
                    ]
                },
                "installWebDependencies": {
                    "packages": {
                        "yum": {
                            "httpd24": [],
                            "php56": [],
                            "php56-pdo": [],
                            "php56-mbstring": [],
                            "php56-mcrypt": [],
                            "php-ZendFramework-Db-Adapter-Pdo-Mysql.noarch": [],
                            "git": []
                        }
                    },
                    "services": {
                        "sysvinit": {
                            "httpd": {
                                "enabled": "true",
                                "ensureRunning": "true"
                            }
                        }
                    }
                }
            }
        }
    },
    "PublicElasticLoadBalancer": {
        "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
        "Properties": {
            "Listeners": [
                {
                    "LoadBalancerPort": "80",
                    "InstancePort": "80",
                    "Protocol": "HTTP"
                }
            ],
            "HealthCheck": {
                "Target": "HTTP:80/",
                "HealthyThreshold": "3",
                "UnhealthyThreshold": "5",
                "Interval": "90",
                "Timeout": "60"
            },
            "Subnets": [
                {
                    "Ref": "PublicSubnet"
                }
            ],
            "SecurityGroups": [
                {
                    "Ref": "PublicLoadBalancerSecurityGroup"
                }
            ]
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "ee1affdf-e6fe-453f-b754-cf2de003f1d8"
            }
        }
    },
    "WebServerSecurityGroup": {
        "Type": "AWS::EC2::SecurityGroup",
        "Properties": {
            "GroupDescription": "Allow access from load balancer and SSH traffic",
            "SecurityGroupIngress": [
                {
                    "IpProtocol": "tcp",
                    "FromPort": "80",
                    "ToPort": "80",
                    "SourceSecurityGroupId": {
                        "Ref": "PublicLoadBalancerSecurityGroup"
                    }
                },
                {
                    "IpProtocol": "tcp",
                    "FromPort": "22",
                    "ToPort": "22",
                    "CidrIp": {
                        "Ref": "SSHLocation"
                    }
                },
                {
                    "IpProtocol": "tcp",
                    "FromPort": "80",
                    "ToPort": "80",
                    "CidrIp": "31.221.88.186/32"
                }
            ],
            "VpcId": {
                "Ref": "VPC"
            }
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "d4706141-a8d6-4d08-b092-cabedf2d351f"
            }
        }
    },
    "AnvilQueue": {
        "Type": "AWS::SQS::Queue",
        "Properties": {
            "QueueName": "phonehome-incident-anvil",
            "DelaySeconds": 0,
            "ReceiveMessageWaitTimeSeconds": 0,
            "VisibilityTimeout": 30,
            "MessageRetentionPeriod": 1209600
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "f2021951-c570-4233-8ccd-a05be043632c"
            }
        }
    },
    "ProcessQueue": {
        "Type": "AWS::SQS::Queue",
        "Properties": {
            "QueueName": "phonehome-incident-process",
            "DelaySeconds": 0,
            "ReceiveMessageWaitTimeSeconds": 0,
            "VisibilityTimeout": 30,
            "MessageRetentionPeriod": 1209600
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "c892fb7e-40c0-4391-be11-3e005ed16251"
            }
        }
    },
    "QueueDepthAlarm": {
        "Type": "AWS::CloudWatch::Alarm",
        "Properties": {
            "AlarmDescription": "Alarm if queue depth grows beyond 2000 messages",
            "Namespace": "AWS/SQS",
            "MetricName": "ApproximateNumberOfMessagesVisible",
            "Dimensions": [
                {
                    "Name": "AnvilQueue",
                    "Value": {
                        "Fn::GetAtt": [
                            "AnvilQueue",
                            "QueueName"
                        ]
                    }
                },
                {
                    "Name": "ProcessQueue",
                    "Value": {
                        "Fn::GetAtt": [
                            "ProcessQueue",
                            "QueueName"
                        ]
                    }
                }
            ],
            "Statistic": "Sum",
            "Period": "300",
            "EvaluationPeriods": "1",
            "Threshold": "2000",
            "ComparisonOperator": "GreaterThanThreshold",
            "AlarmActions": [
                {
                    "Ref": "AlarmTopic"
                }
            ],
            "InsufficientDataActions": [
                {
                    "Ref": "AlarmTopic"
                }
            ]
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "582ee47a-34d2-4faa-956f-72bbe48b5ca1"
            }
        }
    },
    "AlarmTopic": {
        "Type": "AWS::SNS::Topic",
        "Properties": {
            "Subscription": [
                {
                    "Endpoint": {
                        "Ref": "AlarmEmail"
                    },
                    "Protocol": "email"
                }
            ]
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "68ddbe84-8848-4920-8700-df090e65d755"
            }
        }
    }
},
"Parameters": {
    "AlarmEmail": {
        "Default": "devops-geeks@foundry.com",
        "Description": "Email address to notify if operational problems arise",
        "Type": "String"
    },
    "InstanceType": {
        "Description": "WebServer EC2 instance type",
        "Type": "String",
        "Default": "t2.micro",
        "AllowedValues": [
            "t1.micro",
            "t2.micro",
            "t2.small",
            "t2.medium",
            "m1.small",
            "m1.medium",
            "m1.large"
        ],
        "ConstraintDescription": "must be a valid EC2 instance type."
    },
    "KeyName": {
        "Description": "Name of an EC2 KeyPair to enable SSH access to the instance.",
        "Type": "AWS::EC2::KeyPair::KeyName",
        "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
    },
    "SSHLocation": {
        "Description": " The IP address range that can be used to access the web server using SSH.",
        "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."
    },
    "WebServerCount": {
        "Description": "Number of Amazon EC2 instances to launch for the WebServer server",
        "Type": "Number",
        "Default": "1"
    },
    "GitHubPassword": {
        "NoEcho": "true",
        "Description": "GitHub Password",
        "Type": "String"
    },
    "GitHubUsername": {
        "Description": "GitHub Username ",
        "Type": "String"
    }
},
"Mappings": {
    "AWSInstanceType2Arch": {
        "t1.micro": {
            "Arch": "PV64"
        },
        "t2.micro": {
            "Arch": "HVM64"
        },
        "t2.small": {
            "Arch": "HVM64"
        },
        "t2.medium": {
            "Arch": "HVM64"
        },
        "m1.small": {
            "Arch": "PV64"
        },
        "m1.medium": {
            "Arch": "PV64"
        },
        "m1.large": {
            "Arch": "PV64"
        }
    },
    "AWSRegionArch2AMI": {
        "eu-west-1": {
            "PV64": "ami-bf0897c8",
            "HVM64": "ami-a10897d6",
            "HVMG2": "ami-d5bc24a2"
        },
        "eu-west-2": {
            "PV64": "ami-896369ed",
            "HVM64": "ami-896369ed",
            "HVMG2": "ami-896369ed"
        },
        "eu-central-1": {
            "PV64": "ami-ac221fb1",
            "HVM64": "ami-a8221fb5",
            "HVMG2": "ami-7cd2ef61"
        }
    }
},
"Outputs": {
    "URL": {
        "Value": {
            "Fn::GetAtt": [
                "PublicElasticLoadBalancer",
                "DNSName"
            ]
        },
        "Description": "Newly created application URL"
    }
}
}

注意:某些CF设计器代码已被排除,以阻止stackoverflow抱怨文件太大。 可能导致此问题的任何想法?

2 个答案:

答案 0 :(得分:2)

好像您没有等待自动扩展组,因此在您的ASG有任何工作实例之前完成堆栈创建。当实例启动并执行cfn-signal时,堆栈已完成。

尝试添加CreationPolicy

https://aws.amazon.com/blogs/devops/use-a-creationpolicy-to-wait-for-on-instance-configurations/

和/或UpdatePolicy

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html

以下内容,具体取决于您案例的具体情况:

"WebServerFleet": {
  "CreationPolicy": {
    "ResourceSignal": {
      "Timeout": "PT15M",
      "Count": "1"
    }
  },
  "UpdatePolicy": {
    "AutoScalingScheduledAction": {
      "IgnoreUnmodifiedGroupSizeProperties": "true"
    },
    "AutoScalingRollingUpdate": {
      "MinInstancesInService": "1",
      "MaxBatchSize": "2",
      "WaitOnResourceSignals": "true",
      "PauseTime": "PT15M"
    }
  }
}

如果您的设置更长或更短,您可能需要调整超时。批量大小也是需要考虑的因素。

答案 1 :(得分:1)

我遇到了同样的问题,CF堆栈已经到达CREATE_COMPLETE,所以cfn信号没有用。在EC2资源上附加了CreationPolicy,以告诉CloudFormation在5分钟内等待1个成功信号,然后继续进行堆栈创建并将其标记为CREATE_COMPLETE。因此,将cfn-signal与CreationPolicy一起使用可以解决此问题。下面是堆栈模板

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

    "Description" : "AWS CloudFormation Sample Template EC2InstanceWithSecurityGroupSample: Create an Amazon EC2 instance running the Amazon Linux AMI. The AMI is chosen based on the region in which the stack is run. This example creates an EC2 security group for the instance to give you SSH access. **WARNING** This template creates an Amazon EC2 instance. You will be billed for the AWS resources used if you create a stack from this template.",

    "Parameters" : {
      "KeyName": {
        "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instance",
        "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.micro",
        "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"]
  ,
        "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."
     }
    },

    "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"  }
      }
  ,
      "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" : {
      "EC2Instance" : {
        "Type" : "AWS::EC2::Instance",
        "Metadata" : {
          "AWS::CloudFormation::Init" : {
              "configSets" : {
                  "InstallAndRun" : [ "config1", "config2" ]
              },
              "config1" : {
                  "packages" : {
                      "yum" : {
                          "httpd" : []
                      }
                  },
                  "files" : {
                      "/var/www/html/index.html" : {
                          "mode" : "000644", 
                          "owner" : "apache", 
                          "group" : "apache",
                          "source" : "https://s3.amazonaws.com/pcr-docs/index.html"
                      }
                  }
              },
              "config2" : {
                  "services" : {
                      "sysvinit" : {
                          "httpd" : {
                              "enabled" : "true",
                              "ensureRunning" : "true",
                              "packages" : { "yum" : ["httpd"] }
                          }
                      }
                  }
              }
          }
      },
        "Properties" : {
          "InstanceType" : { "Ref" : "InstanceType" },
          "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
          "KeyName" : { "Ref" : "KeyName" },
          "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" },
                            { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] },
          "UserData" : { "Fn::Base64" :
                              { "Fn::Join" : ["", [
                                 "#!/bin/bash -xe\n",
                                 "yum update -y aws-cfn-bootstrap\n",
                                 "# Install the files and packages from the metadata\n",
                                 "/opt/aws/bin/cfn-init -v ",
                                 "         --stack ", { "Ref" : "AWS::StackName" },
                                 "         --resource EC2Instance ",
                                 "         --configsets InstallAndRun ",
                                 "         --region ", { "Ref" : "AWS::Region" }, "\n",
                                 "# Signal the status from cfn-init\n",
                                 "/opt/aws/bin/cfn-signal -e $? ",
                                 "         --stack ", { "Ref" : "AWS::StackName" },
                                 "         --resource EC2Instance ",
                                 "         --region ", { "Ref" : "AWS::Region" }, "\n"
                              ]]}
                      }                  
        },
        "CreationPolicy": {
          "ResourceSignal": {
            "Count": "1",
            "Timeout": "PT5M"
          }
        }
      },

      "InstanceSecurityGroup" : {
        "Type" : "AWS::EC2::SecurityGroup",
        "Properties" : {
          "GroupDescription" : "Enable SSH access via port 22",
          "SecurityGroupIngress" : [ 
            { "IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"} },
            { "IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : { "Ref" : "SSHLocation"} }
           ]
        }
      }
    },

    "Outputs" : {
      "InstanceId" : {
        "Description" : "InstanceId of the newly created EC2 instance",
        "Value" : { "Ref" : "EC2Instance" }
      },
      "AZ" : {
        "Description" : "Availability Zone of the newly created EC2 instance",
        "Value" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ] }
      },
      "PublicDNS" : {
        "Description" : "Public DNSName of the newly created EC2 instance",
        "Value" : { "Fn::GetAtt" : [ "EC2Instance", "PublicDnsName" ] }
      },
      "PublicIP" : {
        "Description" : "Public IP address of the newly created EC2 instance",
        "Value" : { "Fn::GetAtt" : [ "EC2Instance", "PublicIp" ] }
      }
    }
  }