2017-02-26 6 views
1

私はAWS Cloudformationテンプレートで次の設定をしています。launchConfigurationとAutoScalingGroupによるaws cloudformのcfn-signal

テンプレートは、instance1に基づいて1つの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 
何らかの理由で、既存のインスタンス1が参照されていて、LaunchConfigによってインスタンスが作成されていないようです。 LaunchConfigが組み込まれているサンプルを見ましたが、インスタンスの詳細を2か所ではなく1か所に保存したいと考えています。

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

次のように私の打ち上げConfigがある -

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

答えて

2

問題は、あなたのLaunchConfigurationリソースにInstanceIdプロパティを指定することによって、それがあるということです最初のEC2インスタンスを起動するために使用されたのと同じUserDataを再利用します。これは、tで示された論理リソースへのハードコーディングされた参照彼はcfn-signalコマンドを使用します。文書によると、

あなたが起動設定を作成するには、インスタンスを使用し

は、すべてのプロパティが BlockDeviceMappingAssociatePublicIpAddressを除いて、インスタンスから派生しています。起動設定でインスタンスを指定することにより、インスタンスから任意のプロパティを上書きできます。

cfn-signal信号に正しいリソースを持っている、あなたではなく、元のEC2インスタンスよりも起動の設定を参照するユーザデータのスクリプトが含まれているためにあなたのLaunchConfigurationリソースにUserDataをオーバーライドする必要があります。残念ながら、これにはUser-Dataスクリプトを複製するか、スクリプトが現在実行中のインスタンスに関連付けられた論理リソースを動的に把握するためにスクリプトを書き直す必要があります。したがって、元のEC2インスタンスと自動スケーリンググループを作成します。

+0

感謝。あなたの答えに関する追加の質問 - 1.私はUserDataを上書きする場合、メタデータはまだ適用されますか? LaunchConfigurationでメタデータを指定できませんでした。 2. 2番目のコメントについては、論理的なリソースの関連付けを動的に把握する例がありますか? –

0

あなたが持っている問題の一部が、InstanceIdのプロパティであると私は同意します。LaunchConfiguration。また、コードサンプルを見ると、splitsweetInstanceが参照された場所を特定できませんでした。

しかし、私のCloudFormation AutoScalingGroupはこのように設定されておらず、まだ同じエラーが発生していますCREATE_COMPLETE state and cannot be signaled

私は(うまくいけば、これは同様に他の人を助けます)AutoScalingGroupDesiredCapacityを設定されたためのソリューションがここに発見された: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-desiredcapacity

ドキュメントを1として:

CloudFormationは自動をマークしません。目的の容量に達するまで、グループを正常にスケーリングします(ステータスを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", 
関連する問題