俺では全くわからなかったRDS 証明書更新のトラップと回避方法


俺です。

普段RDS Auroraをご利用されている俺達は、最近AWSコンソールにアクセスする度に表示されるRDS SSL/TLS証明書交換の通知と毎日のようにチュッチュしていると思います。1週間後にリマインド送信フフッ...RDS♥⇔♥俺みたいな感じですよね。みんなもきっとそう。

なので証明書の強制ローテーションに伴うrebootがあるってことは誰もが知ってるので書きませんが、

緊急かつ重要なお知らせ ー Amazon RDS、Aurora、DocumentDB の証明書をローテーションしてくださいを見てメンテRTAにチャレンジした結果ドツボにハマって絶望したので、近い未来に同じ轍を踏みそうな世界のどこかにいる会ったことのない名前も知らない俺たちのために記録を残しておきます。
メンテタイムを短縮したい。もしくはCA交換時の再起動をコントローラブルにしたい方は参考にどうぞ。

  • 対象RDS Aurora: MySQL/PostgreSQL

RDS 証明書更新のアナウンスに期待した結果

アナウンス記事上は2020 年 1 月 14 日 ー この日以降、作成されるインスタンスは、新しい証明書 (CA-2019) を使用するようになります。必要性がある場合は、一時的に古い証明書に戻すこともできます。とあります。

と、いうことは...Aurora Clusterに新しくInstance追加したらCA2019として起動してくるんじゃないの。
と、いうことは...CA-2015なRDSインスタンスをCA-2019に変更せずに、新しくRDSインスタンスをクラスタへ追加しておけばCA-2019で起動されるってこと...?
と、いうことは...Failoverしたら終わりってメンテタイム爆縮できるやん最高やんけ抱いて!。と思ってしまいますが、実際にCA-2019のインスタンスで起動させるには...

  • Writerインスタンスの証明書がCA-2019になっていることが前提です。
  • Writerインスタンスの証明書がCA-2015だと新規追加したReaderインスタンスの証明書はCA-2015のままです。はい絶望します。
  • --no-certificate-rotation-restart でwriterのCA-2019に変更しておくだけでもOKです(内部でCAフラグがCA-2019になるため)

超図解

よってRDS再起動を最小限に抑えて証明書を更新するやり方は以下です。

1.RDS AuroraのWriterインスタンスを--no-certificate-rotation-restart 指定でrds-ca-2019に更新する。

aws rds modify-db-instance \
--db-instance-identifier chucchu-0 \
--ca-certificate-identifier rds-ca-2019 \
--no-certificate-rotation-restart \
--apply-immediately

2.Readerインスタンスを追加する

  • chucchu-ca2019-1と2を追加します。
  • CA-2019として起動してくれます。
aws rds describe-db-instances --db-instance-identifier chucchu-0 --query DBInstances[].CACertificateIdentifier --output text
rds-ca-2019
aws rds describe-db-instances --db-instance-identifier chucchu-1 --query DBInstances[].CACertificateIdentifier --output text
rds-ca-2015
aws rds describe-db-instances --db-instance-identifier chucchu-ca2019-1 --query DBInstances[].CACertificateIdentifier --output text
rds-ca-2019
aws rds describe-db-instances --db-instance-identifier chucchu-ca2019-2 --query DBInstances[].CACertificateIdentifier --output text
rds-ca-2019

3.Writerフェイルオーバーを実行します

aws rds failover-db-cluster --db-cluster-identifier chucchu --target-db-instance-identifier chucchu-ca2019-1

4.CA2015のReaderインスタンスを削除します。

chucchu-0と1を消しますさようならー。クラスタごと消さないようにオペミス考慮してクラスタのDeletion Protectionは仕掛けておきましょう

terraformを使う場合

今回試さなかったけどAWS Provider 2.44以上でサポートされたca_cert_identifierを使えばWriterのCAがCA-2015のままでもCA-2019のReaderインスタンス追加いけるんじゃないのって思ってます

  • terraform AWS Providerを2.44以上にverupする
  • ca_cert_idenfierを使う
  • terraform applyして既存aws_rds_clusterにCA-2019なaws_rds_cluster_instanceを追加する
  • Writer Failoverする
  • aws_rds_clusterからCA-2015のaws_rds_cluster_instanceを削除する
  • 抱いて!!

次は混乱しないようにまた証明書の有効期限が近づくまでアディオス