Crie uma instância de notebooks geridos pelo utilizador segura numa rede VPC

Este tutorial destina-se a cientistas de dados empresariais, investigadores e administradores de rede. Mostra como proteger uma instância de blocos de notas gerida pelo utilizador criando-a numa rede da nuvem virtual privada (VPC).

Uma rede VPC é uma versão virtual de uma rede física que é implementada na rede de produção da Google. É uma rede privada, com os seus próprios endereços IP privados, sub-redes e gateways de rede. Na empresa, as redes VPC são usadas para proteger dados e instâncias controlando o acesso aos mesmos a partir de outras redes e da Internet.

A rede VPC neste tutorial é uma rede autónoma. No entanto, pode partilhar uma rede VPC de um projeto (denominado projeto anfitrião) com outros projetos na sua Google Cloud organização. Para saber mais sobre o tipo de rede VPC a usar, consulte os artigos Rede VPC única e VPC partilhada.

Seguindo as práticas recomendadas de segurança de rede, a rede VPC neste tutorial usa uma combinação de Cloud Router, Cloud NAT e Acesso privado do Google para proteger a instância das seguintes formas:

  • A instância de blocos de notas gerida pelo utilizador não tem um endereço IP externo.
  • A instância tem acesso à Internet de saída através de um Cloud Router regional e de um gateway Cloud NAT para que possa instalar pacotes de software ou outras dependências. O Cloud NAT permite ligações de saída e as respostas de entrada a essas ligações. Não permite pedidos de entrada não solicitados da Internet.
  • A instância usa o acesso privado à Google para alcançar os endereços IP externos das APIs e dos serviços Google.

O tutorial também mostra como fazer o seguinte:

  • Crie um script de pós-arranque para clonar automaticamente um repositório do GitHub na instância de blocos de notas geridos pelo utilizador recém-criada.
  • Use o Cloud Monitoring para monitorizar a instância de blocos de notas geridos pelo utilizador.
  • Use a API Compute Engine para iniciar e parar a instância automaticamente para otimizar os custos.

Diagrama de arquitetura de uma instância de bloco de notas gerida pelo utilizador numa rede VPC.

Objetivos

  • Crie uma rede VPC e adicione uma sub-rede com o acesso privado à Google ativado.
  • Crie um Cloud Router e um Cloud NAT para a rede VPC.
  • Crie uma instância de notebooks gerida pelo utilizador na sub-rede, usando um script de pós-início que clone o repositório do GitHub de Google Cloud IA generativa.
  • Ative o Cloud Monitoring para a instância.
  • Crie um agendamento de instâncias de VM e anexe-o à instância.

Custos

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

Antes de começar

  1. In the Google Cloud console, go to the project selector page.

    Go to project selector

  2. Select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
  3. Verify that billing is enabled for your Google Cloud project.

  4. Abra o Cloud Shell para executar os comandos indicados neste tutorial. O Cloud Shell é um ambiente de shell interativo para Google Cloud que lhe permite gerir os seus projetos e recursos a partir do navegador de Internet.
  5. Aceda ao Cloud Shell
  6. No Cloud Shell, defina o projeto atual para o seu Google Cloud ID do projeto e armazene o mesmo ID do projeto na variável do shell projectid:
      projectid="PROJECT_ID"
      gcloud config set project ${projectid}
    Substitua PROJECT_ID pelo ID do seu projeto. Se necessário, pode localizar o ID do projeto na Google Cloud consola. Para mais informações, consulte o artigo Encontre o ID do seu projeto.
  7. Enable the IAM, Compute Engine, Notebooks, Cloud Storage, and Vertex AI APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  8. Make sure that you have the following role or roles on the project: roles/compute.networkAdmin, roles/compute.securityAdmin, roles/compute.instanceAdmin, roles/notebooks.admin, roles/resourcemanager.projectIamAdmin, roles/iam.serviceAccountAdmin, roles/iam.serviceAccountUser, roles/storage.Admin

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      Aceder ao IAM
    2. Selecione o projeto.
    3. Clique em Conceder acesso.
    4. No campo Novos responsáveis, introduza o identificador do utilizador. Normalmente, este é o endereço de email de uma Conta Google.

    5. Na lista Selecionar uma função, selecione uma função.
    6. Para conceder funções adicionais, clique em Adicionar outra função e adicione cada função adicional.
    7. Clique em Guardar.

Crie e configure uma VPC autónoma

  1. Crie uma rede de VPC com o nome securevertex-vpc:

    gcloud compute networks create securevertex-vpc --subnet-mode=custom
    
  2. Crie uma sub-rede denominada securevertex-subnet-a, com um intervalo IPv4 principal de 10.10.10.0/29:

    gcloud compute networks subnets create securevertex-subnet-a --range=10.10.10.0/29 --network=securevertex-vpc --region=us-central1 --enable-private-ip-google-access
    

    Se quiser, pode fornecer um valor diferente para o parâmetro --range. No entanto, o comprimento mínimo do prefixo para um único bloco de notas é de 29. Para mais informações, consulte o artigo Intervalos de sub-redes IPv4.

  3. Crie um Cloud Router regional com o nome cloud-router-us-central1:

    gcloud compute routers create cloud-router-us-central1 --network securevertex-vpc --region us-central1
    
  4. Crie um gateway do Cloud NAT regional com o nome cloud-nat-us-central1:

    gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-us-central1 --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1
    

Crie um contentor do Cloud Storage

  1. Crie o contentor do Cloud Storage:

    gcloud storage buckets create --location=us-central1 --uniform-bucket-level-access gs://BUCKET_NAME
    

    Substitua BUCKET_NAME por um nome de contentor exclusivo.

  2. Defina a variável de shell BUCKET_NAME e verifique se foi introduzida corretamente:

    BUCKET_NAME=BUCKET_NAME
    echo $BUCKET_NAME
    

    Substitua BUCKET_NAME pelo nome do contentor.

Crie e carregue um script de pós-inicialização

  1. Para criar o script, use um editor de texto, como o vi ou o nano, para criar um ficheiro denominado poststartup.sh.

  2. Cole o seguinte script de shell no ficheiro:

    #! /bin/bash
    echo "Current user: id" >> /tmp/notebook_config.log 2>&1
    echo "Changing dir to /home/jupyter" >> /tmp/notebook_config.log 2>&1
    cd /home/jupyter
    echo "Cloning generative-ai from github" >> /tmp/notebook_config.log 2>&1
    su - jupyter -c "git clone https://github.com/GoogleCloudPlatform/generative-ai.git" >> /tmp/notebook_config.log 2>&1
    echo "Current user: id" >> /tmp/notebook_config.log 2>&1
    echo "Installing python packages" >> /tmp/notebook_config.log 2&1
    su - jupyter -c "pip install --upgrade --no-warn-conflicts --no-warn-script-location --user \
         google-cloud-bigquery \
         google-cloud-pipeline-components \
         google-cloud-aiplatform \
         seaborn \
         kfp" >> /tmp/notebook_config.log 2>&1
    
  3. Guarde o ficheiro.

  4. Carregue o ficheiro para o seu contentor do Cloud Storage:

    gcloud storage cp poststartup.sh gs://$BUCKET_NAME
    

Crie uma conta de serviço personalizada

Quando cria uma instância de blocos de notas gerida pelo utilizador, recomendamos vivamente que desmarque a caixa de verificação Usar conta de serviço predefinida do Compute Engine e especifique uma conta de serviço personalizada. Se a sua organização não aplicar a restrição da política da organização iam.automaticIamGrantsForDefaultServiceAccounts, a conta de serviço predefinida do Compute Engine (e, por conseguinte, qualquer pessoa que especifique como utilizador da instância) recebe a função de editor (roles/editor) no seu projeto. Para desativar este comportamento, consulte o artigo Desative as concessões automáticas de funções às contas de serviço predefinidas.

  1. Crie uma conta de serviço personalizada com o nome user-managed-notebook-sa:

    gcloud iam service-accounts create user-managed-notebook-sa \
    --display-name="user-managed-notebook-sa" 
    
  2. Atribua a função IAM Storage Object Viewer à conta de serviço:

    gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.objectViewer"
    
  3. Atribua a função IAM de utilizador do Vertex AI à conta de serviço:

    gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"
    

Crie uma instância de notebooks geridos pelo utilizador

  1. Na Google Cloud consola, aceda à página Blocos de notas geridos pelo utilizador.

    Aceda aos blocos de notas geridos pelo utilizador

  2. Clique em  Criar novo e, de seguida, selecione Opções avançadas.

    É apresentada a página Criar instância.

  3. Na página Criar instância, na secção Detalhes, faculte as seguintes informações para a nova instância e, de seguida, clique em Continuar:

    • Nome: indique um nome para a nova instância ou aceite o predefinido.
    • Região: selecione us-central1.
    • Zona: selecione us-central1-a.
  4. Na secção Ambiente, indique o seguinte e, de seguida, clique em Continuar:

    • Script de pós-inicialização: clique em Procurar, clique duas vezes no ficheiro poststartup.sh, clique mais uma vez e, em seguida, clique em Selecionar.
  5. Na secção Tipo de máquina, indique o seguinte e, de seguida, clique em Continuar:

    • VM protegida: selecione as seguintes caixas de verificação:

      • Arranque seguro
      • Trusted Platform Module virtual (vTPM)
      • Monitorização da integridade
  6. Na secção Discos, certifique-se de que Google-managed encryption key está selecionado e, de seguida, clique em Continuar:

  7. Na secção Rede, indique o seguinte e, de seguida, clique em Continuar:

    • Redes: selecione Rede neste projeto e conclua os seguintes passos:

      1. No campo Rede, selecione securevertex-vpc.

      2. No campo Sub-rede, selecione securevertex-subnet-a.

      3. Desmarque a caixa de verificação Atribuir endereço IP externo. A não atribuição de um endereço IP externo impede que a instância receba comunicação não solicitada da Internet ou de outras redes de VPC.

      4. Selecione a caixa de verificação Permitir acesso por proxy.

  8. Na secção IAM e segurança, indique o seguinte e, de seguida, clique em Continuar:

    • IAM e segurança: para conceder a um único utilizador acesso à interface do JupyterLab da instância, conclua os seguintes passos:

      1. Selecione Utilizador único.
      2. No campo Email do utilizador, introduza o endereço de email de uma única conta de utilizador. Se estiver a criar a instância para outra pessoa, aplicam-se as seguintes condições:
        • O criador da instância não tem acesso à interface do JupyterLab da instância. No entanto, continua a controlar a instância e pode iniciá-la, pará-la ou eliminá-la.
        • Depois de criar a instância, tem de conceder ao utilizador a função Utilizador da conta de serviço (roles/iam.serviceAccountUser) na conta de serviço da instância. Consulte a secção Opcional: conceda a função Utilizador da conta de serviço ao utilizador da instância.
      3. Desmarque a caixa de verificação Usar conta de serviço predefinida do Compute Engine. Este passo é importante porque a conta de serviço predefinida do Compute Engine (e, por conseguinte, o único utilizador que acabou de especificar) pode ter a função de editor (roles/editor) no seu projeto.
      4. No campo Email da conta de serviço, introduza user-managed-notebook-sa@$projectid.iam.gserviceaccount.com. (Este é o endereço de email da conta de serviço personalizado que criou anteriormente.) Esta conta de serviço tem autorizações limitadas.

        Para saber como conceder acesso, consulte o artigo Faça a gestão do acesso à interface do JupyterLab de uma instância de blocos de notas gerida pelo utilizador.

    • Opções de segurança: desmarque a seguinte caixa de verificação:

      • Acesso root à instância

      Selecione a seguinte caixa de verificação:

      • O nbconvert nbconvert permite aos utilizadores exportar e transferir um ficheiro de bloco de notas como um tipo de ficheiro diferente, como HTML, PDF ou LaTeX. Esta definição é necessária para alguns dos blocos de notas no repositório do GitHub de Google Cloud IA generativa.

      Desmarque a seguinte caixa de verificação:

      • Transferência de ficheiros

      Selecione a seguinte caixa de verificação, a menos que esteja num ambiente de produção:

      • Acesso ao terminal Isto permite o acesso ao terminal à sua instância a partir da interface do utilizador do JupyterLab.
  9. Na secção Estado de funcionamento do sistema, selecione Atualização automática do ambiente e faculte o seguinte:

    • Em Relatórios, selecione as seguintes caixas de verificação:

      • Comunique o estado do sistema
      • Comunique métricas personalizadas ao Cloud Monitoring
      • Instale o Cloud Monitoring
      • Comunique o estado do DNS para domínios Google necessários
  10. Clique em Criar.

Opcional: conceda a função de utilizador da conta de serviço ao utilizador da instância

Se estiver a criar a instância de blocos de notas geridos pelo utilizador para outro utilizador, tem de lhe conceder a função Utilizador da conta de serviço (roles/iam.serviceAccountUser) na user-managed-notebook-saconta de serviço personalizada da seguinte forma:

gcloud iam service-accounts add-iam-policy-binding \
    user-managed-notebook-sa@PROJECT_ID.iam.gserviceaccount.com \
    --member="user:USER_EMAIL" \
    --role="roles/iam.serviceAccountUser"

Substitua os seguintes valores:

  • PROJECT_ID: o ID do projeto
  • USER_EMAIL: o endereço de email do utilizador

Verifique se a instância de blocos de notas gerida pelo utilizador foi criada

O Vertex AI Workbench cria uma instância de blocos de notas geridos pelo utilizador com base nas propriedades especificadas e inicia automaticamente a instância.

Quando a instância estiver pronta para utilização, o Vertex AI Workbench ativa um link Abrir JupyterLab. Este link só está acessível ao utilizador que especificou no momento da criação da instância.

Abra a instância no JupyterLab e verifique se o repositório do GitHub Google Cloud IA generativa clonado está presente.

  1. Na Google Cloud consola, aceda à página Blocos de notas geridos pelo utilizador.

    Aceda aos blocos de notas geridos pelo utilizador

  2. Na lista de instâncias de blocos de notas geridas pelo utilizador, clique no link Abrir JupyterLab para a instância que criou.

    Na lista de pastas, é apresentada uma pasta generative-ai. Esta pasta contém o repositório do GitHub clonado.

Monitorize o estado de saúde através da funcionalidade Monitorização

Pode monitorizar as métricas do sistema e das aplicações para as instâncias de blocos de notas geridas pelo utilizador através daGoogle Cloud consola. Para saber mais sobre a monitorização de instâncias e sobre a criação de métricas personalizadas, consulte o artigo Monitorize o estado de funcionamento.

  1. Na Google Cloud consola, aceda à página Blocos de notas geridos pelo utilizador.

    Aceda aos blocos de notas geridos pelo utilizador

  2. Clique no nome da instância de blocos de notas geridos pelo utilizador para a qual quer ver as métricas.

  3. Na página Detalhes do bloco de notas, clique no separador Monitorização. Reveja a utilização da CPU e os bytes de rede da instância do bloco de notas. Para saber como interpretar estas métricas, consulte o artigo Reveja as métricas de recursos.

    Se acabou de criar a instância, não vê dados imediatamente. Aguarde alguns minutos e atualize o separador da consola.

Crie um horário de instância de VM para a instância de notebooks geridos pelo utilizador

Uma vez que uma instância de blocos de notas gerida pelo utilizador é uma instância de VM do Compute Engine, pode usar as APIs Compute Engine para criar uma programação de instâncias de VM para a mesma.

Use uma agenda de instâncias de VM para iniciar e parar a instância de blocos de notas geridos pelo utilizador. Durante as horas em que a instância está parada, paga apenas os custos do Cloud Storage.

Pode anexar uma programação de instâncias a qualquer instância de VM que esteja na mesma região, pelo que pode usar a mesma programação de instâncias para controlar todas as instâncias de blocos de notas geridas pelo utilizador na região.

Para saber mais sobre as programações de instâncias de VM, consulte o artigo Agendar o início e a paragem de uma instância de VM.

Crie uma função do IAM personalizada

Como prática recomendada de segurança, recomendamos que crie uma função do IAM personalizada que tenha apenas as seguintes autorizações e a atribua à conta de serviço predefinida do Compute Engine:

  • compute.instances.start
  • compute.instances.stop
  1. No Cloud Shell, crie uma função personalizada denominada Vm_Scheduler e inclua as autorizações necessárias:

    Aceda ao Cloud Shell

    gcloud iam roles create Vm_Scheduler --project=$projectid \
    --title=vm-scheduler-notebooks \
    --permissions="compute.instances.start,compute.instances.stop" --stage=ga 
    
  2. Descreva a função personalizada:

    gcloud iam roles describe Vm_Scheduler --project=$projectid
    

Atribua a função à conta de serviço predefinida do Compute Engine

Para conceder à conta de serviço predefinida do Compute Engine autorização para iniciar e parar as instâncias de blocos de notas geridas pelo utilizador, tem de lhe atribuir a função personalizada Vm_Scheduler.

A conta de serviço predefinida do Compute Engine para o seu projeto tem o seguinte endereço de email: PROJECT_NUMBER-compute@developer.gserviceaccount.com, em que PROJECT_NUMBER é o número do seu projeto.

  1. Identifique o número do projeto e armazene-o na variável de shell project_number:

    project_number=$(gcloud projects describe $projectid --format 'get(projectNumber)')
    echo $project_number
    
  2. Atribua a função personalizada à conta de serviço predefinida:

    gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:$project_number-compute@developer.gserviceaccount.com" --role="projects/$projectid/roles/Vm_Scheduler"
    

Crie e anexe a programação

Para criar um horário de instância que inicie a instância de blocos de notas geridos pelo utilizador às 07:00 e a pare às 18:00:

  1. Crie um horário de início e fim denominado optimize-notebooks:

    gcloud compute resource-policies create instance-schedule optimize-notebooks \
    --region=us-central1 \
    --vm-start-schedule='0 7 * * *' \
    --vm-stop-schedule='0 18 * * *' \
    --timezone=TIME_ZONE
    

    Substitua TIME_ZONE pelo fuso horário IANA baseado na localização para este horário da instância, por exemplo, America/Chicago. Se for omitido, é usado o valor predefinido UTC. Para mais informações, consulte o artigo sobre o fuso horário.

  2. Identifique o nome da instância dos blocos de notas geridos pelo utilizador executando o seguinte comando e reparando no valor NAME que devolve:

    gcloud compute instances list
    
  3. Armazene o nome na variável de shell notebook_vm:

    notebook_vm=NOTEBOOK_VM_NAME
    echo $notebook_vm
    

    Substitua NOTEBOOK_VM_NAME pelo nome da instância dos blocos de notas geridos pelo utilizador.

  4. Anexe o horário da instância à instância de blocos de notas gerida pelo utilizador:

    gcloud compute instances add-resource-policies $notebook_vm \
      --resource-policies=optimize-notebooks \
      --zone=us-central1-a
    
  5. Descreva a programação da instância:

    gcloud compute resource-policies describe optimize-notebooks \
      --region=us-central1
    

Pode verificar se a programação da instância é executada com êxito consultando os registos de auditoria do Compute Engine relativos à política de recursos da programação da instância e à instância da VM anexada. Pode ter de aguardar até 15 minutos após a hora agendada para cada operação.

Limpar

Para evitar incorrer em custos na sua Google Cloud conta pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.

Pode eliminar os recursos individuais no projeto da seguinte forma:

  1. Na Google Cloud consola, aceda à página Blocos de notas geridos pelo utilizador.

    Aceda aos blocos de notas geridos pelo utilizador

  2. Selecione a instância de bloco de notas gerida pelo utilizador.

  3. Clique em Eliminar.

  4. No Cloud Shell, elimine os recursos individuais restantes executando os seguintes comandos.

    Aceda ao Cloud Shell

    gcloud compute routers delete cloud-router-us-central1 --region=us-central1 --quiet
    
    gcloud compute routers nats delete cloud-nat-us-central1 --region=us-central1 --router=cloud-router-us-central1 --quiet
    
    gcloud compute instances remove-resource-policies $notebook_vm \
      --resource-policies=optimize-notebooks \
      --zone=us-central1-a --quiet
    
    gcloud compute resource-policies delete optimize-notebooks --region=us-central1 --quiet
    
    gcloud compute instances delete $notebook_vm --zone=us-central1-a --quiet
    
    gcloud compute networks subnets delete securevertex-subnet-a --region=us-central1 --quiet 
    
    gcloud iam service-accounts delete user-managed-notebook-sa@$projectid.iam.gserviceaccount.com --quiet 
    
    gcloud projects remove-iam-policy-binding $projectid --member="serviceAccount:$project_number-compute@developer.gserviceaccount.com" --role="projects/$projectid/roles/Vm_Scheduler"
    
    gcloud iam roles delete Vm_Scheduler --project=$projectid
    
    gcloud compute networks delete securevertex-vpc --quiet 
    

O que se segue?