【问题标题】:cfn-signal in aws cloudformation with launchConfiguration and AutoScalingGroup带有 launchConfiguration 和 AutoScalingGroup 的 aws cloudformation 中的 cfn-signal
【发布时间】:2017-07-16 18:16:37
【问题描述】:

我的 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"
         }
       }
    }   

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation


    【解决方案1】:

    为了解决这个问题,我确保在使用 CreationPolicy 和 UpdatePolicy 之前在 Autoscaling 组中添加了 em>cfn-signal 在 LaunchTemplate 的 UserData 部分中

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

    【讨论】:

      【解决方案2】:

      我同意 wjordan 的观点,即您遇到的部分问题在于 LaunchConfiguration 中的 InstanceId 属性。还查看您的代码示例,我无法弄清楚 splitsweetInstance 的引用位置。

      但是我的 CloudFormation AutoScalingGroup 不是这样设置的,我仍然遇到同样的错误 CREATE_COMPLETE state and cannot be signaled。

      我的解决方案是在AutoScalingGroup 上设置DesiredCapacity(希望这对其他人也有帮助)在这里找到: 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",
      

      【讨论】:

        【解决方案3】:

        问题在于,通过在 LaunchConfiguration 资源中指定 InstanceId 属性,它会重用用于启动初始 EC2 实例的相同 UserData,包括对由cfn-signal 命令。根据文档,

        当您使用实例创建启动配置时,除BlockDeviceMapping 和AssociatePublicIpAddress 外,所有属性都派生自实例。您可以通过在启动配置中指定它们来覆盖实例中的任何属性。

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

        【讨论】:

        • 感谢您的回复。关于您的答案的其他问题 - 1. 如果我覆盖 UserData,元数据是否仍然适用?我在 LaunchConfiguration 中找不到指定元数据。 2.关于你的第二条评论,有没有动态找出逻辑资源关联的例子?
        猜你喜欢
        • 2019-01-23
        • 2017-08-11
        • 1970-01-01
        • 2019-11-03
        • 1970-01-01
        • 2020-07-10
        • 2019-06-29
        • 2020-06-17
        • 2019-03-07
        相关资源
        最近更新 更多