CloudFormation で構築したRDSのレストア

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

渡辺です。 今日はAWSの検証ネタでお送りします。

CloudFormationのアップデート

CloudFormationはテンプレートファイルを作成すれば、繰り返し何度でも同じAWS環境を構築できるようになります。 また、一度構築したインフラを少しずつ拡張していくために利用することもできます。

例えば、はじめに構築したインスタンスタイプでは処理能力が不足した時、マネジメントコンソールやAPIを利用してインスタンスタイプを変更することができます。 CloudFormationでは、テンプレートファイルを修正し、アップデートすることで構成を変更することで同じことができるわけです。 しかし、はじめに環境をCloudFormationで構築した場合は、ずっとCloudFormationでアップデートするか、もしくはその後の修正は手動(APIやコンソール)で行うかどちらかの方針にする必要があります。 これは、CloudFormationの管理下以外で、勝手にインスタンスの削除などを行うと、アップデート時に管理しているリソースが見つからなくなるなどの状況に陥るのが主な理由です。

RDSのレストアにおけるCloudFormation

我々がEC2にRDBをインストールするのではなく、RDSを推奨する一番の理由は冗長化・バックアップ/レストアなどがサポートされているフルマネジメントサービスであることです。 RDSもCloudFormationで構築・更新可能なAWSのリソースですから、CloudFormationを活用して環境を構築するならば、自然とRDSのリソースの定義もCloudFormationのテンプレートに定義するでしょう。

さて、RDSを運用している中で、バックアップからレストアしなければならない状況になった時、どうすれば良いでしょうか? CloudForamtionを利用していない場合は、マネジメントコンソールから該当のRDSを削除し、スナップショットからレストアするだけです。 しかし、これではCloudFormationの管理から外れてしまうのではないか?と考えられます。

確認してみました。

準備

はじめに、適当なCFnテンプレートを用意し、RDSを立ち上げます。 スタックが起動し、RDSの準備ができたならば、スナップショットを作成しておきます。

RDS_·_AWS_Console

この状況で、RDSに障害が発生したことを想定します。

コンソールからレストアする

RDSをレストアするには、RDSを削除した後でSnapshotからRestoreするだけです。 Restoreが完了すれば、Snapshotの時点までデータは戻るものの、システムは復旧できるでしょう。

この状態でCFnのテンプレートを更新し(例えばインスタンスタイプ変更)、アップデートを行ってみます。

CFn_failed

このように「UPDATE_FAILED」となってしまいます。 Physical IDが見つからないと表示されているように、当初あったインスタンスを手動で削除してしまったため、CFnがうまく機能できない状態です。 一度、このような状況になってしまうと、他のリソースの更新もうまくいかない状態となるので注意してください。

CloudFormationでレストアする

コンソールからのレストアは上手くいきませんが、CloudFormationを使ってレストアすれば問題なくレストアが可能です。 少々解りにくいのですが、DBSnapshotIdentifierにスナップショットのIDを指定することでレストアとなります。 なお、この時にDBNameを指定するとエラーとなるので注意してください。

テンプレートの一部です。

        "DbPrd": {
            "Type": "AWS::RDS::DBInstance",
            "Properties": {
                "DBSubnetGroupName": {
                    "Ref": "DbSubnet"
                },
                "MultiAZ": false,
                "DBInstanceClass": "db.t2.micro",
                "AllocatedStorage": "6",
                "DBSnapshotIdentifier": "restore-from-cfn",
                "Engine": "mysql",
                "EngineVersion": "5.6.21",
                "Port": "3306",
                "DBParameterGroupName": "default.mysql5.6",
                "AvailabilityZone": "ap-northeast-1a"
            }
        }

このようにテンプレートファイルを修正してアップデートをかければ、既存のRDSは削除され、新しいRDSがスナップショットから作成(レストア)されます。

CloudFormation_Management_Console

RDS_·_AWS_Console 2

まとめ

CloudFormationを利用している場合は、RDSをレストアする時もCloudFormationで!