AWS - NAT インスタンスが開始される前に LaunchConfig が開始する (CloudFormation)

AWS - NAT インスタンスが開始される前に LaunchConfig が開始する (CloudFormation)

私のシナリオ

CloudFormation テンプレートには、単一の VPC、パブリック サブネット、プライベート サブネットがあります。パブリック サブネットには、インスタンスに Amazon NAT AMI があります。プライベート サブネットには、内部 LoadBalancer の背後に自動スケーリング グループがあります。この自動スケーリング グループには、デモ Web ページを含む httpd をインストールするための LaunchConfig があります。

問題

このプライベート サブネット自動スケーリング グループで起動された EC2 インスタンスは、Web サーバーをインストールしません。これにより、ELB が失敗し、cloudformation スタック全体がロールバックされます。ただし、作成後に SSH で接続して、インターネット Web ページを正常に wget し、yum install httpd を手動で使用できます。これにより、ELB チェックが正常になり、cloudFormation スタックが修正されます。/var/log/cloudinit-output.log には、インスタンスが初期化中に amazon yum リポジトリを解決できなかったことが記録されています。

これは、NAT インスタンスが完全に起動して動作する前に、新しい EC2 インスタンスで LaunchConfig が開始されたことが原因である可能性があると思います。AutoScaling グループに 'DependsOn' : 'NATInstance' を追加してみましたが、問題は解決しませんでした。

手伝ってくれますか?

答え1

Cloudwatcher さんの回答は正しかったのですが、今後同様の問題に遭遇する人のために詳しく説明したいと思います。

CloudFormation テンプレートの 'DependsOn' 属性は、リソースが完了したことを通知したときに満たされます。デフォルトでは、これは Amazon がリソースを作成したときであると私は考えています。私の例では、NAT インスタンスは実際に作成されており、インスタンスが通知していたときです。ただし、インスタンス内の構成と設定が完了していなかったため、他のインスタンスが NAT を利用しようとするまで、NAT は動作しませんでした。その後、他のインスタンスは NAT インスタンスを介してインターネットに接続できなかったため失敗しました。

デフォルトのシグナリングは手動で上書きできます。つまり、アクションを実行してから完了したらシグナルを送信できます。それに依存する他のすべてのリソースの 'DependsOn' 属性は、適切に機能します。これを行うには、EC2 インスタンス内の Amazon ヘルパー スクリプト、具体的には 'cfn-init' と 'cfn-signal' を使用します。EC2 インスタンス (または自動スケーリング グループ) の 'UserData' プロパティで、yum install aws-cfn-bootstrap を実行してスクリプト (または使用しているパッケージ マネージャー) を取得します。次に、UserData 内で初期化手順を実行し、完了したら、cfn-signal を使用してリソースが完了したことをシグナル送信します。次に例を示します。

"UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
            "#!/bin/bash -xe\n",
            "yum update -y aws-cfn-bootstrap\n",
            "wget <<URL FOR YOUR INIT BASH SCRIPT HERE>> -O - | bash\n",

            "/opt/aws/bin/cfn-init -v ",
            "         --stack ", { "Ref" : "AWS::StackName" },
            "         --resource <RESOURCE TO SIGNAL HERE> ",
            "         --region ", { "Ref" : "AWS::Region" }, "\n",

            "/opt/aws/bin/cfn-signal -e $? ",
            "         --stack ", { "Ref" : "AWS::StackName" },
            "         --resource <RESOURCE TO SIGNAL HERE> ",
            "         --region ", { "Ref" : "AWS::Region" }, "\n"
            ]]}}

これが誰かの役に立つことを願います。

答え2

セキュリティグループやトラフィックの許可などについては、考慮すべき点がいくつかあります。しかし、NATに関しては、NAT起動設定で次のことを実行していないことを確認してください。

/opt/aws/bin/cfn-signal

セットアップとパススルー スクリプトが完了するまで。NAT に「DependsOn」している場合は、CloudFormation スタックがこの信号を受信するまで続行されません。

[編集] 今日(2015-12-18)以降にこれを見ている人は、AWS が提供する NAT マネージド サービスへの移行を真剣に検討する必要があります。詳しくはこちら:

関連情報