Configurar conectores no projeto host da VPC compartilhada

Se a organização usa a VPC compartilhada, é possível configurar um conector de acesso VPC sem servidor no projeto de serviço ou no projeto host. Este guia mostra como configurar um conector no projeto de host.

Se você precisar configurar um conector em um projeto de serviço, consulte Configurar conectores em projetos de serviço. Para saber mais sobre as vantagens de cada método, consulte Como se conectar a uma rede VPC compartilhada.

Antes de começar

  1. Verifique os papéis de gerenciamento de identidade e acesso (IAM) da conta que você está usando. A conta ativa precisa ter os seguintes papéis no projeto host:

  2. Selecione o projeto host no ambiente que preferir.

Console

  1. Abra o painel do console do Google Cloud.

    Acessar o painel do console do Google Cloud

  2. Na barra de menus na parte superior do painel, clique no menu suspenso do projeto e selecione o projeto host.

gcloud

Defina o projeto padrão na CLI gcloud para o projeto host executando este comando no terminal:

gcloud config set project HOST_PROJECT_ID

Substitua:

  • HOST_PROJECT_ID: o ID do projeto host da VPC compartilhada.

Criar um conector de acesso VPC sem servidor

Para enviar solicitações à rede VPC e receber as respostas correspondentes, você precisa criar um conector de acesso VPC sem servidor. É possível criar um conector usando o console do Google Cloud, o Google Cloud CLI ou o Terraform:

Console

  1. Ative a API de acesso VPC sem servidor para o projeto.

    Ativar API

  2. Acesse a página de visão geral do acesso VPC sem servidor.

    Página do console sobre o acesso VPC sem servidor

  3. Clique em Criar conector.

  4. No campo Nome, insira um nome para o conector. O nome precisa seguir a convenção de nomenclatura do Compute Engine e ter menos de 21 caracteres. Hifens (-) contam como dois caracteres.

  5. No campo Região, selecione 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.

  6. No campo Rede, selecione uma rede VPC para o conector.

  7. Clique no menu suspenso Sub-rede:

    Selecione uma sub-rede /28 não usada.

    • As sub-redes precisam ser usadas exclusivamente pelo conector. Elas não podem ser usadas por outros recursos, como VMs, Private Service Connect ou balanceadores de carga.
    • Para confirmar que a sub-rede não está sendo usada para o Private Service Connect ou o Cloud Load Balancing, verifique se a sub-rede purpose é PRIVATE executando o seguinte comando na CLI gcloud:
      gcloud compute networks subnets describe SUBNET_NAME
      
      Substitua SUBNET_NAME pelo nome da sub-rede.
  8. Opcional: se você quiser configurar opções de escalonamento para ter mais controle sobre o conector, clique em Mostrar configurações de escalonamento para exibir o formulário de escalonamento:

    1. Defina os números mínimo e máximo de instâncias para seu conector ou use os padrões, que são 2 (mínimo) e 10 (máximo). O conector é escalonado horizontalmente para o máximo especificado conforme o tráfego aumenta, mas o conector não reduz o escalonamento quando o tráfego diminui. É necessário usar valores entre 2 e 10, e o valor MIN precisa ser menor que o valor MAX.
    2. No menu suspenso Tipo de instância, escolha o tipo de máquina a ser usado para o conector ou use o padrão e2-micro. Observe a barra lateral de custo à direita ao escolher o tipo de instância, que exibe a largura de banda e as estimativas de custo.
  9. Clique em Criar.

  10. Uma marca de seleção verde aparecerá ao lado do nome do conector quando ele estiver pronto para uso.

gcloud

  1. Atualize os componentes gcloud para a versão mais recente:

    gcloud components update
    
  2. Ative a API de acesso VPC sem servidor para seu projeto:

    gcloud services enable vpcaccess.googleapis.com
    
  3. Crie um conector de acesso VPC sem servidor:

    gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
    --region=REGION \
    --subnet=SUBNET \
    --subnet-project=HOST_PROJECT_ID \
    # Optional: specify minimum and maximum instance values between 2 and 10, default is 2 min, 10 max.
    --min-instances=MIN \
    --max-instances=MAX \
    # Optional: specify machine type, default is e2-micro
    --machine-type=MACHINE_TYPE
    

    Substitua:

    • CONNECTOR_NAME: um nome para o conector. O nome precisa seguir a convenção de nomenclatura do Compute Engine e ter menos de 21 caracteres. Hifens (-) contam como dois caracteres.
    • 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.
    • SUBNET: o nome de uma sub-rede /28 não utilizada.
      • As sub-redes precisam ser usadas exclusivamente pelo conector. Elas não podem ser usadas por outros recursos, como VMs, Private Service Connect ou balanceadores de carga.
      • Para confirmar se a sub-rede não está sendo usada para o Private Service Connect ou o Cloud Load Balancing, verifique se o purpose da rede é PRIVATE executando o seguinte comando na CLI gcloud:
        gcloud compute networks subnets describe SUBNET_NAME
        
        Substitua:
        • SUBNET_NAME: o nome da sub-rede
    • HOST_PROJECT_ID: o ID do projeto host
    • MIN: é o número mínimo de instâncias a serem usadas no conector. Use um número inteiro entre 2 e 9. O padrão é 2. Para saber mais sobre o escalonamento do conector, consulte Capacidade de processamento e escalonamento.
    • MAX: o número máximo de instâncias a serem usadas para o conector. Use um número inteiro entre 3 e 10. O padrão é 10. Se o tráfego exigir, o conector será escalonado horizontalmente para instâncias [MAX], mas a escala não será reduzida. Para saber mais sobre o escalonamento do conector, consulte Capacidade de processamento e escalonamento.
    • MACHINE_TYPE: f1-micro, e2-micro ou e2-standard-4. Para saber mais sobre a capacidade de processamento do conector, incluindo o tipo de máquina e o escalonamento, consulte Capacidade de processamento e escalonamento.

    Para mais detalhes e argumentos opcionais, consulte a página de referência da gcloud.

  4. Verifique se o conector está no estado READY antes de usá-lo:

    gcloud compute networks vpc-access connectors describe CONNECTOR_NAME \
    --region=REGION
    

    Substitua:

    • CONNECTOR_NAME: o nome do conector. Este é o nome que você especificou na etapa anterior
    • REGION: a região do conector. Esta é a região especificada na etapa anterior

    A saída precisa conter a linha state: READY.

Terraform

É possível usar um recurso do Terraform para ativar a API vpcaccess.googleapis.com.

resource "google_project_service" "vpcaccess-api" {
  project = var.project_id # Replace this with your project ID in quotes
  service = "vpcaccess.googleapis.com"
}

É possível usar módulos do Terraform para criar uma rede VPC e uma sub-rede e, em seguida, criar o conector.

module "test-vpc-module" {
  source       = "terraform-google-modules/network/google"
  version      = "~> 9.0"
  project_id   = var.project_id # Replace this with your project ID in quotes
  network_name = "my-serverless-network"
  mtu          = 1460

  subnets = [
    {
      subnet_name   = "serverless-subnet"
      subnet_ip     = "10.10.10.0/28"
      subnet_region = "us-central1"
    }
  ]
}

module "serverless-connector" {
  source     = "terraform-google-modules/network/google//modules/vpc-serverless-connector-beta"
  version    = "~> 9.0"
  project_id = var.project_id
  vpc_connectors = [{
    name        = "central-serverless"
    region      = "us-central1"
    subnet_name = module.test-vpc-module.subnets["us-central1/serverless-subnet"].name
    # host_project_id = var.host_project_id # Specify a host_project_id for shared VPC
    machine_type  = "e2-standard-4"
    min_instances = 2
    max_instances = 7
    }
    # Uncomment to specify an ip_cidr_range
    #   , {
    #     name          = "central-serverless2"
    #     region        = "us-central1"
    #     network       = module.test-vpc-module.network_name
    #     ip_cidr_range = "10.10.11.0/28"
    #     subnet_name   = null
    #     machine_type  = "e2-standard-4"
    #     min_instances = 2
    #   max_instances = 7 }
  ]
  depends_on = [
    google_project_service.vpcaccess-api
  ]
}

Ativar o Cloud Run para o projeto de serviço

Ative a API Cloud Run para o projeto de serviço. Isso é necessário para adicionar papéis do IAM em etapas futuras e para que o projeto de serviço use o Cloud Run.

Console

  1. Abra a página da API Cloud Run.

    API Cloud Run

  2. Na barra de menus na parte superior do painel, clique no menu suspenso do projeto e selecione o projeto de serviço.

  3. Clique em Enable.

gcloud

No terminal, execute:

gcloud services enable run.googleapis.com --project=SERVICE_PROJECT_ID

Substitua:

  • SERVICE_PROJECT_ID: o ID do projeto de serviço

Conceder acesso ao conector

Para que o conector tenha acesso, conceda ao projeto de serviço Agente de serviço do Cloud Run o papel do IAM Usuário de acesso VPC sem servidor no projeto host.

Console

  1. Abra a página "IAM".

    Acessar IAM

  2. Clique no menu suspenso do projeto e selecione o projeto host.

  3. Clique em Add.

  4. No campo Novos principais, insira o endereço de e-mail do Agente de serviço do Cloud Run para o serviço do Cloud Run:

    service-SERVICE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com

    Substitua:

    • SERVICE_PROJECT_NUMBER: o número do projeto associado ao projeto de serviço. Ele é diferente do ID do projeto. Encontre esse número na página Configurações do projeto do projeto de serviço no console do Google Cloud.
  5. No campo Papel, selecione Usuário de acesso VPC sem servidor.

  6. Clique em Salvar.

gcloud

No terminal, execute:

gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
--member=serviceAccount:service-SERVICE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com \
--role=roles/vpcaccess.user

Substitua:

  • HOST_PROJECT_ID: o ID do projeto host da VPC compartilhada.
  • SERVICE_PROJECT_NUMBER: o número do projeto associado à conta de serviço. Ele é diferente do ID do projeto. Para encontrar o número do projeto, execute o comando a seguir:

    gcloud projects describe SERVICE_PROJECT_ID
    

Tornar o conector detectável

Na política do IAM do projeto host, conceda os papéis predefinidos a seguir aos principais que implantam serviços do Cloud Run:

Como alternativa, é possível usar papéis personalizados ou outros papéis predefinidos que incluam todas as permissões do papel Leitor de acesso VPC sem servidor (vpcaccess.viewer).

Console

  1. Abra a página "IAM".

    Acessar IAM

  2. Clique no menu suspenso do projeto e selecione o projeto host.

  3. Clique em Add.

  4. No campo Novos principais, insira o endereço de e-mail do principal que pode ver o conector no projeto de serviço. É possível inserir vários e-mails nesse campo.

  5. No campo Papel, selecione os dois papéis a seguir:

    • Visualizador de acesso VPC sem servidor
    • Leitor da rede do Compute
  6. Clique em Save.

gcloud

Execute estes comandos no terminal:

gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
--member=PRINCIPAL \
--role=roles/vpcaccess.viewer

gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
--member=PRINCIPAL \
--role=roles/compute.networkViewer

Substitua:

  • HOST_PROJECT_ID: o ID do projeto host da VPC compartilhada.
  • PRINCIPAL: o principal que implanta serviços do Cloud Run. Saiba mais sobre a sinalização --member.

Configurar o serviço para usar um conector

Para cada serviço do Cloud Run que exigir acesso à sua VPC compartilhada, especifique o conector do serviço. É possível especificar o conector usando o console do Google Cloud, a Google Cloud CLI, o arquivo YAML ou o Terraform ao implantar um novo serviço ou atualizar um serviço atual.

Console

  1. No console do Google Cloud, acesse o Cloud Run:

    Acesse o Cloud Run

  2. Clique em Criar serviço se estiver configurando um novo serviço em que fará uma implantação. Se você estiver configurando um serviço atual, clique nele e em Editar e implantar nova revisão.

  3. Se você estiver configurando um novo serviço, preencha a página inicial de configurações do serviço conforme preferir e clique em Contêineres, volumes, rede, segurança para expandir a página de configurações do serviço.

  4. Clique na guia Conexões.

    imagem

    • No campo Conector VPC, selecione um conector para usar ou selecione Nenhum para desconectar seu serviço de uma rede VPC.
  5. Clique em Criar ou Implantar.

gcloud

  1. Configure a CLI gcloud para usar o projeto que contém o recurso do Cloud Run:

    gcloud config set project PROJECT_ID
    Substitua:

    • PROJECT_ID: o ID do projeto que contém o recurso do Cloud Run que exige acesso à sua VPC compartilhada. Se o recurso do Cloud Run estiver no projeto host, esse será o ID do projeto host. Se o recurso do Cloud Run estiver em um projeto de serviço, esse será o ID do projeto de serviço.
  2. Use a sinalização --vpc-connector.

  • Para os serviços atuais:
    gcloud run services update SERVICE --vpc-connector=CONNECTOR_NAME
  • Para novos serviços:
    gcloud run deploy SERVICE --image=IMAGE_URL --vpc-connector=CONNECTOR_NAME
    Substitua:
    • SERVICE: o nome do serviço;
    • IMAGE_URL: uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/hello:latest;
    • CONNECTOR_NAME: o nome do conector. Use o nome totalmente qualificado ao implantar a partir de um projeto de serviço de VPC compartilhada (em vez do projeto host). Por exemplo:
      projects/HOST_PROJECT_ID/locations/CONNECTOR_REGION/connectors/CONNECTOR_NAME
      em que HOST_PROJECT_ID é o ID do projeto host, CONNECTOR_REGION é a região do conector e CONNECTOR_NAME é o nome que você deu ao conector.

YAML

Configure a CLI gcloud para usar o projeto que contém o recurso do Cloud Run:

gcloud config set project PROJECT_ID

Substitua:

  • PROJECT_ID: o ID do projeto que contém o recurso do Cloud Run que exige acesso à sua VPC compartilhada. Se o recurso do Cloud Run estiver no projeto host, esse será o ID do projeto host. Se o recurso do Cloud Run estiver em um projeto de serviço, esse será o ID do projeto de serviço.

É 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 visualizar e fazer o download da configuração:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Adicione ou atualize o atributo run.googleapis.com/vpc-access-connector no atributo annotations no atributo spec de nível superior:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/vpc-access-connector: CONNECTOR_NAME
          name: REVISION

    Substitua:

    • SERVICE: o nome do serviço do Cloud Run.
    • CONNECTOR_NAME: o nome do conector. Use o nome totalmente qualificado ao implantar a partir de um projeto de serviço de VPC compartilhada (em vez do projeto host). Por exemplo:
      projects/HOST_PROJECT_ID/locations/CONNECTOR_REGION/connectors/CONNECTOR_NAME
      em que HOST_PROJECT_ID é o ID do projeto host, CONNECTOR_REGION é a região do conector e CONNECTOR_NAME é o nome que você deu ao conector.
    • 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

É possível usar um recurso do Terraform para criar um serviço e configurá-lo para usar seu conector.

# Cloud Run service
resource "google_cloud_run_v2_service" "gcr_service" {
  name     = "mygcrservice"
  provider = google-beta
  location = "us-west1"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
      resources {
        limits = {
          cpu    = "1000m"
          memory = "512Mi"
        }
      }
      # the service uses this SA to call other Google Cloud APIs
      # service_account_name = myservice_runtime_sa
    }

    scaling {
      # Limit scale up to prevent any cost blow outs!
      max_instance_count = 5
    }

    vpc_access {
      # Use the VPC Connector
      connector = google_vpc_access_connector.connector.id
      # all egress from the service should go through the VPC Connector
      egress = "ALL_TRAFFIC"
    }
  }
}

Próximas etapas