Saída de VPC direta com uma rede VPC compartilhada

É possível ativar seu serviço do App Engine para que envie tráfego a uma rede VPC compartilhada usando a saída de VPC direta sem precisar de um conector de acesso VPC sem servidor. A saída VPC direta é compatível com os Registros de fluxo de VPC e o Cloud NAT (Public NAT e Private NAT).

Nesta página, descrevemos como configurar as permissões do IAM do App Engine para usar a sub-rede da rede VPC compartilhada e, em seguida, colocar o serviço na sub-rede compartilhada.

Antes de começar

Consulte a seção Alocação de endereços IP para receber orientações sobre como alocar endereços IP da sua sub-rede.

Limitações

  • Consumo de endereços IP: o uso de endereços IP do serviço é dimensionado diretamente com o número de instâncias em execução, e sua capacidade de escalonamento é limitada pelo número de endereços IP disponíveis na sub-rede escolhida.

  • Eventos de manutenção: seu serviço pode sofrer breves interrupções de conexão durante eventos de manutenção da infraestrutura de rede. Recomendamos que você use bibliotecas de cliente para processar redefinições de conexão ocasionais.

  • Inicializações a frio: os tempos iniciais de inicialização a frio dependem da região e do caso de uso específico. Em casos raros, as inicializações a frio podem durar até um minuto.

  • Entrada de VPC direta: o App Engine não é compatível com a entrada de VPC direta.

  • Número de instâncias: por padrão, é possível configurar até 100 instâncias por versão do App Engine para usar a saída de VPC direta. É possível solicitar um aumento de cota para esse limite se a carga de trabalho exigir mais instâncias.

  • Registros de fluxo de VPC: não exibe a versão do serviço do App Engine nos registros. O nome do serviço é exibido no campo AppEngineServiceDetails.

  • Disponibilidade regional: a saída de VPC direta está disponível apenas por convite em determinadas regiões. Para solicitar acesso nessas regiões, entre em contato com o suporte.

Configurar permissões do IAM

Antes que o App Engine em um projeto de serviço de VPC compartilhada possa acessar uma rede VPC compartilhada, verifique se o agente de serviço do App Engine tem permissões suficientes para usar a sub-rede.

  • Papel de agente de serviço do App Engine: para acessar a rede VPC compartilhada, conceda permissões suficientes ao agente de serviço do App Engine adicionando um dos seguintes papéis:

    • Usuário da rede do Compute (roles/compute.networkUser) no projeto host da VPC compartilhada. As sub-redes com IPv6 externo também exigem o papel de Administrador de IP público do Compute (roles/compute.publicIpAdmin).

      Por exemplo, para conceder o papel de Usuário da rede do Compute, execute o seguinte comando:

      gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
      --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@gcp-gae-service." \
      --role "roles/compute.networkUser"

      Substitua:

      • HOST_PROJECT_ID: o ID do seu projeto host da VPC compartilhada;
      • SERVICE_PROJECT_NUMBER: o número do projeto de serviço da VPC compartilhada em que você implanta o serviço do App Engine.
    • Leitor da rede do Compute (roles/compute.networkViewer) no projeto host da VPC compartilhada e o papel Usuário da rede do Compute (roles/compute.networkUser) na sub-rede da VPC compartilhada. As sub-redes com IPv6 externo também exigem o papel de Administrador de IP público do Compute (roles/compute.publicIpAdmin).

      Por exemplo, para conceder o papel de Leitor da rede do Compute no projeto host e o papel de Usuário da rede do Compute na sub-rede, execute os seguintes comandos:

      gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
        --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@gcp-gae-service." \
        --role "roles/compute.networkViewer"
      
      gcloud compute networks subnets add-iam-policy-binding SUBNET_NAME \
        --region REGION \
        --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@gcp-gae-service." \
        --role "roles/compute.networkUser" \
        --project HOST_PROJECT_ID

      Substitua:

      • HOST_PROJECT_ID: o ID do seu projeto host da VPC compartilhada;
      • SERVICE_PROJECT_NUMBER: o número do projeto de serviço da VPC compartilhada em que você implanta o serviço do App Engine.
      • SUBNET_NAME: o nome da sub-rede em que você quer executar os serviços do App Engine.
      • REGION: a região do serviço do App Engine, que precisa corresponder à região da sua sub-rede;
  • Permissões personalizadas: para ter um controle mais granular, conceda ao agente de serviço do App Engine as seguintes permissões extras no projeto:

    • compute.networks.get no projeto host da VPC compartilhada
    • compute.subnetworks.get no projeto host ou na sub-rede específica
    • compute.subnetworks.use no projeto host ou na sub-rede específica
    • compute.addresses.get no projeto de serviço da VPC compartilhada
    • compute.addresses.list no projeto de serviço da VPC compartilhada
    • compute.addresses.create no projeto de serviço da VPC compartilhada
    • compute.addresses.delete no projeto de serviço da VPC compartilhada
    • compute.addresses.createInternal no projeto de serviço da VPC compartilhada
    • compute.addresses.deleteInternal no projeto de serviço da VPC compartilhada
    • compute.regionOperations.get no projeto de serviço da VPC compartilhada

Alocação de endereço IP

Para colocar o serviço do App Engine em uma rede VPC, especifique uma rede VPC, uma sub-rede ou ambas. Se você especificar apenas uma rede, a sub-rede vai usar o mesmo nome da rede. O App Engine aloca endereços IP da sub-rede.

Os endereços IP são temporários. Portanto, não crie políticas com base em IPs individuais. Se você precisar criar uma política com base em IPs, como em regras de firewall, use o intervalo de endereços IP de toda a sub-rede.

Para alterar a rede ou sub-rede que o serviço usa, implante uma nova versão que use os novos valores de rede e sub-rede.

Aumentar e reduzir escala vertical

Para um escalonar verticalmente mais rápido durante um aumento de tráfego, o App Engine reserva endereços IP em blocos de 16 (máscara de sub-rede 28) por vez. Para garantir que você tenha endereços IPv4 suficientes disponíveis para uso no App Engine, o intervalo de endereços IPv4 da sub-rede precisa ser /26 ou maior.

Para aumentar a eficiência da alocação de IP e facilitar o gerenciamento, coloque vários recursos na mesma sub-rede. Se o espaço de endereços IPv4 for limitado, consulte Intervalos de IPv4 compatíveis para mais opções.

Para excluir a sub-rede, é preciso primeiro excluir ou reimplantar o serviço do App Engine para interromper o uso da sub-rede e aguardar de uma a duas horas.

Consumo de endereços IP para serviços

No estado estável, o App Engine usa duas vezes (2X) mais endereços IP do que o número de instâncias. Quando uma versão reduz escala vertical, o App Engine retém os endereços IP por até 20 minutos. No total, reserve pelo menos o dobro do número de endereços IP, além de um buffer para as atualizações de versão.

Por exemplo, se você fizer upgrade das versões para que version 1 seja escalonado de 100 instâncias para zero, enquanto version 2 escalona de zero para 100, o App Engine mantém os endereços IP version 1 por até 20 minutos após a redução. Durante a janela de retenção de 20 minutos, é preciso reservar pelo menos 400 endereços IP ((100 + 100) * 2).

Intervalos IPv4 compatíveis

O App Engine é compatível com os seguintes intervalos IPv4 para a sub-rede:

  • RFC 1918
    • 10.0.0.0/8
    • 172.16.0.0/12
    • 192.168.0.0/16
  • RFC 6598
    • 100.64.0.0/10
  • Classe E
    • 240.0.0.0/4

Implantar um serviço do App Engine

A saída de VPC direta permite que o serviço do App Engine envie tráfego para uma rede VPC compartilhada sem um conector acesso VPC sem servidor. É possível atribuir tags de rede a uma versão específica do serviço do App Engine para uma segurança de rede mais granular, como a aplicação de regras de firewall da VPC.

Para colocar o serviço na sub-rede compartilhada, especifique os nomes dos recursos totalmente qualificados na rede VPC compartilhada e na sub-rede.

É possível configurar a saída de VPC direta para um serviço do App Engine usando YAML ou Terraform. Para ativar ou desativar a saída de VPC direta, implante uma nova versão e migre o tráfego para ela. Também é possível excluir a versão implantada primeiro, em vez de substituir um ID de versão atual.

YAML

  1. Atualize o arquivo app.yaml para incluir a seção vpc_access:

    vpc_access:
    network_interface:
     network: projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK
     subnet: projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
     tags:
         - NETWORK_TAGS
    vpc_egress: EGRESS_SETTING

    Substitua:

    • HOST_PROJECT_ID: o ID do seu projeto da VPC compartilhada;
    • VPC_NETWORK: o nome da sua rede VPC compartilhada;
    • REGION: a região do serviço do App Engine, que precisa corresponder à região da sua sub-rede;
    • SUBNET_NAME: o nome da sub-rede.
    • Opcional: NETWORK_TAGS lista as tags de rede a serem associadas às instâncias do serviço do App Engine para uso em regras de firewall e políticas de roteamento.
    • Opcional: EGRESS_SETTING controla como o tráfego de saída é roteado. Esse campo é compatível com as seguintes configurações:

    • all-traffic: envia todo o tráfego de saída pela rede VPC compartilhada.

    • private-ranges-only (padrão): envia o tráfego apenas para endereços internos pela rede VPC compartilhada.

  2. Implante o serviço executando o seguinte comando:

    gcloud app deploy

Terraform

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

  1. Adicione o seguinte bloco vpc_access a um recurso google_app_engine_standard_app_version na configuração do Terraform:

    vpc_access {
    vpc_egress = "EGRESS_SETTING"
    network_interfaces {
     network    = "projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK"
     subnetwork = "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME"
     tags       = ["TAG_1", "TAG_2"]
    }
    }

    Substitua:

    • HOST_PROJECT_ID: o ID do seu projeto host da VPC compartilhada;
    • VPC_NETWORK: o nome da sua rede VPC compartilhada;
    • REGION: a região do serviço do App Engine, que precisa corresponder à região da sua sub-rede;
    • SUBNET_NAME: o nome da sub-rede.
    • Opcional: TAG_1, TAG_2 lista as tags de rede a serem associadas às instâncias do serviço do App Engine para uso em regras de firewall e políticas de roteamento.
    • Opcional: EGRESS_SETTING controla como o tráfego de saída é roteado. Esse campo é compatível com as seguintes configurações:
    • ALL_TRAFFIC: envia todo o tráfego de saída pela rede VPC compartilhada.
    • PRIVATE_IP_RANGES (padrão): envia o tráfego apenas para endereços internos pela rede VPC compartilhada.
  2. Se a versão já estiver implantada sem a saída de VPC direta, atualize o campo version_id para um novo valor. Não é possível ativar a saída de VPC direta em uma versão atual.

  3. Aplique a configuração:

    terraform apply

Desconectar um serviço

Para remover o serviço da rede VPC compartilhada, use YAML ou Terraform:

YAML

  1. Remova a seção vpc_access do arquivo app.yaml.
  2. Reimplante o serviço:

    gcloud app deploy

Terraform

  1. Remova o bloco vpc_access do recurso google_app_engine_standard_app_version na configuração do Terraform.
  2. Atualize o campo version_id com um novo valor. Não é possível desativar a saída de VPC direta em uma versão atual.
  3. Aplique a configuração:

    terraform apply

Resolver problemas

Nesta seção, descrevemos os erros comuns que podem ocorrer ao usar a saída de VPC direta com uma rede VPC compartilhada e fornecemos orientações sobre como resolvê-los.

Não consigo excluir uma sub-rede

Para excluir uma sub-rede, você precisa primeiro excluir todos os recursos que a utilizam. Se o App Engine estiver usando uma sub-rede, desconecte-o ou mova-o para uma sub-rede diferente antes de excluir a sub-rede.

Depois de excluir ou mover os recursos do App Engine, aguarde uma ou duas horas até que o App Engine libere os IPs antes de excluir a sub-rede.

Falhas na implantação

Se a implantação falhar, a Google Cloud CLI vai exibir mensagens de erro indicando a causa raiz. Veja alguns problemas comuns:

  • Metadados de rede VPC incorretos, como um nome de rede ou sub-rede com erro de ortografia no arquivo app.yaml. Para corrigir possíveis erros, revise a configuração da rede VPC no arquivo app.yaml.

  • Permissões do IAM insuficientes. Conceda as permissões necessárias ao agente de serviço do App Engine (service-SERVICE_PROJECT_NUMBER@gcp-gae-service.). Se você encontrar erros de permissão durante a implantação, conceda os seguintes papéis adicionais à conta de serviço de implantação:

Não consigo remover a rede VPC compartilhada

Para desanexar a rede VPC compartilhada no projeto host, siga as etapas para desprovisionar a VPC compartilhada e desconecte todos os serviços do App Engine da rede VPC compartilhada.

Para ver quais recursos do App Engine estão usando a rede VPC compartilhada, execute o seguinte comando:

gcloud compute shared-vpc list-associated-resources HOST_PROJECT_ID

Substitua HOST_PROJECT_ID pelo ID do seu projeto host da VPC compartilhada.

A sub-rede de saída de VPC direta fica sem endereços IPv4

Se a sub-rede da rede VPC ficar sem endereços IPv4, o App Engine não poderá iniciar mais instâncias de serviço.

Para resolver esse problema, mude para uma sub-rede com mais endereços IP disponíveis ou expanda o intervalo da sub-rede.

Ver endereços IP alocados

Para ver os endereços IP que o App Engine alocou, acesse a página de endereços IP no console do Google Cloud ou execute o seguinte comando na Google Cloud CLI:

gcloud compute addresses list