Configure conetores no projeto anfitrião da VPC partilhada

Se a sua organização usar a VPC partilhada, pode configurar um conetor do Acesso a VPC sem servidor no projeto de serviço ou no projeto anfitrião. Este guia mostra como configurar um conector no projeto anfitrião.

Se precisar de configurar um conector num projeto de serviço, consulte o artigo Configurar conectores em projetos de serviço. Para saber mais acerca das vantagens de cada método, consulte o artigo Estabelecer ligação a uma rede VPC partilhada.

Antes de começar

  1. Verifique as funções de gestão de identidade e de acesso (IAM) da conta que está a usar atualmente. A conta ativa tem de ter as seguintes funções no projeto anfitrião:

  2. Selecione o projeto anfitrião no seu ambiente preferido.

Consola

  1. Abra o Google Cloud painel de controlo da consola.

    Aceda ao Google Cloud painel de controlo da consola

  2. Na barra de menu na parte superior do painel de controlo, clique no menu pendente do projeto e selecione o projeto anfitrião.

gcloud

Defina o projeto predefinido na CLI gcloud para o projeto anfitrião executando o seguinte no seu terminal:

gcloud config set project HOST_PROJECT_ID

Substitua o seguinte:

  • HOST_PROJECT_ID: o ID do projeto anfitrião da VPC partilhada

Crie um conetor do Acesso a VPC sem servidor

Para enviar pedidos à sua rede VPC e receber as respostas correspondentes, tem de criar um conetor do Acesso a VPC sem servidor. Pode criar um conector através da Google Cloud consola, da Google Cloud CLI ou do Terraform:

Consola

  1. Ative a API Serverless VPC Access para o seu projeto.

    Ative a API

  2. Aceda à página de vista geral do Acesso a VPC sem servidor.

    Aceda ao Acesso a VPC sem servidor

  3. Clique em Criar conetor.

  4. No campo Nome, introduza um nome para o conetor. O nome tem de seguir a convenção de nomenclatura do Compute Engine e ter menos de 21 carateres. Os hífens (-) contam como dois carateres.

  5. No campo Região, selecione uma região para o conetor. 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. No campo Rede, selecione a rede VPC à qual quer anexar o conetor.

  7. Clique no menu pendente Sub-rede:

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

    • As sub-redes têm de ser usadas exclusivamente pelo conetor. Não podem ser usados por outros recursos, como VMs, Private Service Connect ou equilibradores de carga.
    • Para confirmar que a sua sub-rede não é usada para o Private Service Connect nem o Cloud Load Balancing, verifique se a sub-rede purpose está PRIVATE executando o seguinte comando na CLI gcloud:
      gcloud compute networks subnets describe SUBNET_NAME
      
      Substitua SUBNET_NAME pelo nome da sua sub-rede.
  8. (Opcional) Para definir opções de dimensionamento para um controlo adicional do conector, clique em Mostrar definições de dimensionamento para apresentar o formulário de dimensionamento.

    1. Defina o número mínimo e máximo de instâncias para o seu conetor, ou use os valores predefinidos, que são 2 (mínimo) e 10 (máximo). O conector é expandido até ao máximo especificado à medida que o tráfego aumenta, mas o conector não é reduzido quando o tráfego diminui. Tem de usar valores entre 2 e 10, e o valor de MIN tem de ser inferior ao valor de MAX.
    2. No menu pendente Tipo de instância, escolha o tipo de máquina a usar para o conetor ou use o valor predefinido e2-micro. Repare na barra lateral de custos à direita quando escolhe o tipo de instância, que apresenta estimativas de largura de banda e custos.
  9. Clique em Criar.

  10. É apresentada uma marca de verificação verde junto ao nome do conector quando este estiver pronto a usar.

gcloud

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

    gcloud components update
    
  2. Ative a API Serverless VPC Access para o seu projeto:

    gcloud services enable vpcaccess.googleapis.com
    
  3. Crie um conetor do Acesso a 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 o seguinte:

    • CONNECTOR_NAME: um nome para o conector. O nome tem de seguir a convenção de nomenclatura do Compute Engine e ter menos de 21 carateres. Os hífens (-) contam como dois carateres.
    • 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.
    • SUBNET: o nome de uma sub-rede /28 não usada.
      • As sub-redes têm de ser usadas exclusivamente pelo conetor. Não podem ser usados por outros recursos, como VMs, Private Service Connect ou equilibradores de carga.
      • Para confirmar que a sua sub-rede não é usada para o Private Service Connect nem o Cloud Load Balancing, verifique se a sub-rede purpose está PRIVATE executando o seguinte comando na CLI gcloud:
        gcloud compute networks subnets describe SUBNET_NAME
        
        Substitua o seguinte:
        • SUBNET_NAME: o nome da sua sub-rede
    • HOST_PROJECT_ID: o ID do projeto anfitrião
    • MIN: o número mínimo de instâncias a usar para o conector. Use um número inteiro entre 2 e 9. A predefinição é 2. Para saber mais sobre o dimensionamento do conetor, consulte o artigo Débito e dimensionamento.
    • MAX: o número máximo de instâncias a usar para o conector. Use um número inteiro entre 3 e 10. A predefinição é 10. Se o tráfego o exigir, o conector é dimensionado horizontalmente para [MAX] instâncias, mas não é dimensionado verticalmente. Para saber mais sobre o dimensionamento do conetor, consulte o artigo Débito e dimensionamento.
    • MACHINE_TYPE: f1-micro, e2-micro ou e2-standard-4. Para saber mais sobre o débito do conetor, incluindo o tipo de máquina e o dimensionamento, consulte o artigo Débito e dimensionamento.

    Para ver mais detalhes e argumentos opcionais, consulte a referência gcloud.

  4. Verifique se o conetor está no estado READY antes de o usar:

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

    Substitua o seguinte:

    • CONNECTOR_NAME: o nome do conetor; este é o nome que especificou no passo anterior
    • REGION: a região do seu conector. Esta é a região que especificou no passo anterior

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

Terraform

Pode 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"
}

Pode usar módulos do Terraform para criar uma rede VPC e uma sub-rede e, em seguida, criar o conetor.

module "test-vpc-module" {
  source       = "terraform-google-modules/network/google"
  version      = "~> 10.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    = "~> 10.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
  ]
}

Ative o Cloud Run para o projeto de serviço

Ative a API Cloud Run para o projeto de serviço. Isto é necessário para adicionar funções do IAM nos passos seguintes e para o projeto de serviço usar o Cloud Run.

Consola

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

    API Cloud Run

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

  3. Clique em Ativar.

gcloud

Execute o seguinte no terminal:

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

Substitua o seguinte:

  • SERVICE_PROJECT_ID: o ID do projeto de serviço

Conceda acesso ao conetor

Conceda acesso ao conetor atribuindo ao agente do serviço do Cloud Run do projeto de serviço a função do IAM utilizador do Acesso a VPC sem servidor no projeto anfitrião.

Consola

  1. Abra a página IAM.

    Aceda ao IAM

  2. Clique no menu pendente do projeto e selecione o projeto anfitrião.

  3. Clique em Adicionar.

  4. No campo Novos membros, introduza o endereço de email 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 o seguinte:

    • SERVICE_PROJECT_NUMBER: o número do projeto associado ao projeto de serviço. Isto é diferente do ID do projeto. Pode encontrar o número do projeto na página Definições do projeto do projeto de serviço naGoogle Cloud consola.
  5. No campo Função, selecione Utilizador do Acesso a VPC sem servidor.

  6. Clique em Guardar.

gcloud

Execute o seguinte no terminal:

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 o seguinte:

  • HOST_PROJECT_ID: o ID do projeto anfitrião da VPC partilhada
  • SERVICE_PROJECT_NUMBER: o número do projeto associado à conta de serviço. Isto é diferente do ID do projeto. Pode encontrar o número do projeto executando o seguinte comando:

    gcloud projects describe SERVICE_PROJECT_ID
    

Torne o conetor detetável

Na política IAM do projeto anfitrião, tem de conceder as seguintes duas funções predefinidas aos diretores que implementam serviços do Cloud Run:

Em alternativa, pode usar funções personalizadas ou outras funções predefinidas que incluam todas as autorizações da função Visualizador do Acesso a VPC sem servidor (vpcaccess.viewer).

Consola

  1. Abra a página IAM.

    Aceda ao IAM

  2. Clique no menu pendente do projeto e selecione o projeto anfitrião.

  3. Clique em Adicionar.

  4. No campo Novos membros, introduza o endereço de email do membro que deve poder ver o conector a partir do projeto de serviço. Pode introduzir vários emails neste campo.

  5. No campo Função, selecione ambas as seguintes funções:

    • Visualizador do Acesso a VPC sem servidor
    • Visualizador da rede de computação
  6. Clique em Guardar.

gcloud

Execute os seguintes 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 o seguinte:

  • HOST_PROJECT_ID: o ID do projeto anfitrião da VPC partilhada
  • PRINCIPAL: o principal que implementa serviços do Cloud Run. Saiba mais sobre a --member flag.

Configure o seu serviço para usar o conetor

Para cada serviço do Cloud Run que requer acesso à sua VPC partilhada, tem de especificar o conetor para o serviço. Pode especificar o conetor através da Google Cloud consola, da CLI do Google Cloud, do ficheiro YAML ou do Terraform quando implementar um novo serviço ou atualizar um serviço existente.

Consola

  1. Na Google Cloud consola, aceda ao Cloud Run:

    Aceda ao Cloud Run

  2. Selecione Serviços no menu e clique em Implementar contentor para configurar um novo serviço. Se estiver a configurar um serviço existente, clique no serviço e, de seguida, em Editar e implementar nova revisão.

  3. Se estiver a configurar um novo serviço, preencha a página de definições iniciais do serviço e, de seguida, clique em Contentores, volumes, rede, segurança para expandir a página de configuração do serviço.

  4. Clique no separador Ligações.

    imagem

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

gcloud

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

    gcloud config set project PROJECT_ID
    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto que contém o recurso do Cloud Run que requer acesso à sua VPC partilhada. Se o recurso do Cloud Run estiver no projeto anfitrião, este é o ID do projeto anfitrião. Se o recurso do Cloud Run estiver num projeto de serviço, este é o ID do projeto de serviço.
  2. Use a flag --vpc-connector.

  • Para serviços existentes:
    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 o seguinte:
    • SERVICE: o nome do seu serviço
    • IMAGE_URL: uma referência à imagem do contentor, por exemplo, us-docker.pkg.dev/cloudrun/container/hello:latest
    • CONNECTOR_NAME: o nome do seu conetor. Use o nome totalmente qualificado quando implementar a partir de um projeto de serviço de VPC partilhada (em oposição ao projeto anfitrião). Por exemplo:
      projects/HOST_PROJECT_ID/locations/CONNECTOR_REGION/connectors/CONNECTOR_NAME
      onde HOST_PROJECT_ID é o ID do projeto de alojamento, CONNECTOR_REGION é a região do seu conetor e CONNECTOR_NAME é o nome que atribuiu ao seu conetor.

YAML

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

gcloud config set project PROJECT_ID

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto que contém o recurso do Cloud Run que requer acesso à sua VPC partilhada. Se o recurso do Cloud Run estiver no projeto anfitrião, este é o ID do projeto anfitrião. Se o recurso do Cloud Run estiver num projeto de serviço, este é o ID do projeto de serviço.
  1. Se estiver a criar um novo serviço, ignore este passo. Se estiver a atualizar um serviço existente, transfira a respetiva configuração YAML:

    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 o seguinte:

    • SERVICE: o nome do seu serviço do Cloud Run.
    • CONNECTOR_NAME: o nome do seu conetor. Use o nome totalmente qualificado quando implementar a partir de um projeto de serviço de VPC partilhada (em oposição ao projeto anfitrião). Por exemplo:
      projects/HOST_PROJECT_ID/locations/CONNECTOR_REGION/connectors/CONNECTOR_NAME
      onde HOST_PROJECT_ID é o ID do projeto de alojamento, CONNECTOR_REGION é a região do seu conetor e CONNECTOR_NAME é o nome que atribuiu ao seu conetor.
    • REVISION com um novo nome de revisão ou elimine-o (se existir). Se fornecer um novo nome de revisão, este tem de cumprir os seguintes critérios:
      • Começa com SERVICE-
      • Contém apenas letras minúsculas, números e -
      • Não termina com um -
      • Não exceder 63 carateres
  3. Substitua o serviço pela respetiva nova configuração através do seguinte comando:

    gcloud run services replace service.yaml

Terraform

Pode usar um recurso do Terraform para criar um serviço e configurá-lo para usar o seu conector.

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

  deletion_protection = false # set to "true" in production

  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"
    }
  }
}

Passos seguintes