📝

Cloud SQL インスタンスを別プロジェクトに複製する方法

2025/02/28に公開

クラウドエース DevSecOps 事業部の羽田です。
Cloud SQL インスタンスを別プロジェクトに複製する方法を紹介します。

概要

gcloud コマンドを使って Cloud SQL インスタンスを別のプロジェクトに複製する方法を紹介します。

本記事では、Cloud SQL インスタンスのバックアップを作成し、そのバックアップを使用して、別のプロジェクトの Cloud SQL インスタンスにリストアをします。

別プロジェクトへの複製手順に使うバックアップとリストアのコマンドは以下の通りです。

  • バックアップ作成コマンド
gcloud sql backups create --instance=<source-instance-name> --project=<source-projectID>
  • リストアコマンド
gcloud sql backups restore <backupID> \
--backup-instance=<source-instance-name> \
--backup-project=<source-projectID> \
--restore-instance=<restore-instance-name> \
--project=<restore-projectID>

はじめに

Cloud SQL には複製コマンド gcloud sql instances clone があります。しかし、このコマンドで複製される Cloud SQL インスタンスは、複製元と同じプロジェクトに作成される制約があります。そのため、障害などで、本番環境のデータを検証環境でテストしたい場合、このコマンドは使えません。そこで、今回、Cloud SQL のバックアップとリストアを使い、別のプロジェクトに Cloud SQL を複製させます。

Cloud SQL のバックアップ・リストア とは

Cloud SQL は、バックアップとリストアの機能を提供しています。それぞれの機能は以下の通りです。

バックアップについて

Cloud SQL ではバックアップを自動的に取得しており、インスタンスを複製するだけであれば手動でバックアップを作成する必要がない場合もあります。ただ、今回は極めて最新のデータを利用してリストアをするため、手動でバックアップを作成します。
詳しくは 公式ドキュメント よりご確認ください。

リストアについて

リストアでは、バックアップを利用して同じインスタンスや別のインスタンスにインスタンスのバックアップを復元することができます。ただ、リストアする際、ターゲットとなるインスタンスの全てのデータを上書きしてしまうため注意が必要です。
詳しくは 公式ドキュメント よりご確認ください。

上記の内容からわかる通り、リストアするにはバックアップが必要になってきます。以下では、Cloud SQL のバックアップとリストアの機能を使い、別プロジェクトに Cloud SQL を複製する方法を紹介します。

Cloud SQL インスタンスの複製

全体の流れ

全体の流れは以下の通りです。

  1. ソースとなる Cloud SQL インスタンスのバックアップを作成する
  2. リストアするための Cloud SQL インスタンスを作成する
  3. 作成した Cloud SQL インスタンスに作成したバックアップをリストアする

事前準備

複製の準備として以下を実施します。

  • ソースとなる Cloud SQL インスタンスの作成
  • 移行するデータの作成

次の項目から作成していきます。

ソースの Cloud SQL の作成

Cloud SQL インスタンスを作成するためのコマンド

gcloud sql instances create <source-instance-name> \
--cpu=1 \
--memory=4GB \
--storage-size=10 \
--region=asia-northeast1 \
--project=<source-projectID> \
--database-version=MYSQL_8_0

今回は上記のコマンドのようなスペックで作成しますが、実際に行う際は自身の必要なスペックを確かめてから作成してください。

データベース / テーブルの作成

データベースとテーブルを作成する手順は以下の 3 ステップです。

  1. Cloud SQL インスタンスにログインする
  2. データベースを作成する
  3. データベースにテーブルを作成する

まず、Cloud SQL インスタンスにログインします。
今回作成した Cloud SQL インスタンスにはパスワード設定をしていないため、パスワードを求められたら何も入力をせず、Enter キーでログインすることができます。

gcloud sql connect <source-instance-name> --project=<source-projectID> --user=root

次にデータベースを作成します。

CREATE DATABASE <testdatebase-name>;

最後にデータベースにテーブルを作成します。

USE <testdatebase-name>;
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100),
  email VARCHAR(100)
);
INSERT INTO users (name, email) VALUES
('hoge', 'hoge@example.com'),
('fuga', 'fuga@example.com');

以上で事前準備は終わりです。

Cloud SQL インスタンスのバックアップ

ここでは、Cloud SQL インスタンスのバックアップを作成し、作成したバックアップの ID を確認するところまでの 2 ステップを行います。
バックアップの処理中に書き込み処理などが行われるとデータの不整合が起こる可能性がありますが、今回はその点については触れません。実際の環境で行う際は Cloud SQL インスタンスの PITR が有効になっているかを確認しましょう。そうすることで、予期せぬ障害発生時にも一貫性のあるデータ復元が保証されます。(MySQL ベストプラクティス)
まずは、下記のコマンドで Cloud SQL インスタンスのバックアップを作成します。

gcloud sql backups create --instance=<source-instance-name> --project=<source-projectID>

次に作成したバックアップの ID を下記のコマンドで確認します。

gcloud sql backups list --instance=<source-instance-name> --project=<source-projectID>

実際の出力が以下の画像です。

これで、複製するためのバックアップを作成し、その ID まで確認することができました。

Cloud SQL インスタンスのリストア

ここでは、取得したバックアップ ID を利用して、Cloud SQL インスタンスを複製していきます。そのために、リストアするための Cloud SQL インスタンスを別プロジェクトに作成し、その Cloud SQL インスタンスにバックアップをリストアする 2 ステップを行います。

リストア先のインスタンス作成

まずは、リストアするための Cloud SQL インスタンスを別プロジェクトに作成します。その際、ソースとなる Cloud SQL インスタンスと同等のスペックにしましょう。下記のコマンドでは、ソースとなる Cloud SQL インスタンスと同等のスペックで作成しています。

gcloud sql instances create <restore-instance-name> \
--cpu=2 \
--memory=4GB \
--storage-size=10 \
--region=asia-northeast1 \
--project=<restore-projectID> \
--database-version=MYSQL_8_0

リストア実行

最後に、先ほど作成した Cloud SQL インスタンスに取得したバックアップをリストアします。リストアの際、以下に注意してください。

【リストアをする際の注意点】

  • source-instance-namerestore-instance-name は必ず確認してから実行してください。
    間違えると検証用のデータベースを本番用の Cloud SQL インスタンスに上書きすることになります。
  • バックアップを復元するターゲットインスタンスは、元のインスタンスと同じデータベースバージョンやエディションでなければなりません。
  • バックアップを復元するターゲットインスタンスのストレージ容量は、元のインスタンスのバックアップと同じか、それ以上の容量が必要。
    より詳細は、公式ドキュメントの別のインスタンスへの復元のヒントと要件を参考にしてください。

上記の注意点を踏まえた上で下記のリストアコマンドを実行します。

gcloud sql backups restore <backupID> \
--backup-instance=<source-instance-name> \
--backup-project=<source-projectID> \
--restore-instance=<restore-instance-name> \
--project=<restore-projectID>

リストアが終わったら反映されているか確認しましょう。
今回複製したデータベース名は「testdb」であったため、リストアするインスタンスに同様のデータベースが存在すればリストアは成功しています。

確認方法は以下の 2 ステップです。

  1. Cloud SQL インスタンスにログインする
  2. データベースを確認する

まず、Cloud SQL インスタンスにログインします。
今回作成した Cloud SQL インスタンスにはパスワード設定をしていないため、パスワードを求められたら何も入力をせず、Enter キーでログインすることができます。

gcloud sql connect <restore-instance-name> --project=<restore-projectID> --user=root

接続が完了したら、以下の SQL コマンドを実行します。

SHOW DATABASES;

testdb がリストに含まれていることを確認します。実際の出力画面です。

これでリストア作業は終わりです。

さいごに

別のプロジェクトへの Cloud SQL インスタンスの複製は、障害時の調査の他に Google Cloud を別のプロジェクトに移行する際にも役立つことがあります。そういったときは、バックアップとリストアを活用してみてください。
ここまで読んでいただきありがとうございました。

Discussion