경로 사용

이 페이지에서는 Google Cloud에서 Virtual Private Cloud(VPC) 네트워크의 경로를 만들고 관리하는 방법을 설명합니다. 이 페이지에서는 경로에 설명된 다양한 유형의 Google Cloud 경로와 특성에 익숙하다고 가정합니다.

모든 새로운 네트워크에는 시스템에서 생성되는 2가지 경로 유형이 있습니다. 그 중 하나는 사용자가 삭제하거나 대체할 수 있는 기본 경로이고, 다른 하나는 각 서브넷의 서브넷 경로입니다. 서브넷 경로를 삭제하려면 해당 서브넷을 삭제해야 합니다.

시스템 생성 경로 외에 다른 커스텀 정적 경로도 만들 수 있습니다.

VPC 네트워크의 경로 나열

Google Cloud CLI 또는 API를 사용하여 다음 유형의 경로에 대한 세부정보를 나열하고 볼 수 있습니다.

gcloud CLI 명령어와 API 메서드 모두 다음 유형의 경로를 표시하지 않습니다.

전체 경로 뷰를 보려면 Google Cloud 콘솔을 사용합니다. 정책 기반 경로를 나열하고 설명하려면 정책 기반 경로 사용을 참조하세요.

콘솔

  1. Google Cloud 콘솔에서 경로 페이지로 이동합니다.

    경로로 이동

  2. 유효한 경로 탭에서 다음을 수행합니다.

    • VPC 네트워크를 선택합니다.
    • 리전을 선택합니다.
  3. 보기를 클릭합니다.

  4. 경로 유형, 대상 IP 범위, 다음 홉 유형을 포함한 속성을 기준으로 필터링할 수 있습니다.

  5. 선택사항: 억제된 경로를 보려면 숨긴 경로 표시 전환 버튼을 사용 설정 위치로 클릭합니다. 경로가 숨겨진 이유를 보려면 상태 열의 아이콘을 가리킵니다.

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.listroutes.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 Console을 사용하여 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 터널 지정: 정적 라우팅을 사용하여 기존 기본 VPN 터널에 패킷을 전달합니다.
    • 내부 패스 스루 네트워크 부하 분산기의 전달 규칙 지정: 내부 전달 규칙 이름 및 리전에 의해 지정되는 내부 패스 스루 네트워크 부하 분산기로 패킷을 전달합니다. 전달 규칙에는 IPv4 또는 IPv6(미리보기) 주소가 있을 수 있습니다. 지정하는 전달 규칙의 IP 버전은 만드는 정적 경로의 IP 버전과 일치해야 합니다.
  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 주소입니다. 가능한 가장 광범위한 대상 위치는 Pv4의 경우 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: 정적 라우팅을 사용하여 기존 기본 VPN 터널로 패킷을 전달합니다.
    • --next-hop-ilb=FORWARDING_RULE--next-hop-ilb-region=REGION: 내부 패스 스루 네트워크 부하 분산기로 패킷을 전달합니다. 이름 (또는 IPv4 또는 IPv6 (미리 보기) 주소) 및 리전별로 전달 규칙을 지정합니다. 지정하는 전달 규칙의 IP 버전은 생성하는 정적 경로의 IP 버전과 일치해야 합니다.

    커스텀 정적 경로를 네트워크 태그에 따라 특정 VM에만 적용하려면 --tags 플래그를 추가하고 하나 이상의 네트워크 태그를 지정합니다. 네트워크 태그와 커스텀 정적 경로가 함께 작동하는 방식에 대한 자세한 내용은 경로 개요에서 적용 가능한 경로를 참조하세요. 모든 커스텀 정적 경로에 태그를 사용할 수 있습니다.

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: 정적 라우팅을 사용하여 기존 기본 VPN 터널로 패킷을 전달합니다.
    • nextHopIlb: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/forwardingRules/FORWARDING_RULE: 내부 패스 스루 네트워크 부하 분산기로 패킷을 전달합니다. 이름 (또는 IPv4 또는 IPv6 (미리 보기) 주소) 및 리전별로 전달 규칙을 지정합니다. 지정하는 전달 규칙의 IP 버전은 생성하는 정적 경로의 IP 버전과 일치해야 합니다.

커스텀 정적 경로를 네트워크 태그에 따라 특정 VM에만 적용하려면 tags 필드를 추가하고 하나 이상의 네트워크 태그를 지정합니다. 네트워크 태그와 커스텀 정적 경로가 함께 작동하는 방식에 대한 자세한 내용은 경로 개요에서 적용 가능한 경로를 참조하세요. 모든 커스텀 정적 경로에 태그를 사용할 수 있습니다.

자세한 내용은 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
}

자바


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 콘솔에서 경로 페이지로 이동합니다.

    경로로 이동

  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 기본 경로 추가

next-hop-gatewaydefault-internet-gateway로 설정된 IPv6 기본 정적 경로(::/0)는 외부 IP 액세스 유형으로 이중 스택 서브넷을 만들 때 VPC 네트워크에 자동으로 구성됩니다. 경로를 삭제하여 VM에서 인터넷으로 이동하는 모든 IPv6 트래픽을 차단할 수 있습니다. 필요한 경우 경로를 다시 만들 수 있습니다.

콘솔

  1. Google Cloud 콘솔에서 경로 페이지로 이동합니다.

    경로로 이동

  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 콘솔에서 경로 페이지로 이동합니다.

    경로로 이동

  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
}

자바


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을 경로의 다음 홉으로 사용하려면 VM에서 소스가 이전 목록의 IP 주소 또는 범위 중 하나와 일치하지 않는 패킷을 전달해야 합니다. 임의의 소스 주소로 패킷을 전달하려면 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 인스턴스 속성을 업데이트합니다.

다음 단계