Como restringir a entrada no Cloud Run

Nesta página, descrevemos como usar as configurações de entrada para restringir o acesso à rede para seu serviço do Cloud Run. No nível de rede, por padrão, qualquer recurso na Internet pode acessar seu serviço do Cloud Run no URL run.app ou em um domínio personalizado configurado no Cloud Run. É possível alterar esse padrão especificando uma configuração diferente de entrada. Todos os caminhos de entrada, incluindo o URL run.app padrão, estão sujeitos à configuração de entrada. O recurso de entrada é definido no nível do serviço.

As configurações de entrada e os métodos de autenticação do IAM são duas maneiras de gerenciar o acesso a um serviço. Eles são independentes uns dos outros. Use uma dessas abordagens para gerenciar o acesso em camadas.

Configurações de entrada disponíveis

As seguintes configurações estão disponíveis:

Configuração Descrição
Interno Mais restritiva. Permite solicitações das seguintes fontes:
  • Balanceador de carga de aplicativo interno, incluindo solicitações de redes VPC compartilhadas quando encaminhadas por meio do balanceador de carga de aplicativo interno
  • Recursos permitidos por qualquer perímetro do VPC Service Controls que contenha seu serviço do Cloud Run
  • Redes VPC que estão no mesmo projeto ou perímetro do VPC Service Controls que o serviço do Cloud Run
  • Entrada de VPC compartilhada (visualização): a rede VPC compartilhada para a qual a revisão está configurada para enviar tráfego. Para informações sobre quando o tráfego da VPC compartilhada é reconhecido como "interno", consulte Considerações especiais da VPC compartilhada.
  • Os seguintes produtos do Google Cloud, se estiverem no mesmo projeto ou perímetro do VPC Service Controls que o serviço do Cloud Run:
    • Cloud Scheduler
    • Cloud Tasks
    • Eventarc
    • Pub/Sub
    • Fluxos de trabalho
    • BigQuery
As solicitações dessas origens permanecem na rede do Google, mesmo que elas acessem o serviço no URL run.app. Solicitações de outras origens, incluindo a Internet, não podem alcançar seu serviço no URL run.app ou em domínios personalizados.

As solicitações do Cloud Run, Cloud Functions ou App Engine para o Cloud Run precisam ir à rede VPC para serem consideradas internas. Para encaminhar solicitações à rede VPC, use a saída VPC direta ou um conector de acesso VPC sem servidor e ative o Acesso privado do Google em a sub-rede associada à saída direta de VPC ou ao conector.

Não há suporte para multilocação, ou seja, vários domínios de confiança dentro do mesmo projeto.
Interno e Cloud Load Balancing Permite solicitações dos seguintes recursos:
  • Recursos permitidos pela configuração interna mais restritiva
  • Balanceador de carga de aplicativo externo
Use a configuração interna e do Cloud Load Balancing para:
  • Aceitar solicitações da Internet pelo balanceador de carga de aplicativo externo. Não são permitidas solicitações diretas para o URL run.app a partir da Internet.
  • Verifique se as solicitações da Internet estão sujeitas a recursos do balanceador de carga de aplicativo externo, como Identity-Aware Proxy, Google Cloud Armor e Cloud CDN.
Tudo Menos restritiva. Permite todas as solicitações, incluindo solicitações diretamente da Internet para o URL run.app.

Como acessar serviços internos

As seguintes considerações adicionais se aplicam:

  • Ao acessar serviços internos, chame-os da mesma maneira que chamaria usando os URLs públicos, seja o URL padrão run.app ou um domínio personalizado configurado no Cloud Run.

  • Para solicitações de instâncias de VM do Compute Engine, nenhuma outra configuração é necessária para máquinas que têm endereços IP públicos ou que usam o Cloud NAT. Caso contrário, consulte Receber solicitações de redes VPC.

  • Para solicitações de outros serviços do Cloud Run ou do Cloud Functions no mesmo projeto, conecte o serviço ou a função a uma rede VPC e roteie todas as saídas pelo conector, conforme descrito em VPC com conectores. A permissão de invocador do IAM ainda é aplicada.

  • As solicitações de recursos dentro de redes VPC no mesmo projeto são classificadas como "internas", mesmo que o recurso de origem tenha um endereço IP público.

  • As solicitações de recursos em um projeto separado, mas no mesmo perímetro VPC Service Controls só poderão chamar um serviço interno se você configurar a API Cloud Run Admin como serviço restrito no perímetro de serviço.

  • Para informações sobre quando o tráfego da VPC compartilhada é reconhecido como "interno", consulte Considerações especiais da VPC compartilhada.

  • As solicitações de recursos locais conectados à rede VPC via Cloud VPN e Cloud Interconnect são consideradas "internas".

  • Para solicitações do Cloud Scheduler, Cloud Tasks, Eventarc, Pub/Sub, BigQuery e Workflows para um serviço interno, as seguintes considerações se aplicam:

    • Use o URL run.app padrão do Cloud Run para esse serviço, não qualquer domínio personalizado.
    • O job, a tarefa, a assinatura do Pub/Sub, o evento, o fluxo de trabalho ou a função remota do BigQuery precisam estar no mesmo projeto ou perímetro do VPC Service Controls que o serviço do Cloud Run.
  • É possível chamar serviços internos de origens de tráfego fora da rede VPC usando o Cloud Scheduler, Cloud Tasks, Pub/Sub, Eventarc, Workflows ou BigQuery de dentro do mesmo projeto ou perímetro do VPC Service Controls.

Como configurar a entrada

É possível definir a entrada usando qualquer um dos métodos compatíveis nas guias abaixo:

Console

  1. Acesse o Cloud Run

  2. Se você estiver configurando um novo serviço, clique em Criar serviço e preencha a página de configurações de serviço inicial conforme desejado.

  3. Se você estiver configurando um serviço atual, clique nele e na guia Rede.

  4. Selecione o tráfego de entrada que você quer permitir:

    image

  5. Clique em Criar ou Salvar.

Linha de comando

  1. Se você estiver implantando um novo serviço, implante seu serviço com a sinalização --ingress:

    gcloud run deploy SERVICE --image IMAGE_URL --ingress INGRESS

    Substituir

    • INGRESS por uma das configurações de entrada disponíveis:
      • all
      • internal
      • internal-and-cloud-load-balancing
    • SERVICE pelo nome do serviço.
    • 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
  2. Se você estiver alterando uma entrada de serviço atual:

    gcloud run services update SERVICE --ingress INGRESS

    Substituir

YAML

É possível fazer o download e conferir as configurações de serviço usando o comando gcloud run services describe --format export, que produz resultados limpos no formato YAML. Em seguida, modifique os campos descritos abaixo e faça upload do YAML modificado usando o comando gcloud run services replace. Modifique os campos somente conforme documentado.

  1. Para ver e fazer o download da configuração:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Atualize a anotação run.googleapis.com/ingress::

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      annotations:
        run.googleapis.com/ingress: INGRESS
      name: SERVICE
    spec:
      template:
        metadata:
          name: REVISION

    Substituir

    • SERVICE com o nome do Cloud Run.
    • INGRESS por uma das configurações de entrada disponíveis:
      • all
      • internal
      • internal-and-cloud-load-balancing
    • REVISION por um novo nome de revisão ou excluí-lo (se houver). Se você fornecer um novo nome de revisão, ele precisará atender aos seguintes critérios:
      • Começa com SERVICE-
      • Contém apenas letras minúsculas, números e -
      • Não termina com um -
      • Não excede 63 caracteres
  3. Substitua o serviço pela nova configuração usando o seguinte comando:

    gcloud run services replace service.yaml

Terraform

Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.

Adicione a instrução a seguir ao seu arquivo main.tf:

resource "google_cloud_run_v2_service" "default" {
  provider = google-beta
  name     = "ingress-service"
  location = "us-central1"

  # For valid annotation values and descriptions, see
  # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#ingress
  ingress = "INGRESS_TRAFFIC_INTERNAL_ONLY"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello" #public image for your service
    }
  }
}

A seguir