CloudFormationで管理しているRDSを手動でアップデートしました。ドリフトをどのように解消すればいいでしょうか?への回答

CloudFormationで管理しているRDSを手動でアップデートしました。ドリフトをどのように解消すればいいでしょうか? に対するアンサーです。 CloudFormationでのRDS運用は悩ましいですね。
2020.11.15

コンニチハ、千葉です。

テクニカルサポートノートとは?

クラスメソッドのカルチャー(CLP) の「情報発信を通じて、全ての人々の創造活動に貢献し続ける」という考えから、クラスメソッド メンバーズをご利用のお客様よりいただいたお問い合わせより、他の AWS ユーザーにとっても 有益な情報を一般的な TIPS としてご紹介しています。

困っていた内容

CloudFormationで管理しているRDSを手動でアップデートしました。ドリフトをどのように解消すればいいでしょうか?

解決方法

前提として、RDS を CloudFormation でバージョンアップする場合は、置換されます。置換の動作としては、完全に新規のインスタンスが作成されデータは保持されないためご注意ください。

参考:https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html

また、差分があるCloudFormationのパラメータ更新し、スタックをアップデートすることで対象リソースを変更せずドリフトを解消する方法もありますが、今回のケースはRDSの置換が発生し、RDS内のデータも削除されます。そのため今回のケースではご利用いただけません。

CloudFormation で管理している DB クラスターのエンジンバージョンを更新する際の対応としては、以下のいずれかの代替案での対応をご検討ください。

いずれの方法を利用する場合でも、事前に検証環境等で十分にテストを行った後に、本番環境で実施ください。

1. データの論理バックアップを取得し、リソース(スタック)は新規に再作成する

既存の DB クラスターから論理バックアップ( mysqldump 等)でデータのバックアップを取得した上で、対象のスタックを削除いたします。その後、EngineVersion を更新したスタックを新規に作成し、データは論理バックアップからリストアしていただくといった方法になります。

データのバックアップやリストア等の作業を実施する必要がありますが、引き続き、CloudFormation でリソースを管理できます。

2-1. CloudFormation による管理から対象のリソースを削除する

DeletionPolicy を Retain に指定することで、CloudFormation スタックを削除した後も DB クラスター等のリソースが削除されず保持されます。以降、対象の DB クラスターは CloudFormation による管理の対象ではなくなってしまいますが、通常のリソース (CloudFormation で作成していないリソース)と同様に、 RDS マネジメントコンソール等から手動でエンジンバージョンのアップグレードを実施できます。

参考:https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html

2-2. 2-1で手動アップグレードを実施した後、CloudFormation にインポートする

2-1でエンジンバージョンの更新が完了した後、作成したリソースを CloudFormation へインポートします。

インポート手順に関しては、以下をご確認ください。

参考:https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import.html

またインポートに関して、対応しているリソースに制限があるため十分検証いただき導入をご検討ください。

参考:https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import-supported-resources.html

以上、千葉がお送りしました。