了解CloudFormation CFN信号的使用

时间:2018-08-16 18:27:14

标签: amazon-web-services amazon-cloudformation

从AWS文档

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-signal.html

  

常见用法是将cfn-init和cfn-signal一起使用。的   cfn-signal调用使用对cfn-init的调用返回状态(使用   $?外壳结构)。如果应用程序安装失败,则   实例将无法创建,并且堆栈将回滚。

下面是我的堆栈

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

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

它创建EC2实例并运行定义为实例元数据的cfn-init,安装httpd并将index.html文件复制到/var/www/html/index.html

尽管堆栈创建了EC2实例并达到CREATE_COMPLETE状态,但是当我从EC2控制台检查实例的系统日志时。我在cfn-signal上看到一个错误,看起来Cloudformation堆栈已经到达CREATE_COMPLETE状态,因此在CREATE_COMPLETE之后发信号毫无意义

Updated:
  aws-cfn-bootstrap.noarch 0:1.4-30.21.amzn1                                    

Complete!
+ /opt/aws/bin/cfn-init -v --stack EC2-cfn-init --resource EC2Instance --configsets InstallAndRun --region us-east-1
+ /opt/aws/bin/cfn-signal -e 0 --stack EC2-cfn-init --resource EC2Instance --region us-east-1
ValidationError: Stack arn:aws:cloudformation:us-east-1:472821263165:stack/EC2-cfn-init/1f08fc80-a148-11e8-9779-500c28b3e2d2 is in CREATE_COMPLETE state and cannot be signaled
Aug 16 11:34:04 cloud-init[2680]: util.py[WARNING]: Failed running /var/lib/cloud/instance/scripts/part-001 [1]

另外,如果我完全删除cfn信号,而只是cfn-init来运行Init Metadata脚本,则它的工作原理相同,创建实例后堆栈到达CREATE_COMPLETE。

再次从文档中获得

  

您将cfn-signal脚本与CreationPolicy结合使用,或者   具有WaitOnResourceSignals更新策略的Auto Scaling组。什么时候   AWS CloudFormation使用这些策略创建或更新资源,   它会暂停堆栈上的工作,直到资源收到   必需的信号数或直到超过超时时间。

但是我不清楚何时以及如何使用cfn信号?

1 个答案:

答案 0 :(得分:1)

由于我没有使用CreationPolicy等待EC2实例上的引导完成,并且Cloudformation堆栈已经达到CREATE_COMPLETE状态,因此我没有使用CreationPolicy,这表明在将堆栈到达CREATE_COMPLETE之后发出成功的信号错误。我在EC2资源上附加了CreationPolicy,以便Cloudformation在5分钟内等待1个信号,然后再继续进行堆栈。这样就解决了问题。 下面是使用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" ] }
      }
    }
  }