ルートを使用する

このページでは、Google Cloud で Virtual Private Cloud(VPC)ネットワークのルートを作成して管理する方法について説明します。このページは、ルートで説明している Google Cloud のルートとその特性についてよく理解していることを前提としています。

新しいすべてのネットワークにはシステムによって生成された 2 種類のルートがあります。1 つ目はデフォルト ルートで、ユーザーが削除または置換できます。2 つ目はサブネット ルートで、サブネットごとに 1 つあります。対応するサブネット自体を削除しない限り、サブネット ルートは削除できません。

システム生成ルートに加えて、他のカスタム静的ルートを作成することもできます。

VPC ネットワークのルートを一覧表示する

Google Cloud CLI または API を使用して、次のタイプのルートを一覧表示するとともに詳細を表示できます。

次のタイプのルートは、gcloud CLI コマンドと API メソッドでは表示されません。

完全なルートビューを表示するには、Google Cloud コンソールを使用します。ポリシーベースのルートの一覧または詳細を表示するには、ポリシーベースのルートを使用するをご覧ください。

コンソール

  1. Google Cloud Console で、[ルート] ページに移動します。

    [ルート] に移動

  2. [適用されているルート] タブで、次の操作を行います。

    • VPC ネットワークを選択します。
    • リージョンを選択します。
  3. [表示] をクリックします。

  4. ルートタイプ、宛先 IP 範囲、ネクストホップ タイプなどのプロパティでフィルタできます。

  5. 省略可: [Show suppressed routes] 切り替えボタンをクリックしてオンの位置に切り替え、抑制されたルートを表示します。ルートの抑制の理由を表示するには、[ステータス] 列のアイコンにカーソルを合わせます。

gcloud

ルートの一覧と詳細を表示するには、gcloud compute routes コマンドを使用します。ローカル VPC ネットワークとピアリングされた VPC ネットワークのサブネット ルートと静的ルートが表示されます。他のルートタイプは表示されません。すべてのルートを表示するには、Google Cloud コンソールを使用します。

ルートを一覧取得するには、次の操作を行います。

gcloud compute routes list \
    --filter="network=NETWORK_NAME" \
    --project=PROJECT_ID

ルートの詳細を取得する手順は次のとおりです。

gcloud compute routes describe ROUTE_NAME \
    --format="flattened()" \
    --project=PROJECT_ID

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

  • NETWORK_NAME: VPC ネットワークの名前。
  • PROJECT_ID: VPC ネットワークを含むプロジェクト ID。
  • ROUTE_NAME: ルートの名前。

API

ルートの一覧と詳細を表示するには、routes.list メソッドと routes.get メソッドを使用します。ローカル VPC ネットワークとピアリングされた VPC ネットワークのサブネット ルートと静的ルートが表示されます。他のルートタイプは表示されません。すべてのルートを表示するには、Google Cloud コンソールを使用します。

ルートを一覧取得するには、次の操作を行います。

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes?filter=network="NETWORK_URL

ルートの詳細を取得する手順は次のとおりです。

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes/ROUTE_NAME

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

  • PROJECT_ID: VPC ネットワークを含むプロジェクト ID。
  • NETWORK_URL: VPC ネットワークの URL。
  • ROUTE_NAME: ルートの名前。

VM ネットワーク インターフェースに適用可能なルートを一覧取得する

Google Cloud コンソールを使用して、VM のネットワーク インターフェースに適用可能なルートを確認できます。このビューでは、下り(外向き)トラフィックに使用できるルートのリストを絞り込みます。

VM の特定のネットワーク インターフェースに適用可能なルートを表示するには、次の操作を行います。

コンソール

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

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

  2. リストで VM インスタンスを見つけます。行の末尾にある その他の操作」メニューで、[ネットワークの詳細の表示] を選択します。

  3. インスタンスに複数のネットワーク インターフェースがある場合は、[ネットワーク インターフェースの詳細] セクションで、表示するネットワーク インターフェースを選択します。

  4. [ファイアウォールとルートの詳細] セクションで、[ルート] タブをクリックして、ネットワーク インターフェースに適用されているすべてのルートをルート名で並べ替えます。

静的ルートの追加と削除

VPC ネットワークにローカルな静的ルートとポリシーベースのルートを追加または削除できます。このセクションでは、ローカル静的ルートの追加と削除を行う方法について説明します。ポリシーベースのルートを追加または削除する方法について詳しくは、ポリシーベースのルートを使用するをご覧ください。

サブネット ルートは、サブネットを追加または削除すると自動的に追加または削除されます。サブネットを追加または削除する方法の詳細については、サブネットを操作するをご覧ください。

VPC ネットワーク ピアリングで接続された VPC ネットワーク内のすべてのルートは、それらのルートをエクスポートする VPC ネットワーク内で操作する必要があります。詳細については、ルート交換オプションをご覧ください。

静的ルートを追加する前に

静的ルートを追加する前に、次の点を考慮してください。

  • 静的ルートで使用できるネクストホップの種類を十分に理解してください。IPv6 宛先のサポートなど、静的ルートのネクストホップの種類の詳細については、ネクストホップと機能をご覧ください。
  • ハイブリッド サブネットを使用しない場合は、静的ルートにサブネットやピアリング サブネット ルートの宛先範囲と一致する範囲や、それよりも限定された宛先範囲を設定することはできません。詳しくは、ルートの概要のカスタム静的ルートとの相互作用と VPC ネットワーク ピアリングに関するドキュメントのサブネットと静的ルートの相互作用をご覧ください。
  • 自動モードの VPC ネットワークを使用する際の競合を回避するために、宛先が 10.128.0.0/9 内に収まる静的ルートを作成しないでください。詳細については、自動モードの IPv4 範囲を確認してください。
  • 内部割り当て範囲と重複するカスタム静的ルートの送信先を設定することはできません。
  • VM をネクストホップとして使用するカスタム静的ルートを作成する前にネクストホップとしてのインスタンスに精通していることを確認してください。ネクストホップのインスタンスを選択した場合、Google Cloud はルートの作成時に VM が存在することのみを検証します。
  • ネットワーク タグを使用してルートを作成すると、そのタグを持つ VM のみがそのルートを受け取ります。ただし、タグ付き VM は、ネットワーク タグを持たないルートをすべて受け取ります。

静的ルートを追加する

静的ルートをネットワークに追加します。IPv6 宛先のサポートなど、静的ルートのネクストホップの種類の詳細については、ネクストホップと機能をご覧ください。

コンソール

  1. Google Cloud コンソールで、[ルート] ページに移動します。

    [ルート] に移動

  2. [ルート管理] タブをクリックします。

  3. [ルートを作成] をクリックします。

  4. ルートの名前と説明を指定します。

  5. [ネットワーク] リストで、ルートの既存のネットワークを選択します。

  6. [ルートのタイプ] リストで、[静的ルート] を選択します。

  7. [IP バージョン] リストで、必要な IP バージョンを選択します。

    • IPv4 静的ルートを作成するには、[IPv4] を選択します。
    • IPv6 静的ルートを作成するには、[IPv6] を選択します。
  8. 宛先 IP 範囲を指定します。IPv4 の場合、想定される最も広範囲な宛先は 0.0.0.0/0、IPv6 の場合は ::/0 です。

  9. ルートの優先度を指定します。優先度は、0(最も高い優先度)から 65535(最も低い優先度)の範囲で指定できます。

  10. 一致するネットワーク タグを持つ、一部のインスタンスにのみルートが適用されるようにするには、[インスタンス タグ] フィールドでそれらを指定します。ネットワーク上のすべてのインスタンスにルートが適用されるようにするには、このフィールドを空白のままにします。

  11. ルートのネクストホップを選択します。

    • デフォルト インターネット ゲートウェイ: インターネットと Google API およびサービスにパケットを配信します。
    • インスタンスを指定: VM インスタンスのネットワーク インターフェースにパケットを配信します。名前とゾーンで VM インスタンスを指定します。ルートの宛先が IPv6 アドレスの場合、VM インスタンスはデュアルスタックである必要があります。
    • インスタンスの IP アドレスを指定: VPC ネットワーク内の既存のインスタンスの IP アドレスを指定します。IPv6 静的ルート(プレビュー)の場合、インスタンスはデュアルスタックであることが必要です。有効なネクストホップ IP アドレスに関する重要な制限については、静的ルートのネクストホップをご覧ください。
    • VPN トンネルを指定: 静的ルーティングを使用して、既存の Classic VPN トンネルにパケットを配信します。
    • 内部パススルー ネットワーク ロードバランサの転送ルールを指定: 内部転送ルールの名前とリージョンで指定された内部パススルー ネットワーク ロードバランサにパケットを配信します。
  12. [作成] をクリックします。

gcloud

次の gcloud CLI コマンドを使用して新しいカスタム静的ルートを作成します。

gcloud compute routes create ROUTE_NAME \
    --network=NETWORK \
    --destination-range=DESTINATION_RANGE \
    --priority=PRIORITY \
    NEXT_HOP_SPECIFICATION

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

  • ROUTE_NAME: ルートの名前
  • NETWORK: ルートを含む VPC ネットワークの名前
  • DESTINATION_RANGE: このルートが適用される宛先の IPv4 アドレスまたは IPv6 アドレス。IPv4 の場合、想定される最も広範囲な宛先は 0.0.0.0/0、IPv6 の場合は ::/0 です。
  • PRIORITY: ルートの優先度0(最も高い優先度)から 65535(最も低い優先度)まで設定できます。
  • NEXT_HOP_SPECIFICATION: 静的ルートのネクストホップ。次のパラメータのいずれか、またはパラメータの組み合わせを使用します。

    • --next-hop-gateway=default-internet-gateway: インターネットと Google API およびサービスにパケットを配信します。
    • --next-hop-instance=INSTANCE_NAME--next-hop-instance-zone=ZONE: 既存の VM インスタンスのネットワーク インターフェースにパケットを配信します。名前とゾーンで VM インスタンスを指定します。ルートの宛先が IPv6 アドレスの場合、VM インスタンスはデュアルスタックである必要があります。
    • --next-hop-address=ADDRESS: VPC ネットワーク内の既存のインスタンスの IP アドレスを指定します。IPv6 静的ルート(プレビュー)の場合、インスタンスはデュアルスタックであることが必要です。有効なネクストホップ IP アドレスに関する重要な制限については、ネクストホップと機能をご覧ください。
    • --next-hop-vpn-tunnel=VPN_TUNNEL_NAME--next-hop-vpn-tunnel-region=REGION: 静的ルーティングを使用して、既存の Classic VPN トンネルにパケットを配信します。
    • --next-hop-ilb=FORWARDING_RULE--next-hop-ilb-region=REGION: 内部パススルー ネットワーク ロードバランサにパケットを配信します。内部転送ルール名(または IPv4 アドレス)とリージョンで VM インスタンスを指定します。

    カスタム静的ルートをネットワーク タグによる VM の選択にのみ適用するには、--tags フラグを追加し、1 つ以上のネットワーク タグを指定します。ネットワーク タグとカスタム静的ルートの連携の詳細については、「ルートの概要」の適用可能なルートをご覧ください。タグはカスタム静的ルートで使用できます。

gcloud CLI 構文の詳細については、SDK のドキュメントをご覧ください。

API

新しいカスタム静的ルートを作成します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes
{
  "name": "ROUTE_NAME",
  "network": "NETWORK_NAME",
  "destRange": "DESTINATION_RANGE",
  "priority": PRIORITY,
  "NEXT_HOP_SPECIFICATION"
}

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

  • PROJECT_ID: ルートが作成されるプロジェクトの ID
  • ROUTE_NAME: ルートの名前
  • NETWORK: ルートを含む VPC ネットワークの名前。
  • DESTINATION_RANGE: このルートが適用される宛先の IPv4 アドレス範囲または IPv6 アドレス範囲。IPv4 の場合、想定される最も広範囲な宛先は 0.0.0.0/0、IPv6 の場合は ::/0 です。
  • PRIORITY: ルートの優先度0(最も高い優先度)から 65535(最も低い優先度)まで設定できます。
  • NEXT_HOP_SPECIFICATION: 静的ルートのネクストホップ。次のパラメータのいずれか、またはパラメータの組み合わせを使用します。
    • nextHopGateway: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/gateways/default-internet-gateway: インターネットと Google API およびサービスにパケットを配信します。
    • nextHopInstance: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME: VM インスタンスのネットワーク インターフェースにパケットを配信します。名前とゾーンで VM インスタンスを指定します。ルートの宛先が IPv6 アドレスの場合、VM インスタンスはデュアルスタックである必要があります。
    • nextHopIp: ADDRESS: VPC ネットワーク内の既存のインスタンスの IP アドレスを指定します。IPv6 静的ルート(プレビュー)の場合、インスタンスはデュアルスタックであることが必要です。有効なネクストホップ IP アドレスに関する重要な制限については、ネクストホップと機能をご覧ください。
    • nextHopVpnTunnel: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/vpnTunnels/VPN_TUNNEL_NAME: 静的ルーティングを使用して、既存の Classic VPN トンネルにパケットを配信します。
    • nextHopIlb: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/forwardingRules/FORWARDING_RULE: 内部パススルー ネットワーク ロードバランサにパケットを配信します。内部転送ルール名(または IPv4 アドレス)とリージョンで VM インスタンスを指定します。

カスタム静的ルートをネットワーク タグによる VM の選択にのみ適用するには、tags フィールドを追加し、1 つ以上のネットワーク タグを指定します。ネットワーク タグとカスタム静的ルートの連携の詳細については、「ルートの概要」の適用可能なルートをご覧ください。タグはカスタム静的ルートで使用できます。

詳細については、routes.insert メソッドをご覧ください。

Terraform

静的ルートは、Terraform モジュールを使用して作成できます。

この静的ルートは、インターネットへのデフォルト ルートを作成します。

module "google_compute_route" {
  source       = "terraform-google-modules/network/google//modules/routes"
  version      = "~> 9.0"
  project_id   = var.project_id # Replace this with your project ID in quotes
  network_name = "default"

  routes = [
    {
      name              = "egress-internet"
      description       = "route through IGW to access internet"
      destination_range = "0.0.0.0/0"
      tags              = "egress-inet"
      next_hop_internet = "true"
    }
  ]
}

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

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"google.golang.org/protobuf/proto"
)

// createRoute creates a route with given name inside given project.
func createRoute(w io.Writer, projectID, name string) error {
	// projectID := "your_project_id"
	// name := "testname"

	ctx := context.Background()
	client, err := compute.NewRoutesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewRoutesRESTClient: %w", err)
	}
	defer client.Close()

	route := &computepb.Route{
		Name:           proto.String(name),
		Network:        proto.String("global/networks/default"),
		DestRange:      proto.String("0.0.0.0/0"),
		NextHopGateway: proto.String("global/gateways/default-internet-gateway"),
	}

	req := &computepb.InsertRouteRequest{
		Project:       projectID,
		RouteResource: route,
	}
	op, err := client.Insert(ctx, req)

	if err != nil {
		return fmt.Errorf("unable to insert a route: %w", err)
	}

	if err := op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Route created\n")

	return nil
}

Java


import com.google.cloud.compute.v1.InsertRouteRequest;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.Route;
import com.google.cloud.compute.v1.RoutesClient;
import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateRoute {

  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project you want to use.
    String projectId = "your-project-id";
    // Route name you want to use.
    String routeName = "your-route-name";
    createRoute(projectId, routeName);
  }

  // Create route for a project.
  public static Operation.Status createRoute(String projectId, String routeName)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (RoutesClient routesClient = RoutesClient.create()) {
      String nextHopGateway =
              String.format("projects/%s/global/gateways/default-internet-gateway", projectId);

      Route route = Route.newBuilder()
              .setName(routeName)
              .setDestRange("10.0.0.0/16")
              .setNetwork("global/networks/default")
              .setNextHopGateway(nextHopGateway)
              .build();

      InsertRouteRequest request = InsertRouteRequest.newBuilder()
              .setProject(projectId)
              .setRequestId(UUID.randomUUID().toString())
              .setRouteResource(route)
              .build();

      return routesClient.insertCallable().futureCall(request)
              .get(30, TimeUnit.SECONDS).getStatus();
    }
  }
}

Python

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def create_route(
    project_id: str,
    network: str,
    route_name: str,
    destination_range: str,
    *,
    next_hop_gateway: str | None = None,
    next_hop_ip: str | None = None,
    next_hop_instance: str | None = None,
    next_hop_vpn_tunnel: str | None = None,
    next_hop_ilb: str | None = None,
) -> compute_v1.Route:
    """
    Create a new route in selected network by providing a destination and next hop name.

    Note: The set of {next_hop_gateway, next_hop_ip, next_hop_instance, next_hop_vpn_tunnel,
        next_hop_ilb} is exclusive, you and only specify one of those parameters.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        network: name of the network the route will be created in. Available name formats:
            * https://www.googleapis.com/compute/v1/projects/{project_id}/global/networks/{network}
            * projects/{project_id}/global/networks/{network}
            * global/networks/{network}
        route_name: name of the new route.
        destination_range: range of destination IPs this route should be applied to. E.g. 10.0.0.0/16.
        next_hop_gateway: name of the gateway the traffic should be directed to.
        next_hop_ip: IP address the traffic should be directed to.
        next_hop_instance: name of the instance the traffic should be directed to. Name format:
            "projects/{project}/zones/{zone}/instances/{instance_name}"
        next_hop_vpn_tunnel: name of the VPN tunnel the traffic should be directed to. Name format:
            "projects/{project}/regions/{region}/vpnTunnels/{vpn_tunnel_name}"
        next_hop_ilb: name of a forwarding rule of the Internal Load Balancer the traffic
            should be directed to. Name format:
            "projects/{project}/regions/{region}/forwardingRules/{forwarding_rule_region}"

    Returns:
        A new compute_v1.Route object.
    """
    excl_args = {
        next_hop_instance,
        next_hop_ilb,
        next_hop_vpn_tunnel,
        next_hop_gateway,
        next_hop_ip,
    }
    args_set = sum(1 if arg is not None else 0 for arg in excl_args)

    if args_set != 1:
        raise RuntimeError("You must specify exactly one next_hop_* parameter.")

    route = compute_v1.Route()
    route.name = route_name
    route.network = network
    route.dest_range = destination_range

    if next_hop_gateway:
        route.next_hop_gateway = next_hop_gateway
    elif next_hop_ip:
        route.next_hop_ip = next_hop_ip
    elif next_hop_instance:
        route.next_hop_instance = next_hop_instance
    elif next_hop_vpn_tunnel:
        route.next_hop_vpn_tunnel = next_hop_vpn_tunnel
    elif next_hop_ilb:
        route.next_hop_ilb = next_hop_ilb

    route_client = compute_v1.RoutesClient()
    operation = route_client.insert(project=project_id, route_resource=route)

    wait_for_extended_operation(operation, "route creation")

    return route_client.get(project=project_id, route=route_name)

IPv4 のデフォルト ルートを追加する

next-hop-gatewaydefault-internet-gateway に設定された IPv4 のデフォルト静的ルート(0.0.0.0/0)は、VPC ネットワークごとに自動的に構成されます。必要に応じて、次の手順でこのルートを再作成します。

コンソール

  1. Google Cloud Console で、[ルート] ページに移動します。

    [ルート] に移動

  2. [ルート管理] タブをクリックします。

  3. [ルートを作成] をクリックします。

  4. ルートの名前と説明を指定します。

  5. ルートの既存のネットワークを選択します。

  6. [送信先 IP 範囲] に「0.0.0.0/0」と入力します。

  7. ルートの優先度を指定します。優先度は、0(最も高い優先度)から 65535(最も低い優先度)の範囲で指定できます。

  8. [ネクストホップ] で [デフォルト インターネット ゲートウェイ] を選択します。

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

gcloud

ネットワークの IPv4 デフォルト ルートを再作成します。

gcloud compute routes create ROUTE_NAME \
    --destination-range=0.0.0.0/0 \
    --network=NETWORK \
    --next-hop-gateway=default-internet-gateway

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

  • ROUTE_NAME: ルートの名前
  • NETWORK: ルートを含む VPC ネットワークの名前

API

ネットワークの IPv4 デフォルト ルートを再作成します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes
{
  "destRange": "0.0.0.0/0",
  "name": "ROUTE_NAME",
  "network": "NETWORK_NAME",
  "nextHopGateway": "projects/PROJECT_ID/global/gateways/default-internet-gateway"
}

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

  • PROJECT_ID: ルートが作成されるプロジェクトの ID
  • ROUTE_NAME: ルートの名前
  • NETWORK_NAME: ルートを含む VPC ネットワークの名前

IPv6 のデフォルト ルートを追加する

外部 IP アクセスタイプを使用してデュアルスタック サブネットを作成すると、next-hop-gatewaydefault-internet-gateway に設定された IPv6 デフォルト静的ルート(::/0)が VPC ネットワークに自動的に構成されます。ルートを削除すると、VM からインターネットへのすべての IPv6 トラフィックをブロックできます。また、必要な場合は、ルートを再作成できます。

コンソール

  1. Google Cloud Console で、[ルート] ページに移動します。

    [ルート] に移動

  2. [ルート管理] タブをクリックします。

  3. [ルートを作成] をクリックします。

  4. ルートの名前と説明を指定します。

  5. ルートの既存のネットワークを選択します。

  6. [送信先 IP 範囲] に「::/0」と入力します。

  7. ルートの優先度を指定します。優先度は、0(最も高い優先度)から 65535(最も低い優先度)の範囲で指定できます。

  8. [ネクストホップ] で [デフォルト インターネット ゲートウェイ] を選択します。

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

gcloud

ネットワークの IPv6 デフォルト ルートを再作成します。

gcloud compute routes create ROUTE_NAME \
    --destination-range=::/0 \
    --network=NETWORK \
    --next-hop-gateway=default-internet-gateway

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

  • ROUTE_NAME: ルートの名前。
  • NETWORK: ルートを含む VPC ネットワークの名前。

API

ネットワークの IPv6 デフォルト ルートを再作成します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes
{
  "destRange": "::/0",
  "name": "ROUTE_NAME",
  "network": "NETWORK_NAME",
  "nextHopGateway": "projects/PROJECT_ID/global/gateways/default-internet-gateway"
}

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

  • PROJECT_ID: ルートが作成されるプロジェクトの ID
  • ROUTE_NAME: ルートの名前
  • NETWORK_NAME: ルートを含む VPC ネットワークの名前

静的ルートを変更する

静的ルートは作成後に編集または更新することはできません。静的ルートを変更するには、そのルートを削除して、代替ルートを作成する必要があります。

静的ルートを削除する

ルートを削除するには、次のようにします。

コンソール

  1. Google Cloud Console で、[ルート] ページに移動します。

    [ルート] に移動

  2. [ルート管理] タブをクリックします。

  3. 削除するルールの横にあるチェックボックスをオンにします。

  4. [削除] をクリックします。

  5. もう一度 [削除] をクリックして確定します。

gcloud

カスタム静的ルートを削除するには、次の gcloud CLI コマンドを使用します。

gcloud compute routes delete ROUTE_NAME

ROUTE_NAME は、削除するルートの名前に置き換えます。

API

routes.delete メソッドを使用して、カスタム静的ルートを削除して VPC ネットワークから削除します。

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes/ROUTE_NAME

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

  • PROJECT_ID: ルートが配置されているプロジェクトの ID。
  • ROUTE_NAME: 削除するルートの名前。

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
)

// deleteRoute deletes a route by name in given project.
func deleteRoute(w io.Writer, projectID, name string) error {
	// projectID := "your_project_id"
	// name := "testname"

	ctx := context.Background()
	client, err := compute.NewRoutesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewRoutesRESTClient: %w", err)
	}
	defer client.Close()

	req := &computepb.DeleteRouteRequest{
		Project: projectID,
		Route:   name,
	}
	op, err := client.Delete(ctx, req)

	if err != nil {
		return fmt.Errorf("unable to delete a route: %w", err)
	}

	if err := op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Route deleted\n")

	return nil
}

Java


import com.google.cloud.compute.v1.DeleteRouteRequest;
import com.google.cloud.compute.v1.RoutesClient;
import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class DeleteRoute {

  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project you want to use.
    String projectId = "your-project-id";
    // Route name you want to delete.
    String routeName = "your-route-name";

    deleteRoute(projectId, routeName);
  }

  // Deletes a route from a project.
  public static void deleteRoute(String projectId, String routeName)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (RoutesClient routesClient = RoutesClient.create()) {
      DeleteRouteRequest request = DeleteRouteRequest.newBuilder()
              .setProject(projectId)
              .setRoute(routeName)
              .setRequestId(UUID.randomUUID().toString())
              .build();
      routesClient.deleteCallable().futureCall(request).get(30, TimeUnit.SECONDS);
    }
  }
}

Python

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def delete_route(project_id: str, route_name: str) -> None:
    """
    Delete a route in project.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        route_name: name of the route to delete.
    """

    route_client = compute_v1.RoutesClient()
    operation = route_client.delete(project=project_id, route=route_name)

    wait_for_extended_operation(operation, "route deletion")

ルート変更の伝播

静的ルートを追加または削除すると、ルートは VPC ネットワーク内のすべてのリージョンと VM インスタンスに伝播されます。ルート オペレーションのステータスが PENDING または RUNNING の場合は、ルートの変更がキューに入っていることを示しています。

キューに入ると、ルート オペレーションのステータスが DONE に変わります。VPC ネットワークと VPC ネットワーク ピアリング ネットワーク内のすべての VM インスタンスが新しいルートを使用するか、古いルートの使用を停止するまでに、さらに 30 秒かかる場合があります。

複数の静的ルートを同時に追加または削除すると、変更が任意の順序で適用されます。送信順にルート変更が処理されるとは限りません。インスタンスが異なれば、変更が認識されるまでの時間も異なる可能性があります。

相互に依存するルート変更を行う必要がある場合は、前の変更のステータスが DONE となり、さらに 30 秒経過した後にのみ、後続の変更を一つずつ行う必要があります。

インスタンスで IP 転送を有効にする

デフォルトでは、IP 転送は無効であり、Google Cloud は厳密な送信元アドレスのチェックを行います。有効な下り(外向き)ファイアウォール構成に従い、VM は次の送信元を含むパケットを送信できます。

  • インスタンスのネットワーク インターフェース(NIC)のプライマリ内部 IPv4 アドレス。
  • インスタンスの NIC に構成されたエイリアス IP 範囲。
  • IPv6 アドレス範囲がサブネットで構成され、インスタンスがデュアルスタックの場合、NIC に割り当てられる IPv6 アドレス。
  • インスタンスが内部パススルー ネットワーク ロードバランサのバックエンドか、外部パススルー ネットワーク ロードバランサか、あるいはターゲット インスタンスから参照されている場合は、パススルー ロード バランシングまたはプロトコル転送用の転送ルールに関連付けられた内部または外部 IP アドレス。

VM をルートのネクストホップとして使用するには、送信元が上記のリストの IP アドレスまたは範囲のいずれとも一致しないパケットを VM が転送する必要があります。任意の送信元アドレスを持つパケットを転送するには、IP 転送を有効にする必要があります。

  • VM を作成または更新する場合は、このセクションの手順に沿って IP 転送を有効にします。IP 転送の有効化は、VM 上のすべての NIC に適用されます。
  • このセクションの手順に加えて、VM ゲスト オペレーティング システム内で IP 転送を有効にする必要があります。この操作を Linux で行うには、カーネル パラメータ net.ipv4.ip_forward(IPv4 の場合)、net.ipv6.conf.all.forwarding(IPv6 の場合)のいずれかまたは両方の値を 1 に設定します。

VM の作成時に IP 転送を有効にするには、次の手順を完了します。

コンソール

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

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

  2. [インスタンスを作成] をクリックします。

  3. [詳細オプション] セクションで、[ネットワーキング、ディスク、セキュリティ、管理、単一テナンシー] を開きます。

  4. [ネットワーキング] セクションを開きます。

  5. [IP 転送] セクションで、[有効にする] チェックボックスをオンにします。

gcloud

インスタンスを作成する場合は、コマンドに --can-ip-forward フラグを追加します。

gcloud compute instances create ... --can-ip-forward

API

インスタンスを作成する場合は、canIpForward フィールドを使用して IP 転送を有効にします。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
  "canIpForward": true,
  ...other fields
}

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

  • PROJECT_ID: インスタンスが含まれているプロジェクトの ID
  • ZONE: インスタンスを含む Google Cloud ゾーン

詳細については、instances.insert メソッドをご覧ください。

Terraform

Terraform リソースを使用して、IP 転送を有効にした VM インスタンスを作成できます。

この例では、Terraform 引数に値が割り当てられていますが、変更可能です。

resource "google_compute_instance" "default" {
  project      = var.project_id # Replace this with your project ID in quotes
  zone         = "southamerica-east1-b"
  name         = "instance-next-hop"
  machine_type = "e2-medium"
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }
  network_interface {
    network = "default"
  }
  can_ip_forward = true
}

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

IP 転送を有効にしたら、VM の作成プロセスに進みます

既存の VM で IP 転送を有効にするには、canIpForward インスタンス プロパティを更新します。

次のステップ