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

最佳答案

问题在于,通过在您的InstanceId资源中指定LaunchConfiguration属性,它可以重用用于启动初始EC2实例的相同UserData,包括对cfn-signal所指示的逻辑资源的硬编码引用命令。根据文档,


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


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

关于amazon-web-services - 带有launchConfiguration和AutoScalingGroup的AWS Cloudformation中的cfn信号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42463645/

10-11 06:23