Configure as definições de rede (1.ª geração)

As definições de rede das funções do Cloud Run permitem-lhe controlar a entrada e a saída de rede para e a partir de funções individuais. Por exemplo, pode usar as definições de rede para os seguintes exemplos de utilização:

  • Proteja as suas funções implementando o controlo de acesso baseado na rede.
  • Faça com que o tráfego de saída de uma função cumpra as regras de firewall, DNS e encaminhamento associadas à sua rede VPC.
  • Associar o tráfego de saída de uma função a um endereço IP estático.

Para mais detalhes sobre exemplos de utilização, consulte a secção Exemplos de utilização.

Definições de entrada

As definições de entrada controlam se os recursos fora do seu Google Cloud projeto ou do perímetro de serviço dos VPC Service Controls podem invocar uma função.

Para estar sujeita à política de um perímetro do VPC Service Controls, um recurso tem de pertencer ao serviço a ser restringido. Para funções do Cloud Run (1.ª geração), o serviço restrito é a Cloud Functions API.

Limitações

As funções acionadas por HTTP apenas internas podem ser invocadas por pedidos HTTP criados numa rede VPC, como os do Kubernetes Engine, do Compute Engine, do ambiente flexível do App Engine ou feitos por recursos do Cloud Scheduler, do Cloud Tasks, dos fluxos de trabalho ou do BigQuery que se encontram no mesmo projeto ou perímetro dos VPC Service Controls. Isto significa que os pedidos HTTP criados por ou encaminhados através do Pub/Sub ou do Eventarc não podem acionar estas funções. Os acionadores de eventos são sempre considerados "internos" e são permitidos independentemente da definição de entrada.

Configure as definições de entrada

Para restringir recursos de fora do seu projeto ou perímetro, especifique um dos seguintes valores de definição de entrada:

  • Permitir todo o tráfego: predefinição. Todos os pedidos recebidos à função são permitidos, tanto da Internet como de recursos no mesmo projeto.
  • Permitir apenas tráfego interno: apenas é permitido tráfego do Cloud Scheduler, Cloud Tasks, Eventarc, Workflows, BigQuery e redes VPC no mesmo projeto ou perímetro dos VPC Service Controls. Todos os outros pedidos são recusados com um erro 404.

    Para pedidos de uma VPC partilhada, tenha em atenção as seguintes considerações:

    • O tráfego é considerado interno se a função for implementada no projeto anfitrião da VPC partilhada.
    • O tráfego é considerado interno se o anfitrião da VPC partilhada e todos os projetos de serviço estiverem localizados no mesmo perímetro dos VPC Service Controls.
    • Todo o outro tráfego das redes de VPC partilhada é recusado.
  • Permita o tráfego interno e o tráfego do Cloud Load Balancing: o tráfego do Cloud Scheduler, Cloud Tasks, Eventarc, Workflows, BigQuery e das redes VPC no mesmo projeto ou perímetro dos VPC Service Controls é permitido. O tráfego do Cloud Load Balancing é permitido.

Pode especificar as definições de entrada quando implementar ou atualizar a sua função através da Google Cloud consola, da CLI gcloud ou do Terraform:

Consola

  1. Abra a página Vista geral das funções na Google Cloud consola:

    Aceda à página Vista geral das funções do Cloud Run

  2. Clique em Criar função. Em alternativa, clique numa função existente para aceder à respetiva página de detalhes e clique em Editar.

  3. Expanda as definições avançadas clicando em Tempo de execução, compilação….

  4. Na secção Ligações, selecione um valor para Definições de entrada.

gcloud

Use o comando gcloud functions deploy para implementar ou atualizar a função e especifique a flag --ingress-settings:

  gcloud functions deploy FUNCTION_NAME 
--trigger-http
--ingress-settings INGRESS_SETTINGS
FLAGS...

where:

  • FUNCTION_NAME é o nome da sua função.
  • INGRESS_SETTINGS é um dos valores suportados para definições de entrada. Os valores possíveis são:

    • all
    • internal-only
    • internal-and-gclb: permite o tráfego interno, bem como o tráfego enviado para um IP público exposto pelo Cloud Load Balancing. Bloqueia o tráfego enviado para cloudfunctions.net ou qualquer domínio personalizado configurado através das funções do Cloud Run. Impede que os utilizadores contornem os controlos de acesso (Cloud Armor, IAP) que configuram através do Cloud Load Balancing.
  • FLAGS... refere-se a outras flags que transmite ao comando deploy.

Terraform

Opcional. Para atualizar o campo de definições de entrada do ficheiro main.tf do seu recurso do Terraform, inclua o argumento ingress_settings que quer implementar ou atualizar. A alteração das definições de entrada recria a função.

  1. No ficheiro main.tf, localize o recurso para o qual quer restringir as definições de entrada e atualize-o para a definição pretendida. Por exemplo:

    resource "google_cloudfunctions_function" "function" {
      name             = "function"
      location         = "us-central1"
      description      = "Sample function"
      ingress_settings = "INGRESS_SETTINGS"
    }

    em que INGRESS_SETTINGS é um dos valores suportados para as definições de entrada. Os valores possíveis são:

    • ALLOW_ALL (predefinição): todos os pedidos recebidos para a função são permitidos, tanto da Internet como de recursos no mesmo projeto.
    • ALLOW_INTERNAL_ONLY: Apenas o tráfego do Cloud Scheduler, Cloud Tasks, Eventarc, Workflows e redes VPC no mesmo projeto ou perímetro do VPC Service Controls é permitido.
    • ALLOW_INTERNAL_AND_GCLB: permite o tráfego interno, bem como o tráfego enviado para um IP público exposto pelo Cloud Load Balancing. Bloqueia o tráfego enviado para cloudfunctions.net ou qualquer domínio personalizado configurado através das funções do Cloud Run. Impede que os utilizadores contornem os controlos de acesso (Cloud Armor, IAP) que configuram através do Cloud Load Balancing.

Se usar o Google Cloud Armor com o Cloud Load Balancing, pode criar políticas de segurança que filtram condições baseadas no tráfego, como o endereço IP, o intervalo de IP, o código da região ou os cabeçalhos de pedidos de um pedido recebido. Para mais informações, consulte o artigo Vista geral da política de segurança do Google Cloud Armor.

Definições de saída

As definições de saída controlam o encaminhamento de pedidos HTTP de saída de uma função. Para especificar as definições de saída, tem de associar a função a uma rede VPC através de um conetor do Acesso a VPC sem servidor. As definições de saída controlam quando o tráfego é encaminhado através do conetor na sua rede VPC.

Limitações

  • O Acesso a VPC sem servidor só suporta o encaminhamento de tráfego IPv4. O tráfego IPv6 não é suportado, mesmo que tenha rotas IPv6 na sua rede VPC.

  • Para maior segurança, Google Cloud bloqueia pacotes de saída para endereços IP externos na porta de destino TCP 25.

  • As funções ou os serviços do utilizador que invocam funções ou serviços protegidos por uma rede VPC têm de encaminhar essas invocações através de um conector VPC.

Configure as definições de saída

Para as definições de saída, pode especificar o seguinte:

  • Encaminhar apenas pedidos para IPs privados através do conetor da VPC: predefinição. O tráfego é encaminhado através da rede VPC apenas se os pacotes que transportam o tráfego tiverem destinos que correspondam ao seguinte:

    Os pacotes para qualquer outro destino são encaminhados das funções do Cloud Run para a Internet e não através de nenhuma rede VPC.

  • Encaminhar todo o tráfego através do conector da VPC: o tráfego é sempre encaminhado através da rede da VPC associada ao conector para todos os destinos de pacotes. Tem de usar esta opção nas seguintes circunstâncias:

    • Se precisar de enviar tráfego para intervalos de sub-redes da VPC com intervalos de endereços IP externos usados de forma privada. Para mais informações sobre os intervalos de sub-redes da VPC, consulte os Intervalos IPv4 válidos na vista geral das sub-redes.
    • Se precisar de enviar tráfego para um ponto final do Private Service Connect para APIs Google cujo endereço seja um endereço IP externo usado de forma privada. Para mais informações sobre os pontos finais do Private Service Connect para APIs Google, consulte o artigo Aceda às APIs Google através de pontos finais.
    • Se precisar de enviar tráfego para qualquer outro destino de endereço IP externo usado de forma privada que seja encaminhável na rede VPC do conector. Exemplos de outros destinos que abrangem endereços IP externos usados de forma privada podem incluir intervalos de sub-redes de peering, intervalos de sub-redes de peering criados a partir de intervalos de endereços IP atribuídos para serviços e os destinos acessíveis através de rotas personalizadas na rede VPC.

    Se a sua rede VPC incluir uma rota predefinida, os pacotes podem continuar a ser encaminhados para a Internet após o processamento pelo conector se configurar um gateway Cloud NAT para fornecer serviços NAT à sub-rede usada pelo conector. Estes pacotes estão sujeitos aos trajetos na sua rede VPC e às regras de firewall que se aplicam à sua rede VPC. Pode usar a configuração de rotas e firewalls para controlar a saída da Internet para todos os pedidos de saída enviados pela sua função através de um conetor do Acesso a VPC sem servidor.

Pode especificar as definições de saída quando implementar ou atualizar a sua função através da consola ou da Google Cloud CLI. Google Cloud

Consola

  1. Abra a página Vista geral das funções na Google Cloud consola:

    Aceda à página Vista geral das funções do Cloud Run

  2. Clique em Criar função. Em alternativa, clique numa função existente para aceder à respetiva página de detalhes e clique em Editar.

  3. Expanda as definições avançadas clicando em Tempo de execução, compilação….

  4. Na secção Ligações, em Definições de saída, selecione um conetor do Acesso a VPC sem servidor.

  5. Selecione a definição de saída adequada com base na forma como quer encaminhar o tráfego de saída através do conetor.

gcloud

Use o comando gcloud functions deploy para implementar ou atualizar a função e especifique a flag --egress-settings:

  gcloud functions deploy FUNCTION_NAME 
--vpc-connector CONNECTOR_NAME
--egress-settings EGRESS_SETTINGS
FLAGS...

where:

  • FUNCTION_NAME é o nome da sua função.
  • CONNECTOR_NAME é o nome do conetor de acesso à VPC sem servidor a usar. Consulte a gcloud documentação para mais informações.

  • EGRESS_SETTINGS é um dos valores suportados para as definições de saída: consulte a documentação gcloud.

  • FLAGS... refere-se a outras flags que transmite ao comando deploy.

Exemplos de utilização

Os exemplos seguintes demonstram como configurar o acesso à rede em vários cenários comuns.

Criar uma função que não pode ser chamada por clientes externos

Pode proteger as suas funções HTTP permitindo que sejam chamadas apenas por recursos no mesmo Google Cloud projeto ou no perímetro de serviço dos VPC Service Controls.

  1. Implemente a sua função e permita apenas tráfego interno. Use aGoogle Cloud consola ou a Google Cloud CLI:

    Consola

    1. Abra a página Vista geral das funções na Google Cloud consola:

      Aceda à página Vista geral das funções do Cloud Run

    2. Clique em Criar função. Em alternativa, clique numa função existente para aceder à respetiva página de detalhes e clique em Editar.

    3. Expanda as definições avançadas clicando em Tempo de execução, compilação….

    4. Na secção Ligações, em Definições de entrada, selecione Permitir apenas tráfego interno.

    gcloud

    Use o comando gcloud functions deploy:

    gcloud functions deploy FUNCTION_NAME \
    --ingress-settings internal-only \
    FLAGS...
    

Depois de implementar a função, os pedidos originados fora do seu projetoGoogle Cloud são bloqueados e não chegam à função. Se usar os VPC Service Controls, os pedidos provenientes de fora do perímetro de serviço são bloqueados. As instâncias de VMs dentro do perímetro do projeto ou do serviço continuam a poder aceder à sua função fazendo pedidos ao respetivo ponto final HTTPS.

Se quiser chamar esta função restrita a partir de outra função, a função de chamada tem de encaminhar a respetiva saída através da sua rede VPC.

Usar definições de saída e entrada para restringir o acesso

Pode incorporar a entrada e a saída nos seus serviços para adicionar uma camada adicional de restrição.

  1. Clone o repositório cloud-run-sample e mude para o diretório vpc-sample:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    cd vpc-sample

  2. Instale as dependências do Python:

    pip3 install -r requirements.txt

  3. Pode abrir o ficheiro main.py no diretório vpc-sample para ver a função que está a implementar:

    def hello_world(request):
        return "Hello World!"

  4. Implemente a função:

    gcloud functions deploy restricted-function 
    --runtime=python38
    --trigger-http
    --no-allow-unauthenticated
    --ingress-settings=internal-only
    --entry-point=hello_world

  5. Configure um conetor do Acesso a VPC sem servidor:

    gcloud compute networks vpc-access connectors create serverless-connector 
    --region=SERVICE_REGION
    --range=10.8.0.0/28

    onde SERVICE_REGION é uma região para o conector; tem de corresponder à região do seu serviço sem servidor. Se o seu serviço estiver na região us-central ou europe-west, use us-central1 ou europe-west1.

  6. Crie a imagem de contentor:

    gcloud builds submit --tag=gcr.io/PROJECT_ID/restricted-function-caller .

    em que PROJECT_ID é o ID do projeto.

    Isto cria uma imagem de contentor que invoca get_hello_world quando implementada a partir do ficheiro main.py:

    import os
    import urllib
    
    import google.auth.transport.requests
    import google.oauth2.id_token
    
    
    def get_hello_world(request):
        try:
            url = os.environ.get("URL")
            req = urllib.request.Request(url)
    
            auth_req = google.auth.transport.requests.Request()
            id_token = google.oauth2.id_token.fetch_id_token(auth_req, url)
            req.add_header("Authorization", f"Bearer {id_token}")
    
            response = urllib.request.urlopen(req)
            return response.read()
    
        except Exception as e:
            print(e)
            return str(e)

  7. Use o comando gcloud run deploy run-function para implementar o contentor do Cloud Run:

      gcloud run deploy run-function 
    --image gcr.io/PROJECT_ID/restricted-function-caller
    --no-allow-unauthenticated
    --update-env-vars=URL=https://SERVICE_REGION-PROJECT_ID.cloudfunctions.net/restricted-function-caller
    --vpc-egress=all
    --vpc-connector=serverless-connector
    --region=SERVICE_REGION

    where:

    • PROJECT_ID é o ID do projeto.
    • SERVICE_REGION é uma região para o conector. Esta tem de corresponder à região do seu serviço sem servidor. Se o seu serviço estiver na região us-central ou europe-west, use us-central1 ou europe-west1.

    O serviço do Cloud Run run-function está agora definido para enviar um pedido GET do conetor da VPC para a função restrita pela rede.

Encaminhamento da função de saída através da sua rede da VPC

As redes VPC no Google Cloud suportam um conjunto abrangente de configurações e funcionalidades de rede. Ao encaminhar o tráfego de saída da sua função para a sua rede de VPC, pode garantir que o tráfego de saída das funções do Cloud Run segue a firewall, o DNS, o encaminhamento e outras regras da sua rede de VPC, e pode usar produtos como o Cloud NAT.

  1. Configure uma rede de VPC. Configure uma rede VPC existente ou crie uma nova seguindo o guia em Usar redes VPC.

  2. Configure um conetor do Acesso a VPC sem servidor. As funções do Cloud Run precisam de um conetor do Acesso a VPC sem servidor para encaminhar o tráfego para a sua rede VPC. Crie um conetor e configure as autorizações adequadas seguindo as instruções em Estabelecer ligação a uma rede VPC.

  3. Implemente uma função que use o conetor e encaminhe toda a saída através do conetor. Use a Google Cloud consola ou a gcloudferramenta de linha de comandos:

    Consola

    1. Abra a página Vista geral das funções na Google Cloud consola:

      Aceda à página Vista geral das funções do Cloud Run

    2. Clique em Criar função. Em alternativa, clique numa função existente para aceder à respetiva página de detalhes e clique em Editar.

    3. Expanda as definições avançadas clicando em Tempo de execução, compilação….

    4. Na secção Ligações, em Definições de saída, selecione o conetor do Acesso a VPC sem servidor e selecione Encaminhar todo o tráfego através do conetor da VPC.

    gcloud

    Use o comando gcloud functions deploy:

    gcloud functions deploy FUNCTION_NAME \
    --vpc-connector CONNECTOR_NAME \
    --egress-settings all \
    FLAGS...
    

Depois de implementar a função, todo o tráfego originário da função é encaminhado através da rede VPC e cumpre as regras definidas na rede VPC. Tenha em atenção que a sua função não consegue aceder à Internet pública, a menos que configure a NAT na nuvem. Tenha também em atenção que precisa que a NAT na nuvem mapeie todos os intervalos de IP primários e secundários para todas as sub-redes para o gateway NAT, de modo a incluir a sub-rede do conector no mapeamento.

Associar a saída da função a um endereço IP estático

Em alguns casos, pode querer que o tráfego originário da sua função seja associado a um endereço IP estático. Por exemplo, isto é útil se estiver a chamar um serviço externo que apenas permite pedidos de endereços IP especificados explicitamente.

  1. Encaminhe a saída da sua função através da rede VPC. Consulte a secção anterior, Encaminhamento da saída da função através da sua rede VPC.

  2. Configure o Cloud NAT e especifique um endereço IP estático. Siga os guias em Especifique intervalos de sub-redes para NAT e Especifique endereços IP para NAT para configurar o NAT na nuvem para a sub-rede associada ao conector de acesso VPC sem servidor da sua função. O Cloud NAT tem de mapear todos os intervalos de IP primários e secundários para todas as sub-redes para o gateway NAT de modo a incluir a sub-rede do conector no mapeamento.

Balanceamento de carga multirregional

Pode implementar uma função em diferentes regiões e permitir que o pedido seja enviado para a região saudável mais próxima. Para o conseguir, tem de configurar um grupo de pontos finais de rede (NEG) sem servidor para a função e associá-lo a um equilibrador de carga, conforme descrito em Configurar um equilibrador de carga HTTP(S) com NEGs sem servidor.