AWS Backup(CloudFormation)を使って既存スタックにリストアしたい

2022.12.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、シマです。
AWS re:Invent 2022でたくさんのサービスアップデートが公開されました!
その中でもAWS BackupにおけるCloudFormationのバックアップについていくつか気になったので
本記事ではその中の1つ目を試してみました。

想定したユースケース

Cloudformationを使用して作成した環境(VPCやSG等)を使用しています。
AWS Backupによりバックアップを取得しました。
ユースケース01

運用の中で一時的なセキュリティグループの設定変更をしました。
ユースケース02

バックアップ取得時点の状態に戻したいです。
ユースケース03

いきなり結論

稼働しているスタックに対してスタック更新で元に戻したかったのですが、
新しい別のスタックとしてリストアする必要がありました。

ただし、新しいスタックとしてリストアし、変更セットからテンプレートを見ることができるので
力技で同一スタックでアップデートスタックすることも一応可能でした。

やってみたこと

バックアップ取得

AWS Backupから、保護されたリソースをクリックし、オンデマンドバックアップの作成を押下します。
backup01

リソースタイプを「CloudFormation」に変更し、対象のスタック名を指定します。
今回は検証なので、保持期間を1日に変更します。
「オンデマンドバックアップを作成」を押下し、バックアップを取得します。
backup02

その後、テンプレートファイルのセキュリティグループの内容を変更し、スタックの更新を実施します。
※本題からそれるので手順や詳細は割愛します。

既存スタックへの直接リストア

AWS Backupから、保護されたリソースをクリックします。
対象のリソースIDをクリックします。
backup03

対象を選択し、復元ボタンを押下します。
backup04

既存のスタックにリストアしたいので、既存スタック名を指定してみます。
適当なチェンジセット名を指定し、バックアップを復元ボタンを押下します。
backup05

以下のエラーメッセージが表示され、リストアできませんでした。

Stack [myapp] already exists and cannot be created again with the changeSet [myapp-changeset].

backup06

AWS BackupのCloudFormationについては、日本語ドキュメントはまだ公開されていませんが、
英語のドキュメントに以下の記載がありました。

When you restore a CloudFormation stack backup (a recovery point), you create a new stack with a change set to represent the backup

「new stack」と記載されているので、既存スタックへの直接リストアはできないのだと思います。

リストア途中でテンプレートを抽出し、手動で既存スタックに更新

AWS BackupによるCloudFormationのリストアは変更セットで実施されます。
そのため、変更セットの内容からテンプレートファイルを作成し、
アップデートスタックできるのでは?と考えました。

AWS Backupから復元します。
先ほどと同様の手順で復元まで進み、適当なスタック名とチェンジセット名を指定し、バックアップを復元ボタンを押下します。
restore01

CloudFormationの画面からリストアしたテンプレートをクリックし、
変更セットからリストアした変更セットをクリックします。 restore02

テンプレートをクリックし、下部に表示されたテンプレートの中身をコピーし、
メモ帳等に貼り付け、テンプレートファイル(YAMLまたはJSON)として保存します。
restore03

保存したテンプレートファイルを使用し、既存のスタックに更新をかけます。
※通常のスタック更新なので詳細は割愛します。 restore04

スタック更新が完了し、問題なくリストアが完了しました。

最後にリストア途中になっているスタックを削除することを忘れずに実施します。
delete01

最後に

今回想定したユースケースでは、
AWS Backupを使った直接的なリストアはできないということがわかりました。
今後のリリースで直接スタック更新できるようになるとうれしいなと思いました。

ただ、AWS BackupでCloudFormationのバックアップをとることは、
テンプレートに含まれるEC2やRDSのような
アプリケーション全体でのバックアップが取得できることにメリットがあると思っていますので
シーンを選んでどんどん使っていきたいと思っています。