
はじめに
こんにちは。SREチームの森原(@daichi_morihara)です。最近はゴルフにはまっており、先日初めてラウンドをまわりました。スコアは138😇😇😇、伸び代ですね。
今回はAmazon Auroraのクロスアカウントバックアップの実装と、その際に生じたAmazon AuroraのKMSキーの差し替え作業で得た学びを共有しようと思います。
前提
AWS Backupというサービスを利用してAmazon Auroraのクロスアカウントバックアップを実装しました。AWS BackupはAmazon Auroraに限らず、RDSやDynamoDBなどの多くのサービスのバックアップを簡単に作成・管理することのできる便利なサービスです。
このAWS Backupを使用してクロスアカウントバックアップを実装するにあたり、いくつかの制約が存在しますが、そのうちの一つに「DBがデフォルトのKMSキー(Amazon managed key)で暗号化されていないこと」という制約があります。これは、Amazon managed keyがアカウント間で共有することができないためです。
AWS Backup can perform cross-account backup for Amazon RDS encrypted with AWS KMS-CMK (Customer managed keys) because the AWS KMS-CMK can be shared across accounts. However, for Amazon RDS encrypted with KMS AWS managed key such as the default encryption key for RDS (aws/rds), the backups cannot be copied across accounts as the default encryption key for RDS cannot be shared across accounts.
そしてニーリーで運用していたAmazon Auroraは全てAmazon managed keyで暗号化されていました。つまりAmazon AuroraをCustomer managed key (CMK) を用いて暗号化する必要があります。既存のDBを直接別のキーで暗号化しなおすということはできないので、CMKで暗号化されたDBを複製し、既存のDBとすり替える作業が必要になります。
かねてよりキーポリシーなどを任意に設定できるCMKで暗号化したいという話はありましたが、なかなか優先度を上げて実施することはできませんでした。しかし必要性ができたことでCMK移行に踏み切れたので、振り返ってみると非常にいい機会でした。
発見と学び
当初、新しいDBにすり替えるにあたってDBのエンドポイントが変わってしまうことが懸念点でした。DBのエンドポイントが変わると、そのDBを参照しているシステムを洗い出し、参照エンドポイントを変更する必要があります。開発メンバーにDBの参照箇所の問い合わせも行いましたが、どこか見逃していたらどうしようとヒヤヒヤした記憶があります。
また今後このようなDBのすり替えが発生した場合でも複数箇所でエンドポイントの書き換える必要がないようにCnameのDNSレコードを間に挟むことも検討していましたが、そんな時に2つのありがたい事実を知ることができました。
それは、
1. Aurora Clusterの識別子は作成後に変更可能であるということ
2. クラスター識別子・リージョン・AWSアカウントIDが同一であればAurora Clusterのエンドポイントは同一になる
ということです。下がAurora Clusterエンドポイントの例となります。

この発見を踏まえ、以下の手順を実行することで、新しく作成したCMKで暗号化されたAurora Clusterに既存のDBエンドポイントを持たせることができます。またこの作業にはダウンタイムが伴うため深夜にサービスをメンテモードに切り替えた後に実施しました。
* 既存のAurora Cluster(AWS managed keyで暗号化)を旧Aurora Clusterと呼び、そのクラスター識別子をaurora-prod-clusterと仮定します。
旧Aurora Clusterの識別子を
aurora-prod-cluster→aurora-prod-cluster-oldに変更する。これにより、旧Aurora Clusterのエンドポイントが変更される。既存のエンドポイント(
aurora-prod-cluster.xxx.region.rds.amazonaws.com)にアクセスできないことを確認する。この確認時刻(T1)を控えておく。時刻 T1 よりも後の時刻で旧Aurora Clusterを元にPoint in time recovery (PITR) を使って新Aurora Clusterを作成する。新Aurora Clusterの識別子は
aurora-prod-clusterとし、CMKを使用して暗号化する。これにより、新Aurora Clusterのエンドポイントがaurora-prod-cluster.xxx.region.rds.amazonaws.comとなる。(Optional) Terraformでplan/apply を実行して、PITR複製により生じる軽微な差分(例: パフォーマンスインサイトの設定など)を吸収する。
CMKで暗号化された新Aurora Clusterのエンドポイント(
aurora-prod-cluster.xxx.region.rds.amazonaws.com)に正常にアクセスできることを確認する。
これらの手順を踏むことで、同じエンドポイントを保ったままCMKで暗号化されたAurora Clusterに切り替えることができます。
AWS Backupによるクロスアカウントバックアップの実装
Aurora ClusterがCMKで暗号化されKMSの制約がクリアできれば 、残りのクロスアカウントバックアップの実装はAWSの公式ドキュメントを参照しながらスムーズに進めることができました。AWSの公式ドキュメントに実装方法が詳細に書かれているため、ここでは具体的な実装方法の説明は割愛します 。
最後に
Aurora Clusterの識別子を作成後に変更できることや、Auroraのエンドポイントがクラスター識別子・リージョン・AWSアカウントIDによって決定されることは案外知られていないのではないでしょうか。今後同じ問題に直面する機会がありましたらぜひ参照していただけると幸いです。