インスタンスのクローンを作成する

このページでは、クローン作成とインスタンスのクローン作成方法について説明します。

概要

Cloud SQL インスタンスのクローンを作成すると、元のインスタンスのコピーが新しいインスタンスとして作成されます。新しいインスタンスは、元のインスタンスから完全に独立しています。

よくある質問

質問 回答
クローン作成はパフォーマンスに影響しますか? いいえ。クローンを作成しても、元のインスタンスのパフォーマンスに影響はありません。
バックアップは新しいインスタンスにコピーされますか? いいえ。新しいインスタンスには新しいバックアップが自動的に作成されます。手動バックアップは元のインスタンスからコピーされません。
新しいインスタンスには同じ IP アドレスが割り振られますか? いいえ。新しいインスタンスには、新しい IP アドレスが割り振られます。
新しいインスタンスの構成は元のインスタンスと同じですか? はい。新しいインスタンスの設定(データベース フラグ、接続オプション、マシンタイプ、ストレージとメモリの設定)は元のインスタンスと同じです。
レプリカは新しいインスタンスにコピーされますか? いいえ。新しいインスタンスに新しいレプリカを作成する必要があります。
レプリカのクローンを作成できますか? いいえ。レプリカのクローンは作成できません。
過去の時点からクローンを作成できますか? はい。ポイントインタイム リカバリを行うと、クローンを使用して過去の時点からインスタンスを復元できます。これは、破壊的なイベントからデータベースを回復する際に役立ちます。
ソース インスタンスのメンテナンス設定は、クローン インスタンスに自動的にコピーされますか? いいえ。そのクローン インスタンス用のメンテナンス設定を構成する必要があります。
インスタンスのゾーンが利用できないときに、インスタンスのクローンを作成できますか? はい。ゾーン インスタンスのクローンを作成する場合は、インスタンスに別のプライマリ ゾーンを指定できます。高可用性(リージョン)インスタンスのクローンを作成する場合は、インスタンスに異なるプライマリ ゾーンとセカンダリ ゾーンを指定できます。
別のプロジェクトにデータベースのクローンを作成できますか? いいえ。別のプロジェクトにデータベースのクローンを作成することはできません。
クローンを作成したインスタンスのクローンを作成できますか? はい。別のインスタンスからクローン作成されたインスタンスのクローンを作成することは可能です。
データベース ユーザーは新しいインスタンスにコピーされますか? はい。データベース ユーザーは新しいインスタンスにコピーされます。これらのユーザーのパスワードもコピーされるため、再度作成する必要はありません。

インスタンスのクローンを作成する

Cloud SQL インスタンスのクローンを作成するには、Google Cloud コンソール、gcloud CLI、Terraform、または API を使用します。

コンソール

  1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. クローンを作成するインスタンスの行を見つけます。
  3. [アクション] 列で、 [その他の操作] メニューをクリックします。
  4. [クローンを作成] をクリックします。
  5. [クローンの作成] ページで、必要に応じてインスタンス ID を更新し、[最新状態のインスタンスのクローンを作成] を選択したまま、[クローンを作成] をクリックします。

    クローンの初期化中に、インスタンスの一覧ページに戻ります。

gcloud

インスタンスのクローンを作成するには、gcloud sql instances clone コマンドを使用します。

gcloud sql instances clone SOURCE_INSTANCE_NAME DESTINATION_INSTANCE_NAME \
--project PROJECT_ID \
--preferred-zone ZONE_NAME \
--preferred-secondary-zone SECONDARY_ZONE_NAME

次のように置き換えます。

  • SOURCE_INSTANCE_NAME: クローンを作成する Cloud SQL インスタンスの名前。
  • DESTINATION_INSTANCE_NAME: クローン インスタンスの名前。
  • PROJECT_ID: ソース インスタンスと宛先インスタンスが含まれる Google Cloud プロジェクトの ID またはプロジェクト番号
  • ZONE_NAME: 省略可。宛先インスタンスのプライマリ ゾーンの名前。クローンを作成する Cloud SQL インスタンスとは異なるプライマリ ゾーンに宛先インスタンスを配置する場合に使用します。リージョン インスタンスの場合、プライマリ ゾーンはこのゾーンに置き換わりますが、セカンダリ ゾーンはソース インスタンスと同じままです。
  • SECONDARY_ZONE_NAME: 省略可。宛先インスタンスのセカンダリ ゾーンの名前。クローンを作成するリージョン Cloud SQL インスタンスに別のセカンダリ ゾーンを指定するときに使用します。

--preferred-zone パラメータと --preferred-secondary-zone パラメータを使用する場合は、次の条件が適用されます。

  • プライマリ ゾーンとセカンダリ ゾーンの両方が有効なゾーンである必要があります。
  • 両方のゾーンがソース インスタンスと同じリージョンに属している必要があります。
  • プライマリ ゾーンとセカンダリ ゾーンは別のものである必要があります。
  • ゾーン インスタンスの場合、--preferred-secondary-zone パラメータは使用できません。使用すると、インスタンスのクローン作成プロセスが失敗します。
  • --preferred-zone パラメータまたは --preferred-secondary-zone パラメータの値を指定しない場合、クローン インスタンスのプライマリ ゾーンとセカンダリ ゾーンは、ソース インスタンスと同じになります。

gcloud sql instances clone コマンドを実行するには、cloudsql.instances.clone 権限が必要です。gcloud CLI コマンドを実行するために必要な権限の詳細については、Cloud SQL の権限をご覧ください。

Terraform

インスタンスのクローンを作成するには、Terraform リソースを使用します。

resource "google_sql_database_instance" "clone" {
  name             = "postgres-instance-clone-name"
  region           = "us-central1"
  database_version = "POSTGRES_12"
  clone {
    source_instance_name = google_sql_database_instance.source.id
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

変更を適用する

Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。

Cloud Shell を準備する

  1. Cloud Shell を起動します。
  2. Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。

    このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。

ディレクトリを準備する

Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。

  1. Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は .tf にする必要があります(例: main.tf)。このチュートリアルでは、このファイルを main.tf とします。
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。

    新しく作成した main.tf にサンプルコードをコピーします。

    必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。

  3. 環境に適用するサンプル パラメータを確認し、変更します。
  4. 変更を保存します。
  5. Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
    terraform init

    最新バージョンの Google プロバイダを使用する場合は、-upgrade オプションを使用します。

    terraform init -upgrade

変更を適用する

  1. 構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
    terraform plan

    必要に応じて構成を修正します。

  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、Terraform 構成を適用します。
    terraform apply

    Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。

  3. Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。

変更を削除する

変更を削除するには、次の手順を行います。

  1. 削除の保護を無効にするには、Terraform 構成ファイルで deletion_protection 引数を false に設定します。
    deletion_protection =  "false"
  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、更新された Terraform 構成を適用します。
    terraform apply
  1. 次のコマンドを実行します。プロンプトで「yes」と入力して、以前に Terraform 構成で適用されたリソースを削除します。

    terraform destroy

REST v1

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: ソース インスタンスと宛先インスタンスが含まれる Google Cloud プロジェクトの ID またはプロジェクト番号
  • SOURCE_INSTANCE_NAME: クローンを作成する Cloud SQL インスタンスの名前。
  • DESTINATION_INSTANCE_NAME: クローン インスタンスの名前。
  • ZONE_NAME: 省略可。宛先インスタンスのプライマリ ゾーンの名前。クローンを作成する Cloud SQL インスタンスとは異なるプライマリ ゾーンに宛先インスタンスを配置する場合に使用します。リージョン インスタンスの場合、プライマリ ゾーンはこのゾーンに置き換わりますが、セカンダリ ゾーンはソース インスタンスと同じままです。
  • SECONDARY_ZONE_NAME: 省略可。宛先インスタンスのセカンダリ ゾーンの名前。クローンを作成するリージョン Cloud SQL インスタンスに別のセカンダリ ゾーンを指定するときに使用します。

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/SOURCE_INSTANCE_NAME/clone

リクエストの本文(JSON):

{
  "cloneContext":
  {
    "destinationInstanceName": "DESTINATION_INSTANCE_NAME",
    "preferredZone": "ZONE_NAME",
    "preferredSecondaryZone": "SECONDARY_ZONE_NAME"
  }
}

リクエストを送信するには、次のいずれかのオプションを開きます。

次のような JSON レスポンスが返されます。

preferredZone パラメータと preferredSecondaryZone パラメータを使用する場合は、次の条件が適用されます。

  • プライマリ ゾーンとセカンダリ ゾーンの両方が有効なゾーンである必要があります。
  • 両方のゾーンがソース インスタンスと同じリージョンに属している必要があります。
  • プライマリ ゾーンとセカンダリ ゾーンは別のものである必要があります。
  • ゾーン インスタンスの場合、preferredSecondaryZone パラメータは使用できません。使用すると、インスタンスのクローン作成プロセスが失敗します。
  • preferredZone パラメータまたは preferredSecondaryZone パラメータの値を指定しない場合、クローン インスタンスのプライマリ ゾーンとセカンダリ ゾーンはソース インスタンスと同じになります。

instances.clone API メソッドを使用するには、cloudsql.instances.clone 権限が必要です。API メソッドの使用に必要な権限の詳細については、Cloud SQL の権限をご覧ください。

REST v1beta4

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: ソース インスタンスと宛先インスタンスが含まれる Google Cloud プロジェクトの ID またはプロジェクト番号
  • SOURCE_INSTANCE_NAME: クローンを作成する Cloud SQL インスタンスの名前。
  • DESTINATION_INSTANCE_NAME: クローン インスタンスの名前。
  • ZONE_NAME: 省略可。宛先インスタンスのプライマリ ゾーンの名前。クローンを作成する Cloud SQL インスタンスとは異なるプライマリ ゾーンに宛先インスタンスを配置する場合に使用します。リージョン インスタンスの場合、プライマリ ゾーンはこのゾーンに置き換わりますが、セカンダリ ゾーンはソース インスタンスと同じままです。
  • SECONDARY_ZONE_NAME: 省略可。宛先インスタンスのセカンダリ ゾーンの名前。クローンを作成するリージョン Cloud SQL インスタンスに別のセカンダリ ゾーンを指定するときに使用します。

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/SOURCE_INSTANCE_NAME/clone

リクエストの本文(JSON):

{
  "cloneContext":
  {
    "destinationInstanceName": "DESTINATION_INSTANCE_NAME",
    "preferredZone": "ZONE_NAME",
    "preferredSecondaryZone": "SECONDARY_ZONE_NAME"
  }
}

リクエストを送信するには、次のいずれかのオプションを開きます。

次のような JSON レスポンスが返されます。

preferredZone パラメータと preferredSecondaryZone パラメータを使用する場合は、次の条件が適用されます。

  • プライマリ ゾーンとセカンダリ ゾーンの両方が有効なゾーンである必要があります。
  • 両方のゾーンがソース インスタンスと同じリージョンに属している必要があります。
  • プライマリ ゾーンとセカンダリ ゾーンは別のものである必要があります。
  • ゾーン インスタンスの場合、preferredSecondaryZone パラメータは使用できません。使用すると、インスタンスのクローン作成プロセスが失敗します。
  • preferredZone パラメータまたは preferredSecondaryZone パラメータの値を指定しない場合、クローン インスタンスのプライマリ ゾーンとセカンダリ ゾーンはソース インスタンスと同じになります。

instances.clone API メソッドを使用するには、cloudsql.instances.clone 権限が必要です。API メソッドの使用に必要な権限の詳細については、Cloud SQL の権限をご覧ください。

内部 IP アドレスを使用するインスタンスのクローンを作成する

Cloud SQL インスタンスで内部 IP アドレスを使用する場合は、必要に応じて、クローンの新しい IP アドレス用に割り振り済み IP 範囲を指定できます。たとえば、google-managed-services-default です。

gcloud

インスタンスのクローンを作成し、使用する割り振り済みの IP アドレス範囲を指定します。

gcloud sql instances clone SOURCE_INSTANCE_NAME TARGET_INSTANCE_NAME \
--allocated-ip-range-name ALLOCATED_IP_RANGE_NAME

gcloud sql instances clone コマンドを実行しているユーザーまたはサービス アカウントには、cloudsql.instances.clone 権限が必要です。gcloud CLI コマンドを実行するために必要な権限の詳細については、Cloud SQL の権限をご覧ください。

REST v1

インスタンスのクローンを作成し、使用する割り振り済みの IP アドレス範囲を指定します。

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • source-instance-id: ソース インスタンス ID
  • target-instance-id: ターゲット インスタンス ID
  • allocated-ip-range-name: 割り振り済みの IP 範囲の名前

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/source-instance-id/clone

リクエストの本文(JSON):

{
  "cloneContext":
  {
    "destinationInstanceName": "target-instance-id",
    "allocatedIpRange": "allocated-ip-range-name"
  }
}

リクエストを送信するには、次のいずれかのオプションを開きます。

次のような JSON レスポンスが返されます。

instances.clone API メソッドを使用するユーザーまたはサービス アカウントには、cloudsql.instances.clone 権限が必要です。API メソッドの使用に必要な権限の詳細については、Cloud SQL の権限をご覧ください。

REST v1beta4

インスタンスのクローンを作成し、使用する割り振り済みの IP アドレス範囲を指定します。

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • source-instance-id: ソース インスタンス ID
  • target-instance-id: ターゲット インスタンス ID
  • allocated-ip-range-name: 割り振り済みの IP 範囲の名前

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/source-instance-id/clone

リクエストの本文(JSON):

{
  "cloneContext":
  {
    "destinationInstanceName": "target-instance-id",
    "allocatedIpRange": "allocated-ip-range-name"
  }
}

リクエストを送信するには、次のいずれかのオプションを開きます。

次のような JSON レスポンスが返されます。

instances.clone API メソッドを使用するユーザーまたはサービス アカウントには、cloudsql.instances.clone 権限が必要です。API メソッドの使用に必要な権限の詳細については、Cloud SQL の権限をご覧ください。

割り振られた IP 範囲を指定しない場合は、次の動作が行われます。

  • ソース インスタンスが指定された範囲で作成された場合、クローン インスタンスは同じ範囲に作成されます。
  • ソース インスタンスが指定範囲で作成されていない場合は、クローン インスタンスがランダムな範囲で作成されます。

トラブルシューティング

問題 トラブルシューティング
constraints/sql.restrictAuthorizedNetworks エラーでクローンの作成に失敗する。 クローン作成のオペレーションが、Authorized Networks 構成によってブロックされている。Authorized Networks は、Google Cloud コンソールの [接続] セクションでパブリック IP アドレスに構成されており、セキュリティに関する考慮事項により、クローン作成が許可されていません。

可能であれば、Cloud SQL インスタンスからすべての Authorized Networks エントリを削除します。それができない場合は、Authorized Networks エントリなしでレプリカを作成します。

エラー メッセージ: Failed to create subnetwork. Couldn't find free blocks in allocated IP ranges. Please allocate new ranges for this service provider. Help Token: [help-token-id].

Google Cloud コンソールを使用して、プライベート IP アドレスを持つインスタンスのクローンを作成しようとしていますが、割り振られた IP 範囲を指定しなかったため、ソース インスタンスが指定した範囲で作成されていません。その結果、クローニングされたインスタンスはランダムな範囲に作成されます。

gcloud を使用してインスタンスのクローンを作成し、
--allocated-ip-range-name パラメータの値を指定します。詳細については、プライベート IP を使用したインスタンスのクローン作成をご覧ください。