definir as configurações de rede;

Com as configurações de rede do Cloud Functions, é possível controlar a entrada e a saída de redes de e para funções individuais. Use, por exemplos, as configurações de rede para os seguintes casos de uso:

  • Proteja suas funções implementando o controle de acesso com base em rede.
  • Faça com que o tráfego de saída da função adote regras de firewall, DNS e roteamento associadas à rede VPC.
  • Associe o tráfego de saída da função a um endereço IP estático.

Para mais informações sobre os casos de uso, consulte a seção Exemplos de casos de uso.

Configurações de entrada

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

Para estar sujeito à política de um perímetro do VPC Service Controls, um recurso precisa pertencer ao serviço a ser restrito. Para o Cloud Functions (1ª geração), o serviço restrito é a API Cloud Functions. Para o Cloud Functions (2ª geração), é a API Cloud Run Admin.

Limitações

Cloud Functions (1ª geração): as funções internas ativadas por HTTP podem ser invocadas por solicitações HTTP criadas em uma rede VPC, como as do Kubernetes Engine, do Compute Engine e do ambiente flexível do App Engine, ou feitas por recursos do Cloud Scheduler, do Cloud Tasks, do Workflows ou do BigQuery que estão no mesmo projeto ou perímetro do VPC Service Controls. Isso significa que as solicitações HTTP criadas ou encaminhadas pelo Pub/Sub ou pelo Eventarc não podem acionar essas funções. Os acionadores de eventos são sempre considerados "internos" e são permitidos, independentemente da configuração de entrada.

Definir configurações de entrada

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

  • Permitir todo o tráfego: padrão. Todas as solicitações de entrada para a função são permitidas, tanto da Internet como de recursos dentro do mesmo projeto.
  • Permitir somente o tráfego interno: só é permitido o tráfego do Cloud Scheduler, do Cloud Tasks, do Eventarc, do Workflows, do BigQuery e de redes VPC no mesmo projeto ou perímetro do VPC Service Controls. Todas as outras solicitações são negadas com um erro 404.

    Para solicitações de uma VPC compartilhada, observe as seguintes considerações:

    • O tráfego será considerado interno se a função for implantada no projeto host da VPC compartilhada.
    • O tráfego é considerado interno se o host da VPC compartilhada e todos os projetos de serviço forem colocados dentro do mesmo perímetro do VPC Service Controls.
    • O tráfego para uma função do Cloud Functions (2nd gen) será considerado interno se a função estiver conectada à mesma rede VPC compartilhada.
    • Todo o restante do tráfego das redes VPC compartilhadas é negado.
  • Permitir o tráfego interno e o tráfego do Cloud Load Balancing: é permitido o tráfego do Cloud Scheduler, do Cloud Tasks, do Eventarc, de fluxos de trabalho, do BigQuery e de redes VPC no mesmo projeto ou perímetro do VPC Service Controls. É permitido também o tráfego do Cloud Load Balancing.

É possível especificar configurações de entrada ao implantar ou atualizar uma função usando o console do Google Cloud, a Google Cloud CLI ou o Terraform:

Console

  1. Abra a página de visão geral do Functions no console do Google Cloud:

    Acessar a página Visão geral do Cloud Functions

  2. Clique em Criar função. Como alternativa, clique em uma função atual para acessar a página de informações dela e clique em Editar.

  3. Expanda as configurações avançadas clicando em Ambiente de execução, build....

  4. Na seção Conexões, selecione um valor para Configurações de entrada.

gcloud

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

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

em que:

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

    • all
    • internal-only
    • internal-and-gclb: permite o tráfego interno e 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 no Cloud Functions. Impede que os usuários burlem controles de acesso (Cloud Armor, IAP) configurados por meio do Cloud Load Balancing.
  • FLAGS... refere-se a outras sinalizações passadas para o comando deploy.

Terraform

Opcional. Para atualizar o campo de configurações de entrada do arquivo main.tf do recurso do Terraform, inclua o argumento ingress_settings que você quer implantar. ou atualizar. Fazer alterações nas configurações de entrada recria a função.

  1. No arquivo main.tf, localize o recurso de que você quer restringir as configurações de entrada e atualize-o para a configuração desejada, 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 aceitos para as configurações de entrada. Os valores possíveis são:

    • ALLOW_ALL (padrão): todas as solicitações de entrada para a função são permitidas, tanto da Internet como de recursos dentro do mesmo projeto.
    • ALLOW_INTERNAL_ONLY: só é permitido o tráfego do Cloud Scheduler, do Cloud Tasks, do Eventarc, do Workflows e de redes VPC no mesmo projeto ou perímetro do VPC Service Controls.
    • ALLOW_INTERNAL_AND_GCLB: permite o tráfego interno e 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 no Cloud Functions. Impede que usuários burlem controles de acesso (Cloud Armor, IAP) configurados no Cloud Load Balancing.

Se você usa o Google Cloud Armor com o Cloud Load Balancing, pode criar políticas de segurança que filtram condições com base no tráfego, como o endereço IP de uma solicitação recebida, o intervalo de IPs, o código de região ou os cabeçalhos de solicitações. Para mais informações, consulte a Visão geral da política de segurança do Google Cloud Armor.

Configuração de saída

As configurações de saída controlam o roteamento de solicitações HTTP de saída das funções. Para especificar as configurações de saída, é necessário conectar a função a uma rede VPC usando um conector de acesso VPC sem servidor. As configurações de saída controlam quando o tráfego é roteado pelo conector na rede VPC.

Limitações

  • O acesso VPC sem servidor é compatível apenas com o roteamento do tráfego IPv4. O tráfego IPv6 não é aceito, mesmo que você tenha rotas IPv6 na sua rede VPC.

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

  • As funções ou serviços do usuário que invocam funções ou serviços protegidos por uma rede VPC precisam encaminhar essas invocações por meio de um conector da VPC.

Definir configurações de saída

Para configurações de saída, especifique o seguinte:

  • Rotear solicitações somente para IPs privados por meio do conector da VPC: padrão. O tráfego será roteado pela rede VPC somente se os pacotes que transportam o tráfego tiverem destinos que correspondam ao seguinte:

    Os pacotes são roteados do Cloud Functions para a Internet, e não por qualquer rede VPC.

  • Rotear todo o tráfego pelo conector VPC: o tráfego é sempre roteado pela rede VPC associada ao conector, para todos os destinos de pacote. Use essa opção nas seguintes circunstâncias:

    • Se você precisar enviar tráfego para intervalos de sub-redes VPC com intervalos de endereços IP externos usados de modo privado. Para mais informações sobre intervalos de sub-rede VPC, consulte Intervalos IPv4 válidos na visão geral de sub-redes.
    • Se você precisar enviar tráfego para um endpoint do Private Service Connect para APIs do Google que tenham um endereço IP externo usado de modo particular. Para mais informações sobre endpoints do Private Service Connect para APIs do Google, consulte Acessar APIs do Google por endpoints.
    • Se você precisar enviar tráfego para qualquer outro destino de endereço IP externo usado de modo privado e roteável na rede VPC do conector. Exemplos de outros destinos que abrangem endereços IP externos utilizados de modo particular podem incluir intervalos de sub-rede de peering, intervalos de sub-rede de peering criados a partir de intervalos de endereços IP alocados para serviços e esses destinos que podem ser acessados usando rotas personalizadas na rede VPC.

    Se a rede VPC incluir uma rota padrão, os pacotes ainda poderão ser roteados para a Internet depois de serem processados pelo conector se você configurar um gateway do Cloud NAT para fornecer serviços NAT à sub-rede usada pelo conector. Esses pacotes estão sujeitos às rotas na sua rede VPC e às regras de firewall que se aplicam à rede VPC. Use a configuração de rota e firewall para controlar a saída da Internet para todas as solicitações de saída enviadas pela função por meio de um conector de acesso VPC sem servidor.

Especifique as configurações de saída ao implantar ou atualizar a função usando o console do Google Cloud ou a Google Cloud CLI:

Console

  1. Abra a página de visão geral do Functions no console do Google Cloud:

    Acessar a página Visão geral do Cloud Functions

  2. Clique em Criar função. Como alternativa, clique em uma função atual para acessar a página de informações dela e clique em Editar.

  3. Expanda as configurações avançadas clicando em Ambiente de execução, build....

  4. Na seção Conexões, em Configurações de saída, selecione um conector de acesso VPC sem servidor.

  5. Selecione a configuração de saída apropriada com base em como você quer rotear o tráfego de saída por meio do conector.

gcloud

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

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

em que:

  • FUNCTION_NAME é o nome da função.
  • CONNECTOR_NAME é o nome do conector de acesso VPC sem servidor a ser usado. Para mais informações, consulte a documentação da gcloud.

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

  • FLAGS... refere-se a outras sinalizações passadas para o comando deploy.

Exemplos de casos de uso

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

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

É possível proteger suas funções HTTP permitindo que elas sejam chamadas apenas por recursos no mesmo projeto do Google Cloud ou no perímetro de serviço do VPC Service Controls.

  1. Implemente sua função e permita somente o tráfego interno. Use o Console do Google Cloud ou a Google Cloud CLI:

    Console

    1. Abra a página de visão geral do Functions no console do Google Cloud:

      Acessar a página Visão geral do Cloud Functions

    2. Clique em Criar função. Como alternativa, clique em uma função atual para acessar a página de informações dela e clique em Editar.

    3. Expanda as configurações avançadas clicando em Ambiente de execução, build....

    4. Na seção Conexões, em Configurações de entrada, selecione Permitir somente tráfego interno.

    gcloud

    Use o comando gcloud functions deploy:

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

Depois de implantar a função, as solicitações originadas de fora do projeto do Google Cloud serão impedidas de acessar a função. Se você usar o VPC Service Controls, as solicitações de fora do perímetro de serviço serão bloqueadas. As instâncias de VM dentro do perímetro de projeto ou serviço ainda podem acessar a função fazendo solicitações para o endpoint HTTPS.

Se quiser usar outra função para chamar essa função restrita, a função de chamada precisa rotear a saída por meio da rede VPC.

Como usar as configurações de saída e entrada para restringir o acesso

É possível incorporar entrada e saída nos serviços para adicionar uma camada adicional de restrição.

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

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

  2. Instalar dependências do Python

    pip3 install -r requirements.txt
    

  3. É possível abrir o arquivo main.py no diretório vpc-sample para ver a função que você está implantando:

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

  4. Implante 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 conector de acesso VPC sem servidor:

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

    em que SERVICE_REGION é uma região do conector. Ela precisa corresponder à região do serviço sem servidor. Se o serviço estiver na região us-central ou europe-west, use us-central1 ou europe-west1.

  6. Crie a imagem do contêiner:

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

    em que PROJECT_ID é o ID do projeto.

    Isso cria uma imagem de contêiner que invoca get_hello_world quando implantada do arquivo 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 implantar o contêiner 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

    onde:

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

    O serviço run-function do Cloud Run agora está definido para enviar uma solicitação GET do conector VPC para a função restrita à rede.

Como rotear a saída da função pela rede VPC

As redes VPC no Google Cloud podem ter uma variedade de configurações e recursos de rede. Ao rotear o tráfego de saída da função para a rede VPC, você garante que o tráfego de saída das funções do Cloud siga as regras de firewall, DNS, roteamento e outras da sua rede VPC, bem como pode usar produtos como o Cloud NAT.

  1. Configure uma rede VPC. Configure uma rede VPC atual ou crie uma nova seguindo o guia em Como usar redes VPC.

  2. Configure um conector de acesso VPC sem servidor. As funções do Cloud precisam de um conector de acesso VPC sem servidor para rotear o tráfego para sua rede VPC. Crie um conector e defina as permissões adequadas seguindo as instruções em Como conectar a uma rede VPC.

  3. Implante uma função que use o conector e roteie todas as saídas pelo conector. Use o Console do Google Cloud ou a ferramenta de linha de comando gcloud:

    Console

    1. Abra a página de visão geral do Functions no console do Google Cloud:

      Acessar a página Visão geral do Cloud Functions

    2. Clique em Criar função. Como alternativa, clique em uma função atual para acessar a página de informações dela e clique em Editar.

    3. Expanda as configurações avançadas clicando em Ambiente de execução, build....

    4. Na seção Conexões, em Configurações de saída, selecione o conector de acesso VPC sem servidor e Rotear todo o tráfego pelo conector de VPC.

    gcloud

    Use o comando gcloud functions deploy:

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

Depois de implantar a função, todo o tráfego proveniente da função é roteado pela rede VPC e segue as regras definidas na rede VPC. Observação: a função não pode acessar a Internet pública, a menos que você configure o Cloud NAT. Observe também que o Cloud NAT precisa mapear todos os intervalos de IP principais e secundários de todas as sub-redes para o gateway NAT, a fim de incluir a sub-rede do conector no mapeamento.

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

Em alguns casos, recomenda-se que o tráfego proveniente da função seja vinculado a um endereço IP estático. Isso é útil, por exemplo, se você chamar um serviço externo em que só é possível fazer solicitações de endereços IP especificados explicitamente.

  1. Roteie a saída da função pela rede VPC. Consulte a seção anterior, Como rotear a saída da função pela rede VPC.

  2. Configure o Cloud NAT e defina um endereço IP estático. Siga as orientações em Especificar intervalos de sub-rede do NAT e Especificar endereço IP do NAT para configurar o Cloud NAT na sub-rede vinculada ao conector de acesso VPC sem servidor da função. Seu Cloud NAT precisa mapear todos os intervalos de IP primário e secundário de todas as sub-redes para o gateway NAT a fim de incluir a sub-rede do conector no mapeamento.

Balanceamento de carga multirregional

É possível implantar uma função em regiões diferentes e permitir que a solicitação seja enviada para a região íntegra mais próxima. Para isso, você precisa configurar um grupo de endpoints de rede (NEG, na sigla em inglês) sem servidor para a função e conectá-lo a um balanceador de carga, conforme descrito em Como configurar um balanceador de carga HTTP(S) com NEGs sem servidor.