利用中の Cloud SQL を CMEK に対応させるために必要なこと
はじめに
こんにちは!SRE 部門所属の小林由暁です!
今回は、利用中の Cloud SQL インスタンスの暗号鍵の変更方法について手順ベースで解説します。
変更時の留意事項含めての解説となるため、ご検討されている方々の参考になれば幸いです。
この記事が役立つ人
- Cloud SQL の暗号鍵に
デフォルトの Google 暗号鍵
を利用中だが、CMEK
の利用に変更したい方 - Cloud SQL で CMEK を利用したいが、具体的な手順がイメージできない方
現在利用中の暗号化方法についての確認方法
まずは、利用中の Cloud SQL インスタンスで利用中の暗号鍵について確認します。
GUI(Google Cloud コンソール)及び gcloud コマンドで確認する方法の 2 点を紹介します。
GUI で確認する方法
以下のページにアクセスし、作成している Cloud SQL インスタンスの一覧を確認します。
表示されている項目から右にスクロールすると、暗号化
列が表示されます。
ここにお客様が管理
との記載があれば、CMEK を利用中です。Google が管理
と表示された場合は、デフォルトの Google 暗号鍵を利用中です。
もう 1 つの確認方法としては、上記 Cloud SQL インスタンス一覧から該当のインスタンスを選択し、概要タブから詳細を確認する方法があります。
概要タブ内の構成に顧客管理の暗号鍵を使用して暗号化されています
の記述があれば、CMEK を利用中です。
Cloud SQL の暗号化方法の確認 ①
Cloud SQL の暗号化方法の確認 ②
gcloud コマンドで確認する方法
gcloud コマンドを実行できる環境で、以下のコマンドを実行することで確認できます。
デフォルト Google 暗号鍵を利用している場合は、何も出力されずに、CMEK を利用中の場合は、キー名が出力されます。
GUI から確認する場合と比較しても、こちらの方が早いためおすすめです。
# コマンド
gcloud sql instances describe {インスタンス名} --format='value(diskEncryptionConfiguration.kmsKeyName)
# 出力例 : デフォルト Google 暗号鍵を利用中のインスタンスの場合
$ gcloud sql instances describe test-encrypt-google --format='value(diskEncryptionConfiguration.kmsKeyName)'
# 出力例 : CMEK を利用中のインスタンスの場合
$ gcloud sql instances describe test-encrypt-cmek --format='value(diskEncryptionConfiguration.kmsKeyName)'
projects/{project-id}/locations/{location}/keyRings/{keyRings-name}/cryptoKeys/{key-name}
実際の手順
ここからは、実際の作業手順について以下の順番で解説していきます。
基本は、公式ドキュメントの内容に従って解説します。手順は、一部を除いてコンソールを用いての内容とします。
- 前提条件
- 事前準備
- パターン 1 :既存インスタンス削除後に新規インスタンスを構築する方法
- パターン 2 :既存インスタンス、新規インスタンスを並行稼働する方法
制限事項
顧客管理の暗号鍵に関する注意点として、いくつかの制限事項があります。中でも特に注意が必要なのは、「既存のインスタンスでは顧客管理の暗号鍵を有効にできない」という点です。
こちらの制限事項に従い、CMEK を利用したい場合は、別途新規インスタンスを作成する方法を実施する必要があります。
他の制限事項は、以下のページより確認可能です。
事前準備
まずは、サービスへの影響がない事前準備から進めます。
API の有効化
以下の API 2 点を有効化しましょう。
- Cloud Key Management Service API
- Cloud SQL Admin API
鍵の作成
- 以下のリンクから鍵管理ページに移動し、
キーリングを作成
を選択します。
キーリングを作成を選択
- キーリング名、ロケーションタイプを選択し、
作成
を選択します。
基本情報を入力
- 鍵を作成ページに移動するため、基本情報を入力後に作成を選択します。
基本情報を入力
既存インスタンスからデータのエクスポート
新規インスタンスへデータを移行するために、既存インスタンスからデータをエクスポートします。
- 既存インスタンスの概要ページに移行し、エクスポートを選択します。
エクスポートを選択
- Cloud Storage へデータをエクスポートの画面に遷移するため、基本情報を入力後にエクスポートを選択します。
必要な項目を入力
ここから手順では、サービスへの影響が発生するため、後述する 2 つのパターンに分岐する方法となります。
パターン 1 : 既存インスタンス削除後に新規インスタンスを構築する方法
パターン 1 は、表題の通り既存インスタンスを一度削除後に、新規インスタンスを作成する方法です。
既存インスタンスを削除することで、同名で新規インスタンスを作成できるため、接続元のサービスによっては、設定変更が少なくなる点がメリットかと思います。
また、新規インスタンスの命名を考える必要がないため、比較的簡単に移行が可能となります。
パターン 1 : 留意事項
メリットもありますが、いくつかの留意事項もあります。
- サービスへの影響が大きい
- 切り替えを行わずに既存インスタンスを削除するため、削除時にサービスに停止が発生します。
- 接続元のサービス次第ですが、サービスへの影響を避けたい場合は、後述のパターン 2 を推奨します。
- 瞬時の切り戻しが出来ない
- 新規インスタンスに切り替え後に問題が発生した際に、既存インスタンスへの切り替えを瞬時に実施できません。
- 既存インスタンスへの切り戻しを実施する際には、
バックアップデータを取得していること
が前提となります。 - バックアップデータから復旧する場合は、Google Cloud サポートへの連絡も必要となるため、注意が必要です。
パターン 1 : 手順
既存インスタンスの削除
削除の保護
が有効になっている場合は、削除が出来ないので、インスタンスの編集ページか削除からの保護の有効化
のチェックボックスを外して、削除を実施しましょう。
削除の保護を解除
インスタンスページから削除を選択
確認後に削除
新規インスタンスの作成
通常の Cloud SQL インスタンスと作成手順は大きく変わりませんが、一部 CMEK に関する設定を追加します。
「構成オプジョン > ストレージ > 詳細暗号化オプション」の順番に表示すると、暗号化
を選択できるようになります。
Cloud KMS 鍵
に事前準備で作成した CMEK を選択します。
最後に、Cloud SQL に付与するサービスアカウントが CMEK へアクセスする権限を付与すれば完了です。
必要情報を入力
新規インスタンスへデータインポート
作成した新規インスタンスへ既存インスタンスのデータインポートします。
この際にインポートするデータは、事前準備で取得したものとなります。
アクセス元の設定変更
Cloud SQL を利用中のサービス等のアクセス設定を変更します。
パターン 2 : 既存インスタンス、新規インスタンスを並行稼働する方法
パターン 2 では、パターン 1 とは異なり、既存の Cloud SQL インスタンスを稼働させたままの方法です。
こちらの方法では、パターン 1 で問題となった、「サービスへの影響度」や「瞬時の切り戻しが出来ない」点も解消できます。
留意事項は、いくつかありますが、パターン 1 での留意事項の影響度を考慮すると、パターン 2 の方がより安全に移行が可能かと思います。
パターン 2 : 留意事項
- 新規インスタンス名を決める必要がある
- 同名インスタンスの稼働ができないため、新規インスタンスは別名で作成する必要があります。
- 移行期間は料金が高くなる
- 移行期間の長さによりますが、インスタンスを 2 台稼働させるため、その分の料金が発生します。
パターン 2 : 手順
パターン 1 の手順と順番が異なります。その他は、パターン 1 と同様です。
- 新規インスタンスの作成
- 新規インスタンスへデータインポート
- アクセス元の設定変更
- 既存インスタンスの削除(変更点)
おわりに
今回は、Cloud SQL の暗号化方法の切り替え方法について解説させて頂きました。
考慮する要素も多いため、基本的には、Cloud SQL を構築する段階で CMEK の利用可否を整理していただくのが 1 番良いと思いました。
Discussion