Criar uma instância segura de notebooks gerenciados pelo usuário em uma rede VPC


Este tutorial é destinado a cientistas de dados, pesquisadores e administradores de rede empresariais. Ele mostra como proteger uma instância de notebooks gerenciados pelo usuário criando-a em uma rede de nuvem privada virtual (VPC).

Uma rede VPC é uma versão virtual de uma rede física, implementada dentro da rede de produção do Google. É uma rede particular, com 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 a elas de outras redes e da Internet.

A rede VPC neste tutorial é uma rede independente. Entretanto, é possível compartilhar uma rede VPC de um projeto (chamado de projeto host) com outros projetos na sua organização do Google Cloud. Para saber mais sobre qual tipo de rede VPC usar, consulte Rede VPC única e VPC compartilhada.

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

  • Sua instância de notebooks gerenciados pelo usuário não tem um endereço IP externo.
  • A instância tem acesso à Internet de saída por meio de um Cloud Router regional e do gateway do Cloud NAT para que você possa instalar pacotes de software ou outras dependências. O Cloud NAT permite conexões de saída e as respostas de entrada para essas conexões. Ele não permite solicitações de entrada não solicitadas da Internet.
  • A instância usa o Acesso privado do Google para acessar os endereços IP externos de serviços e APIs do Google.

O tutorial também mostra como fazer o seguinte:

  • Crie um script de pós-inicialização para clonar automaticamente um repositório do GitHub na instância recém-criada de notebooks gerenciados pelo usuário.
  • Use o Cloud Monitoring para monitorar a instância de notebooks gerenciados pelo usuário.
  • Use a API Compute Engine para iniciar e interromper a instância automaticamente para otimizar os custos.

Diagrama de arquitetura de uma instância de notebook gerenciado pelo usuário em uma rede VPC.

Objetivos

  • Crie uma rede VPC e adicione uma sub-rede que tenha o Acesso privado do Google ativado.
  • Crie um Cloud Router e o Cloud NAT para a rede VPC.
  • Crie uma instância de notebooks gerenciados pelo usuário na sub-rede usando um script de pós-inicialização que clona o repositório do GitHub da IA generativa do Google Cloud.
  • Ative o Cloud Monitoring para a instância.
  • Crie uma programação de instância de VM e anexe-a à instância.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.

Antes de começar

  1. No console do Google Cloud, acesse a página do seletor de projetos.

    Acessar o seletor de projetos

  2. Selecione ou crie um projeto do Google Cloud.

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Abra o Cloud Shell para executar os comandos listados neste tutorial. O Cloud Shell é um ambiente shell interativo para o Google Cloud que permite gerenciar projetos e recursos a partir do navegador da Web.
  5. Acesse o Cloud Shell
  6. No Cloud Shell, defina o projeto atual como o ID do projeto do Google Cloud e armazene o mesmo ID do projeto na variável de shell projectid:
      projectid="PROJECT_ID"
      gcloud config set project ${projectid}
    Substitua PROJECT_ID pela ID do seu projeto. Se necessário, localize o ID do projeto no console do Google Cloud. Para mais informações, consulte Encontrar o ID do projeto.
  7. Ative as APIs IAM, Compute Engine, Notebooks, Cloud Storage, and Vertex AI:

    gcloud services enable iam.googleapis.com  compute.googleapis.com notebooks.googleapis.com storage.googleapis.com aiplatform.googleapis.com
  8. Atribua os papéis à sua Conta do Google. Execute uma vez o seguinte comando para cada um dos seguintes papéis do IAM: roles/compute.networkAdmin, roles/compute.securityAdmin, roles/compute.instanceAdmin, roles/notebooks.admin, roles/resourcemanager.projectIamAdmin, roles/iam.serviceAccountAdmin, roles/iam.serviceAccountUser, roles/storage.Admin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
    • Substitua PROJECT_ID pela ID do seu projeto.
    • Substitua EMAIL_ADDRESS pelo seu endereço de e-mail.
    • Substitua ROLE por cada papel individual.

Criar e configurar uma VPC independente

  1. Crie uma rede VPC chamada securevertex-vpc:

    gcloud compute networks create securevertex-vpc --subnet-mode=custom
    
  2. Crie uma sub-rede chamada 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, você pode fornecer um valor diferente para o parâmetro --range. No entanto, o comprimento mínimo do prefixo de um único notebook é 29. Para mais informações, consulte Intervalos de sub-rede IPv4.

  3. Crie um Cloud Router regional chamado cloud-router-us-central1:

    gcloud compute routers create cloud-router-us-central1 --network securevertex-vpc --region us-central1
    
  4. Crie um gateway regional do Cloud NAT chamado 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 bucket do Cloud Storage

  1. Crie o bucket do Cloud Storage:

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

    Substitua BUCKET_NAME por um nome de bucket exclusivo.

  2. Defina a variável do shell BUCKET_NAME e verifique se ela foi inserida corretamente:

    BUCKET_NAME=BUCKET_NAME
    echo $BUCKET_NAME
    

    Substitua BUCKET_NAME pelo nome do bucket.

Criar e fazer upload de um script pós-inicialização

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

  2. Cole o script de shell a seguir no arquivo:

    #! /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 http://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. Salve o arquivo.

  4. Faça upload de um arquivo no bucket do Cloud Storage:

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

Criar uma conta de serviço personalizada

Ao criar uma instância de notebooks gerenciados pelo usuário, recomendamos que você desmarque a caixa de seleção Usar conta de serviço padrão do Compute Engine e especifique uma conta de serviço personalizada. A conta de serviço padrão do Compute Engine (e, portanto, qualquer pessoa que você especificar como usuário da instância) recebe o papel de Editor (roles/editor) no projeto. Para desativar esse comportamento, desative as concessões automáticas de papéis para contas de serviço padrão.

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

    gcloud iam service-accounts create user-managed-notebook-sa \
    --display-name="user-managed-notebook-sa"
    
  2. Atribua o papel do IAM de Leitor de objetos do Storage à 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 o papel do IAM de usuário da 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"
    

Criar uma instância de notebooks gerenciados pelo usuário

  1. No Console do Google Cloud, acesse a página Notebooks gerenciados pelo usuário.

    Acesse Notebooks gerenciados pelo usuário

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

    A página Criar instância é aberta.

  3. Na página Criar instância, na seção Detalhes, forneça as seguintes informações da nova instância e clique em Continuar:

    • Nome: forneça um nome para a nova instância ou aceite o padrão.
    • Região: selecione us-central1.
    • Zona: selecione us-central1-a.
  4. Na seção Ambiente, forneça as informações a seguir e clique em Continuar:

    • Script de pós-inicialização: clique em Procurar, clique duas vezes no arquivo poststartup.sh, clique mais uma vez e clique em Selecionar.
  5. Na seção Tipo de máquina, forneça as informações a seguir e clique em Continuar:

    • VM protegida: marque as seguintes caixas de seleção:

      • inicialização segura;
      • Módulo de plataforma confiável e virtual (vTPM)
      • monitoramento de integridade
  6. Na seção Discos, verifique se a Chave de criptografia gerenciada pelo Google está selecionada e clique em Continuar:

  7. Na seção Rede, forneça as informações a seguir e clique em Continuar:

    • Rede: selecione Rede neste projeto e conclua as etapas a seguir:

      1. No campo Rede, selecione securevertex-vpc.

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

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

      4. Marque a caixa de seleção Permitir acesso ao proxy.

  8. Na seção IAM e segurança, forneça as informações a seguir e clique em Continuar:

    • IAM e segurança: para conceder a um único usuário acesso à interface do JupyterLab da instância, conclua as etapas a seguir:

      1. Selecione Usuário único.
      2. No campo E-mail do usuário, insira o endereço de e-mail de uma única conta de usuário. Se você estiver criando a instância para outra pessoa, serão aplicadas as seguintes condições:
        • Você (o criador da instância) não tem acesso à interface do JupyterLab da instância. No entanto, você ainda controla a instância e pode iniciá-la, interrompê-la ou excluí-la.
        • Depois de criar a instância, é necessário conceder ao usuário o papel de usuário da conta de serviço (roles/iam.serviceAccountUser) na conta de serviço da instância. Consulte Opcional: conceder o papel de usuário da conta de serviço ao usuário da instância.
      3. Desmarque a caixa de seleção Usar conta de serviço padrão do Compute Engine. Essa etapa é importante porque a conta de serviço padrão do Compute Engine (e, portanto, o único usuário que você acabou de especificar) recebe o papel de Editor (roles/editor) no projeto.
      4. No campo E-mail da conta de serviço, insira user-managed-notebook-sa@$projectid.iam.gserviceaccount.com. (Esse é o endereço de e-mail da conta de serviço personalizada que você criou anteriormente.) Essa conta de serviço tem permissões limitadas.

        Para saber mais sobre como conceder acesso, consulte Gerenciar o acesso à interface do JupyterLab de uma instância de notebooks gerenciados pelo usuário.

    • Opções de segurança: desmarque a caixa de seleção a seguir:

      • Acesso raiz à instância

      Marque a caixa de seleção a seguir:

      • O nbconvert nbconvert permite que os usuários exportem e façam o download de um arquivo de notebook como um tipo de arquivo diferente, como HTML, PDF ou LaTeX. Essa configuração é exigida por alguns dos notebooks no repositório do GitHub da IA generativa do Google Cloud.

      Desmarque a caixa de seleção a seguir:

      • Permitir downloads do arquivo

      Marque a caixa de seleção a seguir, a menos que você esteja em um ambiente de produção:

      • Acesso ao terminal Isso permite o acesso do terminal à sua instância a partir da interface do usuário do JupyterLab.
  9. Na seção Integridade do sistema, selecione Upgrade automático do ambiente e forneça o seguinte:

    • Em Relatórios, marque as seguintes caixas de seleção:

      • Relatar a integridade do sistema
      • Relatar métricas personalizadas para o Cloud Monitoring
      • Instalar o Cloud Monitoring
      • Informar o status de DNS dos domínios obrigatórios do Google
  10. Clique em Criar.

Opcional: conceder o papel de usuário da conta de serviço ao usuário da instância

Se você estiver criando a instância de notebooks gerenciados pelo usuário para outro usuário, conceda a eles o papel de usuário da conta de serviço (roles/iam.serviceAccountUser) na conta de serviço personalizada user-managed-notebook-sa da seguinte maneira:

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 e-mail do usuário

Verifique se a instância de notebooks gerenciados pelo usuário foi criada

O Vertex AI Workbench cria uma nova instância de notebooks gerenciados pelo usuário com base nas propriedades especificadas.

Quando a instância estiver pronta para uso, o Vertex AI Workbench ativa um link Abrir JupyterLab. Esse link só pode ser acessado pelo único usuário que você especificou no momento da criação da instância.

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

  1. No Console do Google Cloud, acesse a página Notebooks gerenciados pelo usuário.

    Acesse Notebooks gerenciados pelo usuário

  2. Na lista de instâncias de notebooks gerenciados pelo usuário, clique no link Abrir JupyterLab referente à instância que você criou.

    Na lista de pastas, você verá uma pasta generative-ai. Essa pasta contém o repositório clonado do GitHub.

Monitorar o status de integridade pelo Monitoring

É possível monitorar as métricas do sistema e do aplicativo nas instâncias de notebooks gerenciados pelo usuário usando o console do Google Cloud. Para saber mais sobre o monitoramento de instâncias e sobre a criação de métricas personalizadas, consulte Monitorar o status de integridade.

  1. No Console do Google Cloud, acesse a página Notebooks gerenciados pelo usuário.

    Acesse Notebooks gerenciados pelo usuário

  2. Clique no nome da instância de notebooks gerenciados pelo usuário para ver as métricas.

  3. Na página Detalhes do notebook, clique na guia Monitoramento. Revise a Utilização da CPU e os Bytes de rede da sua instância de notebook. Para saber como interpretar essas métricas, consulte Analisar as métricas de recursos.

    Se você acabou de criar a instância, não verá nenhum dado imediatamente. Aguarde alguns minutos e atualize a guia do console.

Criar uma programação de instância de VM para sua instância de notebooks gerenciados pelo usuário

Como uma instância de notebooks gerenciados pelo usuário é uma instância de VM do Compute Engine, é possível usar as APIs Compute Engine para criar uma programação de instâncias de VM para ela.

Use uma programação de instância de VM para iniciar e interromper a instância de notebooks gerenciados pelo usuário. Durante as horas em que a instância é interrompida, você paga apenas pelos custos do Cloud Storage.

É possível anexar uma programação de instância a qualquer instância de VM na mesma região, para que você possa usar a mesma programação de instância para controlar todas as instâncias de notebooks gerenciados pelo usuário na região.

Para saber mais sobre as programações de instâncias de VM, consulte Como programar uma instância de VM para iniciar e parar.

Criar um papel personalizado do IAM

Como prática recomendada de segurança, recomendamos criar um papel personalizado do IAM que tenha apenas as seguintes permissões e atribuí-lo à conta de serviço padrão do Compute Engine:

  • compute.instances.start
  • compute.instances.stop
  1. No Cloud Shell, crie um papel personalizado chamado Vm_Scheduler e inclua as permissões necessárias:

    Acesse o 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 o papel personalizado:

    gcloud iam roles describe Vm_Scheduler --project=$projectid
    

Atribuir o papel à conta de serviço padrão do Compute Engine

Para conceder à conta de serviço padrão do Compute Engine permissão para iniciar e interromper as instâncias de notebooks gerenciados pelo usuário, é preciso atribuir o papel personalizado Vm_Scheduler a ela.

A conta de serviço padrão do Compute Engine do projeto tem o seguinte endereço de e-mail: [email protected], em que PROJECT_NUMBER é o número do 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 o papel personalizado à conta de serviço padrão:

    gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:[email protected]" --role="projects/$projectid/roles/Vm_Scheduler"
    

Criar e anexar a programação

Para criar uma programação de instância que inicie sua instância de notebooks gerenciados pelo usuário às 7h e interrompê-las às 18h:

  1. Crie uma programação de início e parada chamada 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 da IANA com base na localização para essa programação de instância, por exemplo, America/Chicago. Se omitido, o valor padrão UTC será usado. Para mais informações, consulte o fuso horário.

  2. Identifique o nome da sua instância de notebooks gerenciados pelo usuário executando o comando a seguir e observando o valor NAME que ele retorna:

    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 de notebooks gerenciados pelo usuário.

  4. Anexe a programação da instância à instância de notebooks gerenciados pelo usuário:

    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
    

Para verificar se a programação da instância foi executada com sucesso, confira os registros de auditoria do Compute Engine da política de recursos da programação da instância e da instância de VM anexada. Talvez seja necessário aguardar até 15 minutos após o tempo programado para cada operação.

Limpeza

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

É possível excluir os recursos individuais no projeto da seguinte maneira:

  1. No Console do Google Cloud, acesse a página Notebooks gerenciados pelo usuário.

    Acesse Notebooks gerenciados pelo usuário

  2. Selecione sua instância de notebook gerenciado pelo usuário.

  3. Clique em Excluir.

  4. No Cloud Shell, exclua os recursos individuais restantes executando os comandos a seguir.

    Acesse o 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:[email protected]" --role="projects/$projectid/roles/Vm_Scheduler"
    
    gcloud iam roles delete Vm_Scheduler --project=$projectid
    
    gcloud compute networks delete securevertex-vpc --quiet
    

A seguir