【问题标题】:Understanding use of CloudFormation cfn-signal了解 CloudFormation cfn-signal 的使用
【发布时间】:2019-01-23 18:44:45
【问题描述】:

来自 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-signal 并仅使用 cfn-init 运行 Init Metadata 脚本,它的工作原理相同,创建实例后堆栈到达 CREATE_COMPLETE。

再次来自文档

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

但我不清楚我们应该何时以及如何使用 cfn-signal?

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation


    【解决方案1】:

    我的 cfn 信号丢失了 CreationPolicy,因为我没有使用 CreationPolicy 来等待 EC2 实例上的引导完成并且 Cloudformation 堆栈已经达到 CREATE_COMPLETE 状态,在堆栈已经达到 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" ] }
          }
        }
      }
    

    【讨论】:

    • 谢谢,我正在准备 AWS devops 考试,这看起来像是一道考试题。 :-)
    猜你喜欢
    • 2019-06-29
    • 2017-07-16
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 2019-03-07
    • 2019-07-08
    相关资源
    最近更新 更多