複数のネットワーク インターフェースを持つ VM を作成する

このページでは、複数のネットワーク インターフェースを持つ VM インスタンスを作成する方法について説明します。

始める前に、複数のネットワーク インターフェースの概要で説明されている、複数のネットワーク インターフェースを持つインスタンスの特性についてよく理解しておいてください。

IAM ロール

複数のネットワーク インターフェースを持つインスタンスを作成するには、次のいずれかのロールが必要です。

共有 VPC 環境を使用していないプロジェクトで複数のインターフェースを持つインスタンスとインスタンス テンプレートを作成、削除する: オーナー、編集者、または Compute インスタンス管理者(v1)のロールを持つユーザーは、同じプロジェクトに属する VPC ネットワークとサブネットに関連付けられた複数のインターフェースを持つインスタンスを作成できます。

共有 VPC 環境での複数のネットワーク インターフェースを持つインスタンスおよびインスタンス テンプレートの作成と削除:オーナー、編集者、または Compute インスタンス管理者(v1)のロールを持つユーザーは、複数のインターフェースを持つインスタンスを作成できます。いずれかのインターフェースが共有 VPC ホスト プロジェクトのサブネットに接続されている場合は、ホスト プロジェクト全体または使用するサブネットに対して Compute ネットワーク ユーザーのロールroles/compute.networkUser)も必要になります。

権限の詳細については、Compute Engine IAM ドキュメントをご覧ください。

複数のネットワーク インターフェースを持つ VM インスタンスを作成する

このセクションでは、vNIC や動的 NIC など、複数のネットワーク インターフェースを持つインスタンスを作成する方法について説明します。インスタンスの作成に関する一般的な手順については、VM インスタンスを作成して起動するをご覧ください。

最初のインターフェースは、常に nic0 として作成されます。また、これが常にデフォルトのインターフェースになります。

コンソール

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

    [インスタンスの作成] に移動

  2. [名前] フィールドに、インスタンスの名前を入力します。

  3. [リージョン] フィールドでリージョンを選択します。

  4. [ゾーン] フィールドでゾーンを選択します。

  5. [詳細オプション] セクションで、[ネットワーキング] を開いて次の操作を行います。

    1. [ネットワーク インターフェース] セクションで、ネットワーク インターフェースを開いて編集します。

    2. [ネットワーク] と [サブネットワーク] で、使用するネットワークとサブネットワークを選択します。

      インターフェースに IPv6 アドレスを構成する場合は、IPv6 アドレス範囲が構成されているサブネットを選択します。サブネットの IPv6 アクセスタイプによって、インスタンスが内部 IPv6 アドレスを受け取るのか、外部 IPv6 アドレスを受け取るのかが決まります。

    3. インターフェースの IP スタックタイプに次のいずれかのオプションを選択します。

      • IPv4(シングルスタック)
      • IPv4 と IPv6(デュアルスタック)
      • IPv6(シングルスタック)プレビュー
    4. IPv4 アドレスのインターフェースの場合は、次の操作を行います。

      1. [プライマリ内部 IPv4 アドレス] で次のいずれかを選択します。

        • エフェメラル(自動): 新しいエフェメラル IPv4 アドレスを自動的に割り当てます。
        • エフェメラル(カスタム): 新しいエフェメラル IPv4 アドレスを手動で指定します。
        • リストから予約された静的内部 IPv4 アドレス。
        • 静的内部 IPv4 アドレスを予約: 新しい静的内部 IPv4 アドレスを予約して割り当てます。
      2. [外部 IPv4 アドレス] で、次のいずれかを選択します。

        • エフェメラル: 新しいエフェメラル IPv4 アドレスを割り当てます。
        • なし: 外部 IPv4 アドレスを割り振りません。
        • リストから予約された静的 IPv4 アドレス。
        • 静的外部 IP アドレスを予約: 新しい静的外部 IPv4 アドレスを予約して割り当てます。
    5. IPv6 アドレスのインターフェースの場合は、接続されたサブネットのアクセスタイプに応じて、次の操作を行います。

      1. [プライマリ内部 IPv6 アドレス] で次のいずれかを選択します。
        • エフェメラル(自動): 新しいエフェメラル内部 IPv6 アドレスを自動的に割り当てます。
        • エフェメラル(カスタム): 新しいエフェメラル内部 IPv6 アドレスを手動で指定します。
        • リストから予約された静的内部 IPv6 アドレス。
        • 静的内部 IPv6 アドレスを予約: 新しい静的内部 IPv6 アドレスを予約して割り当てます。
      2. [外部 IPv6 アドレス] で、次のいずれかを選択します。
        • 自動割り当て: 新しいエフェメラル外部 IPv6 アドレスを自動的に割り当てます。
        • リストから予約された静的外部 IPv6 アドレス。
        • 静的外部 IPv6 アドレスを予約: 新しい静的外部 IPv6 アドレスを予約して割り当てます。
    6. ネットワーク インターフェースの変更を終了するには、[完了] をクリックします。

  6. 別のインターフェースを追加するには、[ネットワーク インターフェースを追加] をクリックします。

  7. インスタンス作成処理を続けます。

  8. [作成] をクリックします。

gcloud

新しいインスタンスにネットワーク インターフェースを作成するには、gcloud compute instances create コマンドを使用します。

インターフェースごとに --network-interface フラグを指定し、さらに networksubnetprivate-network-ipaddressexternal-ipv6-addressvlan などの適切なネットワーキング キーを指定します。

vlan キーを含めると、動的 NIC が作成されます。ダイナミック NIC を作成する場合は、インスタンスの作成後にダイナミック NIC のゲスト OS を構成する手順も行う必要があります。

複数のインターフェースを持つインスタンスの作成方法の例については、構成例をご覧ください。

このスニペットは、インスタンス作成時に指定できる多くのパラメータの 1 つである --network-interface フラグについて示すことのみを目的としたものです。

gcloud compute instances create INSTANCE_NAME \
    --zone ZONE \
    --network-interface \
        network=NETWORK_A,subnet=SUBNET_A, \
        stack-type=STACK_TYPE, \
        private-network-ip=INTERNAL_IPV4_ADDRESS, \
        address=EXTERNAL_IPV4_ADDRESS | no-address, \
        internal-ipv6-address=INTERNAL_IPV6_ADDRESS \
    ...
    --network-interface \
        network=NETWORK_B,subnet=SUBNET_B, \
        stack-type=STACK_TYPE, \
        external-ipv6-address=EXTERNAL_IPV6_ADDRESS, \
        external-ipv6-prefix-length=96, \
        ipv6-network-tier=PREMIUM, \
        vlan=VLAN_ID \
    ...

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

  • INSTANCE_NAME: 作成するインスタンスの名前。
  • ZONE: インスタンスが作成されるゾーン。
  • NETWORK_ANETWORK_B: インターフェースが接続するネットワーク。
  • SUBNET_ASUBNET_B: インターフェースが接続するサブネット。
  • STACK_TYPE: インターフェースのスタックタイプ。

    デフォルト値は IPV4_ONLY です。デュアルスタック インターフェースを構成するには IPV4_IPV6 を指定します。IPv6 専用インターフェースを構成するには IPV6_ONLY を指定します(プレビュー)。

  • IPv4 アドレスを持つインターフェースの値:

    • INTERNAL_IPV4_ADDRESS: ターゲット サブネット内のインターフェースに必要な内部 IPv4 アドレス。割り当て済みの有効なアドレスのみを使用する場合は、省略します。
    • EXTERNAL_IPV4_ADDRESS: インターフェースの外部 IPv4 アドレス。

      外部 IPv4 アドレスは予約済みである必要があります。インターフェースに外部 IP アドレスを使用しない場合は、address=EXTERNAL_IPV4_ADDRESS の代わりに「no-address」を指定します。インターフェースでエフェメラル外部 IP アドレスを受信する場合は、address='' を指定します。

  • IPv6 アドレスのインターフェースの値:

    • INTERNAL_IPV6_ADDRESS: ターゲット サブネット内のインターフェースに必要な内部 IPv6 アドレス。指定しない場合、Google Cloud はサブネットから内部 IPv6 アドレスを自動的に割り当てます。
    • EXTERNAL_IPV6_ADDRESS: ターゲット サブネット内のインターフェースに必要な外部 IPv6 アドレス。指定しない場合、Google Cloud はサブネットから外部 IPv6 アドレスを自動的に割り当てます。
  • VLAN_ID: VLAN ID。VLAN ID を指定すると、ネットワーク インターフェースが Dynamic NIC として構成されます。コマンドでは、親 vNIC の後に Dynamic NIC を配置する必要があります。

API

instances.insert メソッドを使用して、複数のネットワーク インターフェースを持つインスタンスを作成します。

vlan フィールドを含めると、動的 NIC が作成されます。ダイナミック NIC を作成する場合は、インスタンスの作成後にダイナミック NIC のゲスト OS を構成する手順も行う必要があります。

次の例をご覧ください。

  • 内部 IPv4 アドレスのみを持つインスタンスを作成するには、次の操作を行います。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    {
    ....
    
    "networkInterfaces": [
      {
        "networkIP": "IPV4_ADDRESS_A",
        "subnetwork": "regions/REGION/subnetworks/SUBNET_A"
      },
      {
        "networkIP": "IPV4_ADDRESS_B",
        "subnetwork": "regions/REGION/subnetworks/SUBNET_B"
        "vlan": "VLAN_ID"
      },
        for each interface, specify a network...
    ],
    other instance settings...
    }
    

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

    • PROJECT_ID: インスタンスが含まれているプロジェクトの ID。
    • ZONE: インスタンスを含むゾーン。
    • IPV4_ADDRESS_AIPV4_ADDRESS_B: 各ネットワーク インターフェースに割り当てる内部 IPv4 アドレス。
    • REGION: インスタンスが含まれるリージョン。
    • SUBNET_A, SUBNET_B: 各ネットワーク インターフェースが配置されているサブネット。
    • VLAN_ID: VLAN ID。VLAN ID を指定すると、ネットワーク インターフェースが Dynamic NIC として構成されます。Dynamic NIC は、親 vNIC の後に配置する必要があります。
  • 内部 IPv4 アドレスと内部 IPv6 アドレスの両方を持つインスタンスを作成するには、次の操作を行います。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    {
    ....
    
    "networkInterfaces": [
      {
        "subnetwork": "regions/REGION/subnetworks/SUBNET_A"
        "ipv6Address": "IPV6_ADDRESS_A",
        "internalIpv6PrefixLength": 96,
        "stackType": IPV4_IPV6,
        "ipv6AccessType": INTERNAL
      },
      {
        "subnetwork": "regions/REGION/subnetworks/SUBNET_B"
        "ipv6Address": "IPV6_ADDRESS_B",
        "internalIpv6PrefixLength": 96,
        "stackType": IPV4_IPV6,
        "ipv6AccessType": INTERNAL
        "vlan": "VLAN_ID"
      },
        for each interface, specify a network...
    ],
    other instance settings...
    }
    

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

    • PROJECT_ID: インスタンスが含まれているプロジェクトの ID。
    • ZONE: インスタンスを含むゾーン。
    • REGION: インスタンスが含まれるリージョン。
    • SUBNET_A, SUBNET_B: 各ネットワーク インターフェースが配置されているサブネット。
    • IPV6_ADDRESS_A, IPV6_ADDRESS_B: ターゲット サブネット内のインターフェースに必要な内部 IPv6 アドレス。指定しない場合、Google Cloud はサブネットから内部 IPv6 アドレスを自動的に割り当てます。
    • VLAN_ID: VLAN ID。VLAN ID を指定すると、ネットワーク インターフェースが Dynamic NIC として構成されます。Dynamic NIC は、親 vNIC の後に配置する必要があります。
  • 内部 IPv6 アドレスのみを持つインスタンス(プレビュー)を作成するには、次の操作を行います。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    {
    ....
    
    "networkInterfaces": [
      {
        "subnetwork": "regions/REGION/subnetworks/SUBNET"
        "ipv6Address": "IPV6_ADDRESS",
        "internalIpv6PrefixLength": 96,
        "stackType": IPV6_ONLY,
        "ipv6AccessType": INTERNAL
      },
        for each interface, specify a network...
    ],
    other instance settings...
    }
    

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

    • PROJECT_ID: インスタンスが含まれているプロジェクトの ID。
    • ZONE: インスタンスを含むゾーン。
    • REGION: インスタンスが含まれるリージョン。
    • SUBNET: ネットワーク インターフェースが配置されているサブネット。
    • IPV6_ADDRESS: ターゲット サブネット内のインターフェースに必要な内部 IPv6 アドレス。指定しない場合、Google Cloud はサブネットから内部 IPv6 アドレスを自動的に割り当てます。

Terraform

Terraform リソースを使用すると、複数のネットワーク インターフェースを持つインスタンスを作成できます。

Terraform 引数の例の値は変更できます。

resource "google_compute_instance" "default" {
  project      = var.project_id # Replace with your project ID in quotes
  zone         = "us-central1-b"
  name         = "backend-instance"
  machine_type = "e2-medium"
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }
  network_interface {
    subnetwork = var.subnet_1 # Replace with self link to a subnetwork in quotes
    network_ip = "10.0.0.14"
  }
  network_interface {
    subnetwork = var.subnet_2 # Replace with self link to a subnetwork in quotes
    network_ip = "10.10.20.14"
  }
}

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

構成例

以降のセクションでは、複数のインターフェースを持つインスタンスを作成する方法について説明します。

複数の vNIC と動的 NIC を構成する

次のサンプル コマンドは、次のネットワーク インターフェースを持つインスタンスを作成します。

  • nic0 という名前の vNIC。次の親です。
    • nic0.2 という名前の Dynamic NIC
  • nic1 という名前の vNIC。次の親です。
    • nic1.4 という名前の Dynamic NIC
    • nic1.5 という名前の Dynamic NIC
gcloud beta compute instances create vm1 \
    --zone zone-a \
    --network-interface=network=network-a,subnet=subnet-a \
    --network-interface=network=network-b,subnet=subnet-b,vlan=2 \
    --network-interface=network=network-c,subnet=subnet-c \
    --network-interface=network=network-d,subnet=subnet-d,vlan=4 \
    --network-interface=network=network-e,subnet=subnet-e,vlan=5

ダイナミック NIC を使用してインスタンスを作成したら、ダイナミック NIC 用にゲスト OS を構成する必要があります。

IPv4 アドレスのみを持つ複数のネットワーク インターフェースを構成する

次のサンプル コマンドは、3 つのネットワーク インターフェースを持つインスタンスを作成します。

 gcloud compute instances create vm1 --machine-type=n1-standard-4 \
    --network-interface '' \
    --network-interface network=net1,subnet=subnet-a,private-network-ip=10.10.10.2,address=EXTERNAL_IPV4_ADDRESS \
    --network-interface network=net2,subnet=subnet-b,private-network-ip=10.10.20.2,no-address

インターフェースは次のように作成されます。

  • nic0 はデフォルト設定で作成されます。インターフェースは、デフォルトの VPC ネットワークのサブネットに接続し、内部 IP アドレスとエフェメラル外部 IP アドレスが自動的に割り振られます。

  • nic1 は、ネットワーク net1 のサブネット subnet-a に接続されます。内部 IPv4 アドレスは 10.10.10.2 であり、静的外部 IPv4 アドレスは EXTERNAL_IPV4_ADDRESS です。

  • nic2 は、ネットワーク net2 のサブネット subnet-b に接続されます。内部 IPv4 アドレスは 10.10.20.2 であり、外部 IP アドレスはありません。

gcloud compute instances create コマンドと --network-interface フラグの詳細については、コマンドのドキュメントをご覧ください。

追加したネットワーク インターフェースの IP アドレスを使用して、DNS 転送を設定できます。Cloud DNS 転送ゾーンの構成の詳細については、転送ゾーンをご覧ください。

IPv4 アドレスと IPv6 アドレスの両方を持つ複数のネットワーク インターフェースを構成する

次のサンプル コマンドは、2 つのネットワーク インターフェースを持つデュアル スタック インスタンスを作成します。

gcloud compute instances create vm1 \
    --network-interface network=dual-int,subnet=int-subnet,stack-type=IPV4_IPV6 \
    --network-interface network=dual-ext,subnet=ext-subnet,stack-type=IPV4_IPV6,ipv6-network-tier=PREMIUM \
    --machine-type=n1-standard-4 --zone=ZONE_A

インターフェースは次のように作成されます。

  • nic0 は、ネットワーク dual-int のサブネット int-subnet に接続され、エフェメラル内部 IPv4 アドレスとエフェメラル内部 IPv6 アドレスが割り振られます。

  • nic1 は、ネットワーク dual-ext のサブネット ext-subnet に接続され、エフェメラル内部 IPv4 アドレスとエフェメラル外部 IPv6 アドレスが割り振られます。

IPv6 アドレスのみを持つ複数のネットワーク インターフェースを構成する

次のサンプル コマンドは、3 つのネットワーク インターフェースを持つ IPv6 専用インスタンス(プレビュー)を作成します。

gcloud compute instances create vm1 \
    --network-interface network=ipv6-only-int-a,subnet=int-subnet-a,stack-type=IPV6_ONLY \
    --network-interface network=ipv6-only-int-b,subnet=int-subnet-b,stack-type=IPV6_ONLY,internal-ipv6-address=fd20:db8:0:0:1:0:: \
    --network-interface network=ipv6-only-ext,subnet=ext-subnet,stack-type=IPV6_ONLY,ipv6-network-tier=PREMIUM,external-ipv6-address=EXTERNAL_IPV6_ADDRESS \
    --machine-type=n1-standard-4 --zone=us-west2-a

インターフェースは次のように作成されます。

  • nic0 は、ネットワーク ipv6-only-int-a のサブネット int-subnet-a に接続され、自動的に割り振られるエフェメラル内部 IPv6 アドレスが割り振られます。

  • nic1 は、ネットワーク ipv6-only-int-b のサブネット int-subnet-b に接続され、カスタム エフェメラル内部 IPv6 アドレス fd20:db8:0:0:1:0::/96 が割り振られます。

  • nic2 は、ネットワーク ipv6-only-ext のサブネット ext-subnet に接続され、静的外部 IPv6 アドレス EXTERNAL_IPV6_ADDRESS が割り当てられます。

インスタンス グループに複数のネットワーク インターフェースを構成する

非マネージド インスタンス グループとマネージド インスタンス グループでは、複数のネットワーク インターフェースを持つインスタンスを使用できます。

非マネージド インスタンス グループの場合は、各インスタンスを個別に作成します。各インスタンスの nic0 ネットワーク インターフェースが同じサブネットに接続するようにします。次に、インスタンスを非マネージド インスタンス グループに追加します。

マネージド インスタンス グループに複数のネットワーク インターフェースを構成するには、各インターフェースに --network-interface フラグを 1 回設定して、インスタンス テンプレートでインターフェースごとにネットワーク構成を指定する必要があります。次の例では、3 つのネットワーク インターフェースを持つインスタンス テンプレートを作成します。

gcloud compute instance-templates create template-1 \
    --network-interface subnet=net0-subnet-a \
    --network-interface subnet=net1-subnet-b,no-address \
    --network-interface subnet=net2-subnet-c,no-address \
    --region REGION_A

プロジェクトの各リージョンのサブネット名は一意である必要があるため、名前でサブネットを指定すると、各インターフェースが暗黙的に VPC ネットワークに関連付けられます。各インターフェースでは、一意の VPC ネットワーク内のサブネットを使用する必要があります。

  • nic0net0-subnet-a サブネットを使用します。
  • nic1net1-subnet-b サブネットを使用します。
  • nic2net2-subnet-c サブネットを使用します。

--network-interface フラグの no-address オプションは、外部 IPv4 アドレスなしでインターフェースが構成されていることを示します。内部 IP アドレスは、インターフェースで使用されるサブネットから取得されます。フラグと構文の詳細については、instance-templates create コマンドの --network-interface フラグをご覧ください。