既にコンソールで作ったRDSインスタンスをCloudFormation管理下に移動する
雑な人が雑に作ったRDSがあります
大学時代の私が適当にコンソールで作ったS3やRDSなどのリソースをAWS CloudFormation(CDK)で管理することにしました。
設定の変更やアップデートのデプロイを楽にしたかったので。
S3は普通にインポート出来たのですが、 RDSのインポートにちょっと詰まったのでメモします。
雑にインポートしてはダメ
CloudFormation cannot update a stack when a custom-named resource requires replacing.
と言われてしまいます。うーん別に破壊しないと変更できない要素はないと思うのですが、とにかくダメらしいですね。
renameもRDSだと厳しいので別の方法を探します。
DatabaseInstanceFromSnapshotを使ってはダメ
適当に検索するとスナップショットを使って DatabaseInstanceFromSnapshot から復活させれば良さそうに思えますが、これでは新規に認証を設定することが出来ませんし、
DBSnapshotIdentifier プロパティを使用して DB インスタンスを復元した後、DB インスタンスへの今後の更新で同じ DBSnapshotIdentifier プロパティを指定する必要があります。更新でこのプロパティを指定すると、DB インスタンスは DB スナップショットから再度復元されず、データベース内のデータは変更されません。ただし、DBSnapshotIdentifier プロパティを指定しない場合、空の DB インスタンスが作成され、元の DB インスタンスは削除されます。以前のスナップショット復元プロパティとは異なるプロパティを指定した場合、新しい DB インスタンスは指定された DBSnapshotIdentifier プロパティから復元され、元の DB インスタンスは削除されます。
と言う特徴があるからダメです。
まず取った手法
CDKをデータベースを作成する所までは削り、データベースはコンソールで近い設定でVPCはCDKが作成したものを選択して作成して、インポートすれば動作しました。
サブネットグループが奇妙なことになります
サブネットグループがCDKのものではなく、コンソールで作成したものになってしまいます。
全部それになってしまうならまだ分かるのですが、 CDKが作成したサブネットグループもあってコンソールのものを使ってしまいます。
うまくインポート出来たのかもしれませんが、とにかくそうなってしまいました。
なんでか分かりませんが、同じVPCの間でサブネットグループを変更することは出来ないので、 amazon web services - AWS can not change DB Subnet Group for AWS RDS - Server Fault 一度違うVPCのサブネットグループに移動して、また元のVPCに戻って来る必要がありました。
あるんですが… うっかりCDKが作ったサブネットグループを削除してしまったので、元に戻れなくなりました。 Cfnが作ったものを削除してはいけない。(初歩)
仕方がないのでもう一度最初からやり直して、今度はサブネットグループはDatabaseInstance
による自動生成ではなく手動で作って、それをコンソールでスナップショットから復元するようにすればうまく行きました。
手動作成にも名前がわかりやすくなるというメリットはありますが、冗長な面の方が目立ちますね…
弁明
今回はダウンタイムが発生してもさほど困らない状態だからこんなことをしましたけど、困る状態の時はちゃんと前のインフラを残しつつ違うドメインに作成して切り替えを行います。