Amazon cloudformationでEC2 :: InstanceまたはRDS :: DBInstanceの再作成を強制することは可能ですか?


16

cloudformationスタックを使用してEC2またはRDSインスタンスの再作成を強制することは可能ですか?

私のスタックは、リソースを単に破棄して作成するだけで修正されるという点で立ち往生しています。代わりに、作業を続けるためにスタック全体を削除する必要がありました。

編集:

この問題は私に二度襲いました。最初に、いくつかのデフォルトでAWS :: RDS :: Instanceを作成し、それを "EngineVersion": "5.5"にダウングレードしようとしました。これを変更すると、何らかの中断が発生する可能性がありますが、mysqlインスタンスを5.6から5.5にダウングレードできないため、スタックはUPDATE_FAILED状態のままであり、厄介なトリックなしでRDSを再作成することはできません。

もう1つは、「UserData」からスクリプトをダウンロードして実行する「AWS :: EC2 :: Instance」が複数あることです。ダウンロードしたスクリプトを変更した場合、インスタンスを削除する必要があります。もう一度、同じ厄介なトリックを使用して、マシンを再作成します。

厄介なトリック:

1台のマシンの自動スケーリンググループを使用する代わりに、プロパティのアベイラビリティゾーンを変更する両方の問題を解決しました...


回答するには詳細情報が必要です。インスタンスは起動時にフリーズしますか?サービスが応答しなくなりますか?EC2インスタンスを手動で再作成する場合は、1つのインスタンスで自動スケーリンググループを作成できます。インスタンスを終了すると、別のインスタンスが作成されます。
エドウィン

明確にするために編集。私もここで尋ねた:forums.aws.amazon.com/thread.jspa?threadID=135295&tstart=0
有神論

これはあなたの質問に直接答えるものではありませんが、変更時にUserDataスクリプトを再実行する場合は、docs.aws.amazon.comcfn-hup / AWSCloudFormation
Reed Kraft-Murphy

回答:


10

インスタンスストアにバックアップされたEC2インスタンスの場合、1つのトリックは、バージョン番号、日付などを含むユーザーデータスクリプトにコメントを追加し、インスタンスを再作成するたびにそれを変更することです。

{
    "Resources" : {
        "MyEC2Instance" : {
            "Type" : "AWS::EC2::Instance",
            "Properties" : {
                // ... other properties ...
                "UserData": { 
                    "Fn::Base64" : {
                        "Fn::Join" : [ ":", [
                        "#!/bin/bash\n",
                        "# Version: 1.0\n",
                        // ... rest of user data ...
                    ]]}
            }
        }
    }
}

変更するUserDataと、インスタンスが置き換えられます(つまり、再生成されます)。ただし、変更のみがコメントであるため、ユーザーデータスクリプトの動作は同じである必要があります。これは、EBS-backedインスタンスでは機能しないことに注意してください。

RDSの場合、現在のRDSインスタンスのDBスナップショットを取得し、そのスナップショットを使用するようにテンプレートを変更できますDBSnapshotIdentifier

{
    "Resources" : {
        "MyDB" : {
        "Type" : "AWS::RDS::DBInstance",
        "Properties" : {
            // ... other properties ...
            "DBSnapshotIdentifier": "<db snapshot ID>"
        }
    }    
}

DBSnapshotIdentifier変更されるたびに、データベースインスタンスが置き換えられます。スナップショットを使用すると、スナップショットが作成されたときからデータを保持することもできます。(あなたがいる場合したいデータを消去するために、あなたは空のスナップショットを作成し、入力としてそれを渡すことができます。または削除し、全体CloudFormationスタックを再作成します。)

より一般的なアプローチは、リソースの論理名を変更することです。CloudFormationドキュメントのスタックテンプレートの変更から :

ほとんどのリソースでは、リソースの論理名を変更することは、そのリソースを削除して新しいリソースに置き換えることと同等です。名前が変更されたリソースに依存する他のリソースも更新する必要があり、それらが置き換えられる可能性があります。他のリソースでは、更新をトリガーするために、論理名だけでなくプロパティを更新する必要があります。


私は、同様のソリューション:)を求めた後、いくつかの時間を(アベイラビリティゾーンの変更を強制する)に達した唯一の解決策は、「ダーティトリック」を行うためにあるようだ
有神論

4
インスタンスが置き換えられ、EC2インスタンスがインスタンスストアにバックアップされるときにUserDataが実行されることを指摘したいだけです。EBSがバックアップされている場合、UserDataの変更はインスタンスの再起動のみを行い、UserDataは再度実行されません。この場合でも、cfn-hupを使用してUserDataを再度実行できますが、インスタンスは同じままです。
開通

@Kaitsu:ありがとう、それは非常に貴重な説明です。それに応じて回答を更新しました。
マークスク

@Kaitsuしかし、スクリプト(/ var / lib / cloud / instance / scripts / part-001にある)を手動で再実行する場合は、同じコマンドを複数回実行するのを
防ぐ

1

AutoScalingGroupに配置する場合、AutoScalingGroupのmin / max / defaultを0に編集し、古いインスタンスを破棄し始めるとすぐに、min / max / defaultを1/1/1に配置し、 presto:新しいインスタンス。


0

EC2がAutoScalingGroupに属している場合AutoScalingGroupName、バージョン番号を使用してプロパティを設定できます。

バージョン番号を変更するたびに、CFNは次のことを行います。1.新しい自動スケーリンググループを作成し、目的のインスタンスをスピンアップします2.古い自動スケーリンググループのインスタンスを強制終了して削除します

スタックからのコードの一部を次に示します。このテクニックを使用して、多数のEC2マシンにS3から新しいソフトウェアを再作成し、自動的にプルさせます。

AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
        AutoScalingGroupName: !Sub "${StackName}-${ServiceName}-${ServiceVersion}"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.