ネットワーク間の VM の移行

このページでは、ネットワーク間で VM インスタンスを移行する方法について説明します。複数のネットワーク インターフェースを使用して複数のネットワークに接続されている VM の場合、このプロセスではそのうちの 1 つのインターフェースが更新され、残りはそのままになります。

次の移行がサポートされています。

  • 1 つのプロジェクト内での、レガシー ネットワークから VPC ネットワークへの移行
  • 1 つのプロジェクト内での、VPC ネットワークから別の VPC ネットワークへの移行
  • 1 つの VPC ネットワーク内での、サブネットから別のサブネットへの移行
  • サービス プロジェクト ネットワークから共有 VPC ホスト プロジェクトの共有ネットワークへの移行

いずれの場合も、VM は移行前のリージョンとゾーンに残ります。接続されているネットワークのみが変更されます。

始める前に

要件

VM は、移行するにあたって次の要件を満たしている必要があります。

  • この移行は「コールド」移行です。VM は移行前に停止している必要があります。
  • VM はインスタンス グループまたはネットワーク エンドポイント グループ(NEG)に属していてはなりません。
    • VM が非マネージド インスタンス グループまたは NEG にある場合は、移行する前にグループから除外する必要があります。
    • マネージド インスタンス グループ内の VM は移行できません。インスタンス テンプレートを新しいネットワークにコピーし、そのテンプレートを使用してマネージド インスタンス グループを再作成する必要があります。
    • ターゲット プール内のインスタンスは事前に削除せずに移動できます。ターゲット プールは、両方のネットワークに対応するように拡張されます。

制限事項

  • VM インターフェースはレガシー ネットワークに移行できません。
  • 移行中、ネットワーク インターフェースに割り振られる MAC アドレスは変更されます。そのため、サードパーティとの使用許諾契約など、MAC アドレスと密接に関連するサービスが影響を受ける可能性があります。
  • 異なる IP 範囲のネットワークまたはサブネットに VM を移行する場合は、インスタンスの内部 IP アドレスを変更する必要があります。同じ IP 範囲のサブネットに移行する場合は、移行時にアドレスを指定することで、もとの IP アドレスを保持できます(移行先でまだ使用されていない場合に限る)。
  • ターゲット サブネットの IP 範囲がソースと同じでない場合、インターフェースの IP アドレスは新しいサブネット範囲に一致するように変更されます。
  • VM の既存の外部 IP アドレスは移行先でも保持されます。そのためには、ターゲット ネットワークで compute.subnetworks.useExternalIp 権限が必要です。また、ターゲット ネットワークでは constraints/compute.vmExternalIpAccess 制限により外部 IP アドレスを無効にできなくなります。

VM の移行

VM を移行する前に、要件制限事項を確認してください。

VM を移行する前に、新しいネットワークで必要なファイアウォール ルール、ルート、ロードバランサなどのネットワーク インフラストラクチャ リソースを作成することをおすすめします。こうすることで、VM がオフラインになる時間を短縮できます。

Console

  1. Cloud Console で、[VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. VM インスタンス名をクリックして、詳細ページを開きます。

  3. [停止]()をクリックします。

  4. 確認のダイアログが表示されたら、[停止] をクリックします。

  5. VM が停止したら、[編集] をクリックします。

  6. [ネットワーク インターフェース] で、移行するインターフェースをクリックします。

  7. インターフェースの [ネットワーク] フィールドで、インターフェースの新しいネットワークを選択します。

  8. インターフェースの [サブネットワーク] フィールドで、インターフェースの新しいサブネットを選択します。

  9. サブネット範囲から IP アドレスを割り振る場合は、[内部 IP アドレス] フィールドに [自動] を指定します。未使用のアドレスを手動で割り振るには、[カスタム] を指定します。

  10. [完了] をクリックして、ネットワーク インターフェースの編集パネルを閉じます。

  11. [保存] をクリックします。

  12. VM の保存が完了したら、[開始]()をクリックします。

  13. 確認のダイアログが表示されたら、[開始] をクリックします。

gcloud

  1. VM の停止

    gcloud beta compute instances stop INSTANCE_NAME \
        --zone=ZONE_NAME

    ここで

    • INSTANCE_NAME は VM インスタンスの名前です。
    • ZONE_NAME は、インスタンスを含むゾーンの名前です。
  2. VM の移行

    gcloud beta compute instances network-interfaces update INSTANCE_NAME \
        --zone=ZONE_NAME \
        --network-interface=NIC \
        --network=NETWORK_NAME \
        --subnetwork=SUBNET_NAME

    ここで

    • INSTANCE_NAME は VM インスタンスの名前です。
    • ZONE_NAME は、インスタンスを含むゾーンの名前です。
    • NIC は、更新するインターフェースの名前です。インターフェースが 1 つの VM の場合、NICnic0 です。
    • NETWORK_NAME はターゲット ネットワーク名です。VM をサービス プロジェクト ネットワークからホスト プロジェクト ネットワークに移行する場合、ターゲット ネットワークに完全修飾名 projects/HOST_PROJECT_ID/global/networks/NETWORK_NAME を使用する必要があります。
    • SUBNET_NAME はターゲット サブネット名です。このサブネットは VM と同じリージョンに存在する必要があります。VM をサービス プロジェクト ネットワークからホスト プロジェクト ネットワークに移行する場合、サブネットに完全修飾名 projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME を使用する必要があります。
  3. VM の起動

    移行には数分かかる場合があります。移行先で VM を起動できるようになるまで待機してください。

    gcloud beta compute instances start INSTANCE_NAME \
        --zone=ZONE_NAME

    ここで

    • INSTANCE_NAME は VM インスタンスの名前です。
    • ZONE_NAME は、インスタンスを含むゾーンの名前です。

API

  1. VM の停止

    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE_NAME/instances/INSTANCE_NAME/stop
    

    ここで

    • PROJECT_ID はプロジェクト ID です。
    • INSTANCE_NAME は VM インスタンスの名前です。
    • ZONE_NAME は、インスタンスを含むゾーンの名前です。
  2. インターフェースのフィンガープリントを取得します。

    ネットワーク インターフェースを更新するには、フィンガープリントが必要です。

    GET https://www.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE_NAME/instances/INSTANCE_NAME/updateNetworkInterface?networkInterface=NIC
    

    ここで

    • PROJECT_ID はプロジェクト ID です。
    • INSTANCE_NAME は VM インスタンスの名前です。
    • ZONE_NAME は、インスタンスを含むゾーンの名前です。
    • NIC は、更新するインターフェースの名前です。インターフェースが 1 つの VM の場合、NICnic0 です。

    次のステップで使用するために、fingerprint フィールドの文字列をコピーします。

  3. VM の移行

    PATCH https://www.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE_NAME/instances/INSTANCE_NAME/updateNetworkInterface?networkInterface=NIC
    {
      "network": NETWORK_NAME,
      "subnetwork": SUBNET_NAME,
      "networkIP": IP_ADDRESS,
      "name": NIC,
      "fingerprint": FINGERPRINT
    }
    • PROJECT_ID はプロジェクト ID です。
    • ZONE_NAME は、インスタンスを含むゾーンの名前です。
    • INSTANCE_NAME は VM インスタンスの名前です。
    • NIC は、更新するインターフェースの名前です。インターフェースが 1 つの VM の場合、NICnic0 です。
    • NETWORK_NAME はターゲット ネットワーク名です。VM をサービス プロジェクト ネットワークからホスト プロジェクト ネットワークに移行する場合、ターゲット ネットワークに完全修飾名 projects/HOST_PROJECT_ID/global/networks/NETWORK_NAME を使用する必要があります。
    • SUBNET_NAME はターゲット サブネット名です。このサブネットは VM と同じリージョンに存在する必要があります。VM をサービス プロジェクト ネットワークからホスト プロジェクト ネットワークに移行する場合、サブネットに完全修飾名 projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME を使用する必要があります。
    • IP_ADDRESS は、移行先でのインスタンスの内部 IP アドレスです。このフィールドを省略すると、インターフェースに内部 IP アドレスが自動的に割り当てられます。
    • FINGERPRINT は、GET コマンドでコピーしたフィンガープリントです。
  4. VM の起動

    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE_NAME/instances/INSTANCE_NAME/start
    

    ここで

    • PROJECT_ID はプロジェクト ID です。
    • INSTANCE_NAME は VM インスタンスの名前です。
    • ZONE_NAME は、インスタンスを含むゾーンの名前です。

次のステップ