CloudFormationスタックを誤って削除してしまった時に、リソースをCloudFormation管理に復活させる方法

はじめに

ECS(Fargate)を手動構築すると自動でCloudFormation(※以降、CFn)が作成されるのですが、このスタックを誤って削除してしまいました。
今回はたまたまFargateクラスター等の設定は残っていたので、このままの状態でもFargateの動作には影響はないのですが、どうしてもCFnの管理に戻したい場合の復活方法をご紹介します。
今回のこの方法は、ECS(Fargate)のCFnスタックに限らず、作成済みリソースをCloudFormation管理に含めることが可能となります。

スタックの復元方法

残念ながら、ECS(Fargate)を手動構築した際にできたCFnスタックを復元する方法はありませんでした。

※このケースに限りませんが、削除されてしまったスタックを復元することはAWSサポートでもできないようです。

復元方法としては2つの方法が考えられます。

  1. ECSクラスターを一度削除する等もう一度クラスターを作成する
    再作成となるので、切り替え等によるダウンタイム等考慮する必要がありますが、元の状態に戻すことが可能です。
  2. CFnスタックのリソースインポート機能を利用する
    スタックのテンプレートが全く同じとはなりませんが、作成されたリソースを再度CFn管理とすることが可能です。

今回は「2. CFnスタックのリソースインポート機能を利用する」の方法をやっていきます。
ちなみに、元と全く同じCFnテンプレートにしたい場合は、残念ながら①の方法で再作成を実施しか方法はないです。。。

概要

今回はこちらの
スタックへの既存リソースのインポート
を利用することで、CFn管理リソースとしてインポートすることでスタックの復元を行います。

実施する内容は下記の通り、

  1. ECS(Fargate)を手動構築
  2. CFnテンプレートのECSクラスターにDeletionPolicyを追加し、スタック削除時にクラスターが削除されないように設定
  3. 自動で作成されたCFnスタックを削除
  4. CFnリソースインポートにてスタックを復元

を実施していきます。
また、既存リソースをCFnにインポートしたい場合は「④CFnリソースインポートにてスタックを復元」の手順のみ実施してください。

今回は、DeletionPolicy: Retain(削除しない)を指定しましたが、他にもオプションありますので、詳細は公式ドキュメントよりご確認ください。

注意点

先ほども記載しましたが、スタックへのリソースインポートを利用するには2点注意点があります。

  1. インポートするリソースにはDeletionPolicyを追加する必要がある
  2. Outputs プロパティは利用できない

上記、注意して利用してください。

実際にやってみる

1. ECS(Fargate)を手動構築

AWSコンソールにログインし、

Amazon Elastic Container Service > クラスター

から、「クラスターの作成」を押下します。

各設定のうち、


  1. クラスター設定 – クラスター名
  2. インフラストラクチャ – AWS Fargate(サーバレス)

をそれぞれ入力・選択し、ECSクラスターを作成します。

CloudFormation > スタック

から、先ほど作成したECSクラスター用のCloudFormationスタックが作成されているので確認します。

CloudFormationスタックのテンプレートを確認すると、下記のようなJSONを確認できます。

次の手順で、こちらにDeletionポリシーを設定します。

2. CFnテンプレートのECSクラスターにDeletionPolicyを追加

右上の「更新」を押下し、「デザイナーでテンプレートを編集する」を選択し、
「デザイナーで表示」を押下してテンプレートを更新します。

31行目付近にある、

の下に下記1行を追加します。

更新したら、左上の「スタックの作成」を押下します。

テンプレートを更新したら、「次へ」を押下します。

その後、「スタックの詳細を指定」、「スタックオプションの設定」、「レビュー」は特に変更せずに「送信」から更新を実行します。

スタックのステータスが「UPDATE_COMPLETE」になったら更新完了です。

3. 自動で作成されたCFnスタックを削除

DeletionPolicyにRetainが設定されましたので、CFnスタックを削除してもECSクラスターが残る設定となりましたので、一度CFnスタックを削除します。

削除が完了すると下記のようにステータスが「DELETE_COMPLETE」となります。

念の為、先ほどDeletionPolicyを設定したECSクラスターを確認しても削除されずにリソースが残っていることが確認できます。

こちらのテンプレートは後ほど利用するので、

テンプレート – クリップボードにコピー
からテンプレートをローカルに「template.json」等の名前で保存しておいてください。

もし、間違ってウィンドウを閉じたりして保存し忘れた場合でも、スタックの「ステータスのフィルター」から「削除済み」を選択すれば、削除済みのスタックの内容も確認することが可能です。

4. CFnリソースインポートにてスタックを復元

こちらが本題の、CloudFormationのリソースインポートを実行する手順となります。

まず、CFn実行に必要なテンプレートファイルを用意します。
先ほどローカルに保存したファイルを更新し、ファイル末尾にある下記Outputsセクションを削除します。

最終的にはこのようなテンプレートとなります。

また、もとのCFnテンプレートとの差分は下記の通りとなります。

作成したいリソースにDeletionPolicyを持った、OutputsがないCFnテンプレートが作成できたらスタックの作成を行います。

CloudFormationコンソールから「スタックの作成」を押下し、「既存のリソースを使用(リソースのインポート)」を選択します。

説明の画面があるので内容を確認します。

必要なもの
テンプレート
このインポート中に、ターゲットリソースを含むスタック全体を記述するテンプレートを指定する必要があります。既存のスタックリソースが、準備済みのテンプレートで変更された場合、インポートは失敗します。

識別子の値
このインポート中に、インポートするリソースを (S3 バケット名などで) 特定する必要があります。このプロセスの手順はウィザードに従います

テンプレートの指定画面で、テンプレートのアップロードを選択し、先ほど保存したテンプレートをアップロードし、
「次へ」を押下します。

インポートするリソースに、「CFn管理としたいリソース ※今回の場合はClusterName」を設定し、
「次へ」を押下します。

スタックの詳細を指定 – スタック名
に作成するスタック名を入力して、「次へ」を押下します。
変更の箇所で、指定したECSClusterが「アクション: Import」となっていることを確認し、
「リソースをインポート」を押下してスタックの作成を行います。

注意: Outputsセクションが削除されていないと、変更の箇所に下記エラーが発生します。

この変更セットの作成中にエラーが発生しました
As part of the import operation, you cannot modify or add [Outputs]

しばらくすると、作成したスタックのステータスが、「IMPORT_COMPLETE」となれば設定完了となります。

リソースタブを確認することで無事、リソースがCFn管理となっていることも確認できます。

まとめ

今回のCFnスタックへの既存リソースのインポート機能を利用すれば、手動構築したリソースをCFnの管理に含めることが可能となります。

CFnスタックを削除すると関連しているリソースは全て削除されてしまいます。削除されるとまずいリソース(EC2やRDS等々)についてはDeletionPolicyや削除保護等で削除されないようにしておけば最悪、こちらの方法でCFn管理に戻すことは可能となります。
誤って削除してしまった際は焦らずこのような方法も検討下さい。