고정 아웃바운드 IP 주소

기본적으로 Cloud Run 서비스는 동적 IP 주소 풀을 사용해서 인터넷의 외부 엔드포인트에 연결됩니다. 데이터베이스 또는 IP 주소 기반 방화벽을 사용하는 API와 같이 고정 IP 주소로부터 시작되는 연결이 필요한 외부 엔드포인트에 Cloud Run 서비스가 연결되는 경우에는 이 기본값이 적절하지 않습니다. 이러한 연결의 경우 고정 IP 주소를 통해 요청을 라우팅하도록 Cloud Run 서비스를 구성해야 합니다.

이 가이드에서는 고정 IP 주소를 사용해서 요청을 전송하도록 Cloud Run 서비스를 사용 설정하는 방법을 설명합니다.

태스크 개요

고정 IP 주소를 통해 요청을 라우팅하도록 Cloud Run 서비스를 사용 설정하려면 Cloud NAT 게이트웨이가 고정 IP 주소로 구성된 VPC 네트워크를 통해 모든 아웃바운드 트래픽을 라우팅하도록 Cloud Run 서비스의 VPC 이그레스를 구성합니다.

Cloud NAT 게이트웨이 및 Cloud Router가 제어 영역만 제공하고, 패킷이 NAT 게이트웨이 또는 Cloud Router를 통과하지 않기 때문에 Cloud NAT를 통해 트래픽을 라우팅해도 네트워킹 스택에 추가 홉이 발생하지 않습니다. .

동일한 VPC 네트워크에 연결된 모든 Cloud Run 서비스는 동일한 이그레스 IP 주소를 공유합니다. 개별 Cloud Run 서비스에 서로 다른 이그레스 IP 주소를 사용하려면 이 가이드를 참조하여 별도의 서브넷을 만들고 필요할 경우 서버리스 VPC 액세스 커넥터도 만드세요.

서브넷 만들기

커넥터를 호스팅하려면 전용 /28 서브넷을 만들어야 합니다. 직접 VPC 이그레스를 사용하는 경우 기존 서브넷을 사용하거나 다른 서브넷을 만듭니다. 커넥터를 사용하면 전용 서브넷이 VPC의 다른 컴퓨팅 리소스(예: Compute Engine VM 또는 Google Kubernetes Engine 클러스터)가 실수로 고정 IP를 사용하는 것을 방지합니다(인터넷에 액세스하도록 서버리스 VPC 액세스를 구성한 경우).

명령줄

  1. VPC 네트워크의 이름을 찾습니다.

    gcloud compute networks list

    다음과 같은 출력이 표시되어야 합니다.

    NAME     SUBNET_MODE  BGP_ROUTING_MODE
    default  AUTO         REGIONAL

    서버리스 VPC 액세스 커넥터에 연결할 네트워크를 식별합니다.

  2. VPC에서 서버리스 VPC 액세스 커넥터의 서브넷을 만드세요.

    gcloud compute networks subnets create SUBNET_NAME \
    --range=RANGE --network=NETWORK_NAME --region=REGION

    이 명령어에서 다음과 같이 값을 바꿉니다.

    • SUBNET_NAME: 서브넷에 지정할 이름
    • RANGE: 이 서브넷에 할당하려는 CIDR 형식의 IP 범위(예를 들어 10.124.0.0/28)
    • NETWORK_NAME: VPC 네트워크의 이름
    • REGION: 서버리스 VPC 액세스 커넥터를 만들려는 리전

Terraform

  1. 사용할 VPC 네트워크를 만듭니다.

    resource "google_compute_network" "default" {
      provider = google-beta
      name     = "cr-static-ip-network"
    }

    cr-static-ip-network를 서브넷 이름으로 바꿉니다.

  2. VPC에서 서버리스 VPC 액세스 커넥터의 서브넷을 만드세요.

    resource "google_compute_subnetwork" "default" {
      provider      = google-beta
      name          = "cr-static-ip"
      ip_cidr_range = "10.124.0.0/28"
      network       = google_compute_network.default.id
      region        = "us-central1"
    }

    바꾸기

서버리스 VPC 액세스 커넥터 만들기

직접 VPC 이그레스 통합을 사용하는 경우 커넥터를 만들 필요가 없습니다. 직접 VPC 이그레스를 사용하지 않는 경우 Cloud Run 서비스 아웃바운드 트래픽을 VPC 네트워크로 라우팅하는 서버리스 VPC 액세스 커넥터가 필요합니다.

서버리스 VPC 액세스 커넥터 만들기

명령줄

  1. 사전 생성된 서브넷으로 서버리스 VPC 액세스 커넥터를 만듭니다.

    gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
      --region=REGION \
      --subnet-project=PROJECT_ID \
      --subnet=SUBNET_NAME
    

    이 명령어에서 다음과 같이 값을 바꿉니다.

    • CONNECTOR: 이 리소스에 지정할 이름
    • PROJECT_ID: 서브넷을 호스팅하는 이름
    • SUBNET_NAME: 사용자가 만든 서브넷의 이름
    • REGION: NAT 게이트웨이를 만들려는 리전

Terraform

  1. 서버리스 VPC 액세스 커넥터를 만듭니다.

    resource "google_project_service" "vpc" {
      provider           = google-beta
      service            = "vpcaccess.googleapis.com"
      disable_on_destroy = false
    }
    
    resource "google_vpc_access_connector" "default" {
      provider = google-beta
      name     = "cr-conn"
      region   = "us-central1"
    
      subnet {
        name = google_compute_subnetwork.default.name
      }
    
      # Wait for VPC API enablement
      # before creating this resource
      depends_on = [
        google_project_service.vpc
      ]
    }

    cr-conn을 서버리스 VPC 액세스 커넥터의 이름으로 바꿉니다.

네트워크 주소 변환(NAT) 구성

직접 VPC 이그레스 또는 서버리스 VPC 액세스 커넥터를 사용하는 경우 Cloud Run 서비스의 요청이 VPC 네트워크에 도달합니다. 고정 IP를 통해 아웃바운드 요청을 외부 엔드포인트로 라우팅하려면 Cloud NAT 게이트웨이를 구성합니다.

명령줄

  1. NAT 게이트웨이를 프로그래밍하기 위해 새 Cloud Router를 만듭니다.

    gcloud compute routers create ROUTER_NAME \
      --network=NETWORK_NAME \
      --region=REGION

    이 명령어에서 다음과 같이 값을 바꿉니다.

    • ROUTER_NAME: 만들려는 Cloud Router 리소스 이름
    • NETWORK_NAME: 이전에 찾은 VPC 네트워크 이름
    • REGION: NAT 게이트웨이를 만들려는 리전
  2. 고정 IP 주소를 예약합니다. 예약된 IP 주소 리소스에는 연관된 리소스가 삭제되고 다시 생성될 때 기본 IP 주소가 유지됩니다.

    gcloud compute addresses create ORIGIN_IP_NAME --region=REGION

    이 명령어에서 다음과 같이 값을 바꿉니다.

    • ORIGIN_IP_NAME: IP 주소 리소스에 할당하려는 이름
    • REGION: Cloud NAT 라우터를 실행할 리전. 지연 시간 및 네트워크 비용을 최소화하기 위해서는 Cloud Run 서비스와 동일한 리전이 이상적입니다.
  3. 생성한 고정 IP 주소를 사용하여 VPC 네트워크에서 시작되는 트래픽을 라우팅하기 위해 이 라우터에서 Cloud NAT 게이트웨이 구성을 만듭니다.

    gcloud compute routers nats create NAT_NAME \
      --router=ROUTER_NAME \
      --region=REGION \
      --nat-custom-subnet-ip-ranges=SUBNET_NAME \
      --nat-external-ip-pool=ORIGIN_IP_NAME
    

    이 명령어에서 다음과 같이 값을 바꿉니다.

    • NAT_NAME: 만들려는 Cloud NAT 게이트웨이 리소스의 이름
    • ROUTER_NAME: Cloud Router 이름
    • REGION: NAT 게이트웨이를 만들려는 리전
    • ORIGIN_IP_NAME: 이전 단계에서 만든 예약된 IP 주소 리소스의 이름

Terraform

  1. NAT 게이트웨이를 프로그래밍하기 위해 새 Cloud Router를 만듭니다.

    resource "google_compute_router" "default" {
      provider = google-beta
      name     = "cr-static-ip-router"
      network  = google_compute_network.default.name
      region   = google_compute_subnetwork.default.region
    }

    cr-static-ip-router를 서브넷 이름으로 바꿉니다.

  2. 고정 IP 주소를 예약합니다. 예약된 IP 주소 리소스에는 연관된 리소스가 삭제되고 다시 생성될 때 기본 IP 주소가 유지됩니다.

    resource "google_compute_address" "default" {
      provider = google-beta
      name     = "cr-static-ip-addr"
      region   = google_compute_subnetwork.default.region
    }

    cr-static-ip-addr를 서브넷 이름으로 바꿉니다.

  3. 생성한 고정 IP 주소를 사용하여 VPC 네트워크에서 시작되는 트래픽을 라우팅하기 위해 이 라우터에서 Cloud NAT 게이트웨이 구성을 만듭니다.

    resource "google_compute_router_nat" "default" {
      provider = google-beta
      name     = "cr-static-nat"
      router   = google_compute_router.default.name
      region   = google_compute_subnetwork.default.region
    
      nat_ip_allocate_option = "MANUAL_ONLY"
      nat_ips                = [google_compute_address.default.self_link]
    
      source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS"
      subnetwork {
        name                    = google_compute_subnetwork.default.id
        source_ip_ranges_to_nat = ["ALL_IP_RANGES"]
      }
    }

    cr-static-nat를 Cloud NAT 게이트웨이 이름으로 바꿉니다.

VPC 네트워크를 통해 Cloud Run 트래픽 라우팅

NAT가 구성된 후에는 직접 VPC 이그레스 또는 서버리스 VPC 액세스 커넥터로 Cloud Run 서비스를 배포하고, VPC 네트워크를 통해 모든 트래픽을 라우팅하도록 VPC 이그레스를 설정해야 합니다.

명령줄

직접 VPC 이그레스 또는 VPC 커넥터를 사용하고 이를 통해 모든 이그레스 트래픽을 라우팅하도록 Cloud Run 서비스를 배포하거나 업데이트합니다.

gcloud run deploy SERVICE_NAME \
   --image=IMAGE_URL \
   --vpc-connector=CONNECTOR_NAME \
   --network=NETWORK \
   --subnet=SUBNET \
   --region=REGION \
   --vpc-egress=all-traffic

이 명령어에서 다음과 같이 값을 바꿉니다.

  • SERVICE_NAME: 배포하려는 Cloud Run 서비스의 이름
  • IMAGE_URL을 컨테이너 이미지에 대한 참조(예: us-docker.pkg.dev/cloudrun/container/hello:latest)로 바꿉니다. Artifact Registry를 사용하는 경우 저장소 REPO_NAME이 이미 생성되어 있어야 합니다. URL의 형식은 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG입니다.
  • 선택사항입니다. CONNECTOR_NAME: 직접 VPC 이그레스를 사용하지 않는 경우 서버리스 VPC 액세스 커넥터의 이름
  • NETWORK를 VPC 네트워크의 이름으로 바꿉니다.
  • SUBNET을 서브넷 이름으로 바꿉니다.
  • REGION을 서비스 리전으로 바꿉니다.

Terraform

이 Cloud Run 서비스는 VPC 커넥터를 사용하고 이를 통해 모든 이그레스 트래픽을 라우팅합니다.

resource "google_cloud_run_v2_service" "default" {
  provider = google-beta
  name     = "cr-static-ip-service"
  location = google_compute_subnetwork.default.region

  template {
    containers {
      # Replace with the URL of your container
      #   gcr.io/<YOUR_GCP_PROJECT_ID>/<YOUR_CONTAINER_NAME>
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    scaling {
      max_instance_count = 5
    }
    vpc_access {
      connector = google_vpc_access_connector.default.id
      egress    = "ALL_TRAFFIC"
    }
  }
  ingress = "INGRESS_TRAFFIC_ALL"

}

us-docker.pkg.dev/cloudrun/container/hello를 컨테이너 이미지에 대한 참조로 바꿉니다.

고정 외부 IP 확인

앞의 단계를 완료하면 VPC 네트워크에 미리 정의된 고정 IP 주소를 사용하여 Cloud NAT가 설정됩니다. 또한 모든 Cloud Run 서비스의 아웃바운드 트래픽이 VPC 네트워크로 라우팅됩니다. Cloud Run 서비스의 요청이 VPC 네트워크를 통과하고 고정 IP 주소를 사용해서 외부 엔드포인트에 연결됩니다.

이 동작을 확인하고 서비스에 사용되는 원래 IP 주소를 확인하기 위해서는 원본 IP 주소를 보여주는 curlmyip.org와 같은 API 또는 웹사이트에 요청을 수행할 수 있습니다.

고정 외부 IP 삭제

고정 외부 IP 주소가 더 이상 필요하지 않으면 고정 외부 IP 주소 해제를 참조하세요.