使用launchConfiguration和AutoScalingGroup在aws cloudformation中使用cfn-signal

时间:2017-02-26 01:21:36

标签: amazon-web-services amazon-cloudformation

我的AWS Cloudformation模板中有以下配置。

模板基于instance1创建一个EC2实例。我在LaunchConfiguration中使用对同一实例的引用来创建相同类型的实例。 我面临的问题是在我的AutoScalingGroup模板中包含CreationPolicy元素。当ASG启动实例并等待cfn信号时,我收到以下错误。

+ /opt/aws/bin/cfn-signal -e 0 --stack ss07 --resource Instance1 --region us-west-2
ValidationError: Resource Instance1 is in CREATE_COMPLETE state and cannot be signaled

似乎某种程度上引用了已经存在的instance1而不是LaunchConfig创建的实例。我看到了嵌入了LaunchConfig的示例,但我希望将实例详细信息保存在一个地方而不是两个地方。

"instance1": {
      "Type": "AWS::EC2::Instance",
      "Metadata": {
        "AWS::CloudFormation::Init": {
          "configSets": {
            "install": ["yum_packages","install_cfn"]
          },

          "yum_packages": {
              "packages" : {
                  "yum" : {
                    "awslogs"        : [],
                    "ruby"        : [],
                    "wget"        : [],
                    "httpd"       : []
                  }
            }
          },
          "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 splitsweetInstance ",
                      "         --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"
                                ]
                            }
              }
            }
          }
        }
      },
      "CreationPolicy": {
        "ResourceSignal": {
          "Timeout": "PT10M"
        }
      },
      "Properties": {
        "ImageId": {
                "Fn::FindInMap": [
                    "AWSRegionArch2AMI", {
                        "Ref": "AWS::Region"
                    }, {
                        "Fn::FindInMap": [
                            "AWSInstanceType2Arch", {
                                "Ref": "instanceType1"
                            },
                            "Arch"
                        ]
                    }
                ]
            },
        "InstanceType": {"Ref": "instanceType1"},
        "KeyName": {"Ref": "KeyName"},
        "Monitoring": "false",
        "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 splitsweetInstance ",
             "         --configsets install ",
             "         --region ", { "Ref" : "AWS::Region" }, "\n",

             "wget ", { "Fn::FindInMap": [  "Region2CodeDeployAgent", { "Ref": "AWS::Region"},  "url"] }, "\n",
             "chmod +x ./install\n",
             "./install auto\n",

             "# Signal the status from cfn-init\n",
             "/opt/aws/bin/cfn-signal -e $? ",
             "         --stack ", { "Ref" : "AWS::StackName" },
             "         --resource splitsweetInstance ",
             "         --region ", { "Ref" : "AWS::Region" }, "\n"

        ]]}},
        "Tags": [
          {
            "Key": "Name",
            "Value": "inst1"
          }
        ],
        "SecurityGroupIds": [
            { "Fn::GetAtt" : [ "instance1Sg", "GroupId" ] }
        ]
      }
    }

我的启动配置如下 -

"LaunchConfig1": {
       "Type" : "AWS::AutoScaling::LaunchConfiguration",
       "Properties" : {
          "ImageId": {
            "Fn::FindInMap": [
                "AWSRegionArch2AMI", {
                    "Ref": "AWS::Region"
                }, {
                    "Fn::FindInMap": [
                        "AWSInstanceType2Arch", {
                            "Ref": "instanceType1"
                        },
                        "Arch"
                    ]
                }
            ]
          },
          "InstanceId" : { "Ref":"instance1"},
          "InstanceMonitoring" : "false",
          "InstanceType" : { "Ref": "instanceType1"},
          "KeyName" : { "Ref" : "KeyName" },
          "SecurityGroups" : [ { "Fn::GetAtt" : [ "instance1Sg", "GroupId" ] } ]
       }
    }

这是我的AutoScalingGroup模板 -

    "AutoScalingGroup1":    {
       "Type" : "AWS::AutoScaling::AutoScalingGroup",
       "Properties" : {
          "AvailabilityZones" :  {  "Fn::GetAZs": { "Ref": "AWS::Region" }   },
          "Cooldown" : "60",
          ....
          "LaunchConfigurationName" : {"Ref":"LaunchConfig1"},
          "MaxSize" : "3",
          "MinSize" : "1",
          "TargetGroupARNs" : [ {"Ref":"TargetGroup1"} ],
          "VPCZoneIdentifier" : [   { "Ref": "subnetCache1" },   { "Ref": "subnetCache2" },  { "Ref": "subnetCache3" }  ]
       },
       "CreationPolicy" : {
        "ResourceSignal" : {
          "Timeout" : "PT6M",
          "Count"   : "1"
         }
       }
    }   

3 个答案:

答案 0 :(得分:3)

问题在于,通过在InstanceId资源中指定LaunchConfiguration属性,它将重用用于启动初始EC2实例的相同UserData,包括对逻辑的硬编码引用由cfn-signal命令发出信号的资源。根据文件,

  

使用实例创建启动配置时,除BlockDeviceMappingAssociatePublicIpAddress外,所有属性都是从实例派生的。您可以通过在启动配置中指定实例来覆盖实例中的任何属性。

要让cfn-signal发出正确的资源信号,您需要覆盖LaunchConfiguration资源中的UserData以包含引用启动配置的用户数据脚本而不是原始脚本EC2实例。不幸的是,这需要复制用户数据脚本,或者重写脚本以动态地找出与脚本当前运行的实例相关联的逻辑资源,因此在原始EC2中可以使用相同的精确用户数据实例和自动缩放组。

答案 1 :(得分:0)

我同意wjordan您遇到的部分问题是InstanceId中的LaunchConfiguration属性。另外,在查看代码示例时,我无法确定引用splitsweetInstance的位置。

但是我的CloudFormation AutoScalingGroup没有以这种方式设置,我仍然遇到同样的错误CREATE_COMPLETE state and cannot be signaled

我的解决方案是在DesiredCapacity设置AutoScalingGroup(希望这也有助于其他人)在这里找到: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-desiredcapacity

根据文档:

  

CloudFormation不会将Auto Scaling组标记为成功(通过将其状态设置为CREATE_COMPLETE),直到达到所需的容量。

这就是我的CloudFormation模板的那部分:

"WebServerGroup" : {
  "Type" : "AWS::AutoScaling::AutoScalingGroup",
  "Properties" : {
    "VPCZoneIdentifier" : { "Ref" : "Subnets" },
    "LaunchConfigurationName" : { "Ref" : "LaunchConfig" },
    "MinSize" : "2",
    "MaxSize" : "4",
    "DesiredCapacity" : "2",
    "TargetGroupARNs" : [ { "Ref" : "ALBTargetGroup" } ]
  }

以下是"信号" UserData部分:

         "# Signal the status from cfn-init\n",
         "/opt/aws/bin/cfn-signal -e $? ",
         "         --stack ", { "Ref" : "AWS::StackName" },
         "         --resource WebServerGroup ",
         "         --region ", { "Ref" : "AWS::Region" }, "\n",

答案 2 :(得分:0)

为解决此问题,我确保在使用组之前,在Autoscaling组中同时添加了 CreationPolicy UpdatePolicy 启动模板的 UserData 部分中的em> cfn信号

    CreationPolicy:
      AutoScalingCreationPolicy:
        MinSuccessfulInstancesPercent: somepercent
      ResourceSignal:
      Count: somenumber
      Timeout: someminutes
    UpdatePolicy:
      AutoScalingScheduledAction:
        IgnoreUnmodifiedGroupSizeProperties: 'true'
    AutoScalingRollingUpdate:
      MinInstancesInService: 'somenumber'
      MaxBatchSize: 'somenumber'
      PauseTime: someminutes
      WaitOnResourceSignals: 'true'