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.

crie uma sub-rede

Crie uma sub-rede /28 dedicada para hospedar um conector. Se você estiver usando a saída direta da VPC, use uma sub-rede atual ou crie outra. Se você usar um conector, a sub-rede dedicada impedirá que outros recursos de computação na VPC, como VMs do Compute Engine ou clusters do Google Kubernetes Engine, usem acidentalmente o IP estático, se você tiver configurado a VPC sem servidor. Acesso à Internet.

gcloud

  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

Criar um conector de acesso VPC sem servidor

Não é necessário criar um conector se você usar a integração de saída VPC direta. Se você não usa a saída VPC direta, vai precisar de 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.

Para criar um conector de acesso VPC sem servidor.

gcloud

  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 que você criou.
    • 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.

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

Se você usa a saída VPC direta ou um conector de acesso VPC sem servidor, as solicitações do serviço do Cloud Run chegam à rede VPC. Se você quiser rotear solicitações de saída para endpoints externos por meio de um IP estático, configure um gateway do Cloud NAT.

gcloud

  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 for configurado, implante ou atualize seu serviço do Cloud Run com o conector de saída direta da VPC ou de acesso VPC sem servidor e defina a saída da VPC para encaminhar todo o tráfego pela rede VPC:

gcloud

  • Saída de VPC direta

    Para implantar ou atualizar o serviço do Cloud Run para usar a saída VPC direta e rotear todo o tráfego de saída por ela, execute o seguinte comando:

    gcloud run deploy SERVICE_NAME \
    --image=IMAGE_URL \
    --network=NETWORK \
    --subnet=SUBNET \
    --region=REGION \
    --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 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • NETWORK pelo nome da sua rede VPC;
    • SUBNET pelo nome da sub-rede.
    • REGION por uma região do seu serviço.
  • Conector de acesso VPC sem servidor

    Para implantar ou atualizar seu serviço do Cloud Run para usar um conector de acesso VPC sem servidor e rotear todo o tráfego de saída por ele, execute o seguinte comando:

    gcloud run deploy SERVICE_NAME \
    --image=IMAGE_URL \
    --vpc-connector=CONNECTOR_NAME \
    --region=REGION \
    --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 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • CONNECTOR_NAME pelo nome do conector do Acesso VPC sem servidor.
    • REGION por uma região do seu serviço.

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.

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.