Endereço IP de saída estático

Por padrão, um serviço do Cloud Run se conecta a endpoints externos na Internet usando um pool de endereços IP dinâmicos. Esse padrão não é adequado se o serviço do Cloud Run se conectar a um endpoint externo que requer conexões originadas de um endereço IP estático, como um banco de dados ou uma API usando um firewall baseado em endereço IP. Para essas conexões, configure o serviço do Cloud Run para encaminhar solicitações por meio de um endereço IP estático.

Neste guia, descrevemos como permitir que um serviço do Cloud Run envie solicitações usando um endereço IP estático.

Visão geral

Para permitir que um serviço do Cloud Run encaminhe solicitações por meio de um endereço IP estático, é necessário configurar a saída VPC do serviço do Cloud Run para rotear todo o tráfego de saída por meio de uma instância rede VPC que tenha um gateway do Cloud NAT configurado com o endereço IP estático.

Direcionar seu tráfego por meio do Cloud NAT não causa um salto adicional na pilha de rede, porque o gateway do Cloud NAT e o Cloud Router fornecem apenas um plano de controle e os pacotes não passam o gateway NAT ou o Cloud Router.

Todos os serviços do Cloud Run conectados à mesma rede VPC compartilharão o mesmo endereço IP de saída. Para usar endereços IP de saída diferentes para serviços separados do Cloud Run, siga este guia para criar sub-redes separadas e conectores de acesso VPC sem servidor.

Como criar uma sub-rede

Criar uma sub-rede para que o conector de acesso VPC sem servidor resida garante que outros recursos de computação na VPC, como VMs do Compute Engine ou clusters do Google Kubernetes Engine, não usem acidentalmente o IP estático que você configurar para acessar a Internet.

Linha de comando

  1. Encontre o nome da sua rede VPC:

    gcloud compute networks list

    O resultado será assim:

    NAME     SUBNET_MODE  BGP_ROUTING_MODE
    default  AUTO         REGIONAL

    Identifique a rede que será anexada ao conector de acesso VPC sem servidor.

  2. Crie uma sub-rede na VPC para o conector de acesso VPC sem servidor.

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

    Substitua os seguintes valores neste comando:

    • SUBNET_NAME por um nome que você quer dar à sub-rede.
    • RANGE pelo intervalo de IP no formato CIDR que você quer atribuir a essa sub-rede (por exemplo, 10.124.0.0/28).
    • NETWORK_NAME pelo nome da rede VPC.
    • REGION pela região em que você quer criar um conector de acesso VPC sem servidor.

Terraform

  1. Crie a rede VPC a ser usada.

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

    Substitua cr-static-ip-network pelo nome da sub-rede.

  2. Crie uma sub-rede na VPC para o conector de acesso VPC sem servidor.

    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"
    }

    Substituir

Como criar um conector de acesso VPC sem servidor

Para rotear o tráfego de saída do serviço do Cloud Run para uma rede VPC, é preciso ter um conector de acesso VPC sem servidor.

Para criar um conector de acesso VPC sem servidor.

Linha de comando

  1. Criar um conector de acesso VPC sem servidor com uma sub-rede pré-criada.

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

    Substitua os seguintes valores neste comando:

    • CONNECTOR por um nome que você quer dar a esse recurso.
    • PROJECT_ID por um nome que hospeda a sub-rede.
    • SUBNET_NAME pelo nome da sub-rede criada.
    • REGION pela região em que você quer criar um gateway NAT;

Terraform

  1. Crie um conector de acesso VPC sem servidor.

    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
      ]
    }

    Substitua cr-conn pelo nome do conector de acesso VPC sem servidor.

Como configurar a conversão de endereços de rede (NAT)

Se você usar um conector de acesso VPC sem servidor, as solicitações do serviço do Cloud Run chegarão à rede VPC. Para rotear solicitações de saída para endpoints externos por meio de um IP estático, você precisa configurar um gateway do Cloud NAT.

Linha de comando

  1. Crie um novo Cloud Router para programar um gateway NAT:

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

    Substitua os seguintes valores neste comando:

    • ROUTER_NAME com um nome para o recurso do Cloud Router que você quer criar.
    • NETWORK_NAME pelo nome da rede VPC que você encontrou anteriormente.
    • REGION pela região em que você quer criar um gateway NAT;
  2. Reservar um endereço IP estático Um recurso de endereço IP reservado retém o endereço IP subjacente quando o recurso ao qual ele está associado é excluído e recriado:

    gcloud compute addresses create ORIGIN_IP_NAME --region=REGION

    Substitua os seguintes valores neste comando:

    • ORIGIN_IP_NAME pelo nome que você quer atribuir ao recurso de endereço IP.
    • REGION pela região que executará o roteador do Cloud NAT. O ideal é usar a mesma região do serviço do Cloud Run para minimizar os custos de latência e rede.
  3. Crie uma configuração de gateway do Cloud NAT neste roteador para rotear o tráfego proveniente da rede VPC usando o endereço IP estático que você criou:

    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
    

    Substitua os seguintes valores neste comando:

    • NAT_NAME com um nome para o recurso de gateway do Cloud NAT que você quer criar.
    • ROUTER_NAME com o nome do seu Cloud Router
    • REGION pela região em que você quer criar um gateway NAT;
    • ORIGIN_IP_NAME pelo nome do recurso de endereço IP reservado criado na etapa anterior;

Terraform

  1. Crie um novo Cloud Router para programar um gateway NAT:

    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
    }

    Substitua cr-static-ip-router pelo nome da sua sub-rede.

  2. Reservar um endereço IP estático Um recurso de endereço IP reservado retém o endereço IP subjacente quando o recurso ao qual ele está associado é excluído e recriado:

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

    Substitua cr-static-ip-addr pelo nome da sua sub-rede.

  3. Crie uma configuração de gateway do Cloud NAT neste roteador para rotear o tráfego proveniente da rede VPC usando o endereço IP estático que você criou:

    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"]
      }
    }

    Substitua cr-static-nat pelo nome do gateway NAT do Cloud.

Como rotear o tráfego do Cloud Run por meio da rede VPC

Depois que o NAT é configurado, basta implantar o serviço do Cloud Run com o conector de acesso VPC sem servidor e definir a saída da VPC para rotear todo o tráfego por meio da rede VPC:

Linha de comando

Implante ou atualize seu serviço do Cloud Run para usar o conector da VPC e encaminhe todo o tráfego de saída por ele:

gcloud run deploy SERVICE_NAME \
   --image=IMAGE_URL \
   --vpc-connector=CONNECTOR_NAME \
   --vpc-egress=all-traffic

Substitua os seguintes valores neste comando:

  • SERVICE_NAME pelo nome do serviço do Cloud Run que você quer implantar.
  • IMAGE_URL por uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Se você usa o Artifact Registry, o repositório REPO_NAME já precisará ter sido criado. O URL tem o formato REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  • CONNECTOR_NAME pelo nome do conector do Acesso VPC sem servidor.

Terraform

Esse serviço do Cloud Run usa um conector VPC e encaminha todo o tráfego de saída por ele:

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"

}

Substitua us-docker.pkg.dev/cloudrun/container/hello por uma referência à imagem do seu contêiner.

Como verificar o IP externo estático

Depois de concluir as etapas anteriores, você configurou o Cloud NAT na sua rede VPC com um endereço IP estático predefinido e roteou todo o tráfego de saída do serviço do Cloud Run para sua rede VPC. As solicitações do serviço do Cloud Run passam pela rede VPC e alcançam endpoints externos usando o endereço IP estático.

Para verificar esse comportamento e confirmar o endereço IP de origem que seu serviço usa, faça uma solicitação para uma API ou um site, como curlmyip.org, que mostre o endereço IP de origem do Google Analytics.

Como excluir o IP externo estático

Se você não precisar mais de um endereço IP externo estático, consulte Liberar um endereço IP externo estático.