Creare un'istanza di notebook gestiti dall'utente sicura in una rete VPC

Questo tutorial è rivolto a data scientist, ricercatori e amministratori di rete aziendali. Mostra come proteggere un'istanza di notebook gestiti dall'utente creandola in una rete Virtual Private Cloud (VPC).

Una rete VPC è una versione virtuale di una rete fisica implementata all'interno della rete di produzione di Google. Si tratta di una rete privata, con indirizzi IP privati, subnet e gateway di rete propri. Nell'azienda, le reti VPC vengono utilizzate per proteggere dati e istanze controllando l'accesso da altre reti e da internet.

La rete VPC in questo tutorial è una rete autonoma. Tuttavia, puoi condividere una rete VPC da un progetto (chiamato progetto host) con altri progetti nella tua organizzazione Google Cloud . Per scoprire di più su quale tipo di rete VPC utilizzare, consulta Rete VPC singola e VPC condiviso.

Seguendo le best practice per la sicurezza di rete, la rete VPC in questo tutorial utilizza una combinazione di Cloud Router, Cloud NAT e Private Google Access per proteggere l'istanza nei seguenti modi:

  • L'istanza di blocchi note gestiti dall'utente non ha un indirizzo IP esterno.
  • L'istanza ha accesso a internet in uscita tramite un router Cloud regionale e un gateway Cloud NAT in modo da poter installare pacchetti software o altre dipendenze. Cloud NAT consente le connessioni in uscita e le risposte in entrata a queste connessioni. Non consente richieste in entrata non richieste da internet.
  • L'istanza utilizza l'accesso privato Google per raggiungere gli indirizzi IP esterni delle API e dei servizi Google.

Il tutorial mostra anche come:

  • Crea uno script post-avvio per clonare automaticamente un repository GitHub nella nuova istanza di blocchi note gestiti dall'utente.
  • Utilizza Cloud Monitoring per monitorare l'istanza di blocchi note gestiti dall'utente.
  • Utilizza l'API Compute Engine per avviare e arrestare automaticamente l'istanza e ottimizzare i costi.

Diagramma dell'architettura di un'istanza di notebook gestito dall'utente in una rete VPC.

Crea e configura un VPC autonomo

  1. Crea una rete VPC denominata securevertex-vpc:

    gcloud compute networks create securevertex-vpc --subnet-mode=custom
    
  2. Crea una subnet denominata securevertex-subnet-a con un intervallo IPv4 primario di 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 vuoi, puoi fornire un valore diverso per il parametro --range. Tuttavia, la lunghezza minima del prefisso per un singolo notebook è 29. Per saperne di più, vedi Intervalli di subnet IPv4.

  3. Crea un router Cloud regionale denominato cloud-router-us-central1:

    gcloud compute routers create cloud-router-us-central1 --network securevertex-vpc --region us-central1
    
  4. Crea un gateway Cloud NAT regionale denominato 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
    

Crea un bucket Cloud Storage

  1. Crea il bucket Cloud Storage:

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

    Sostituisci BUCKET_NAME con un nome di bucket univoco.

  2. Imposta la variabile shell BUCKET_NAME e verifica che sia stata inserita correttamente:

    BUCKET_NAME=BUCKET_NAME
    echo $BUCKET_NAME
    

    Sostituisci BUCKET_NAME con il nome del bucket.

Creare e caricare uno script post-avvio

  1. Per creare lo script, utilizza un editor di testo come vi o nano per creare un file denominato poststartup.sh.

  2. Incolla il seguente script shell nel file:

    #! /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. Salva il file.

  4. Carica il file nel bucket Cloud Storage:

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

Crea un account di servizio personalizzato

Quando crei un'istanza di notebook gestiti dall'utente, ti consigliamo vivamente di deselezionare la casella di controllo Utilizza il service account predefinito di Compute Engine e specificare un account di servizio personalizzato. Se la tua organizzazione non applica il vincolo della policy dell'organizzazione iam.automaticIamGrantsForDefaultServiceAccounts, alaccount di serviziot predefinito di Compute Engine (e quindi a chiunque tu specifichi come utente dell'istanza) viene concesso il ruolo Editor (roles/editor) nel tuo progetto. Per disattivare questo comportamento, consulta Disabilita la concessione automatica dei ruoli ai service account predefiniti.

  1. Crea un account di servizio personalizzato denominato user-managed-notebook-sa:

    gcloud iam service-accounts create user-managed-notebook-sa \
    --display-name="user-managed-notebook-sa" 
    
  2. Assegna il ruolo IAM Storage Object Viewer al service account:

    gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.objectViewer"
    
  3. Assegna il ruolo IAM Utente Vertex AI al service account:

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

Crea un'istanza di blocchi note gestiti dall'utente

  1. Nella console Google Cloud , vai alla pagina Notebook gestiti dall'utente.

    Vai a Notebook gestiti dall'utente

  2. Fai clic su  Crea nuovo, quindi seleziona Opzioni avanzate.

    Viene visualizzata la pagina Crea istanza.

  3. Nella pagina Crea istanza, nella sezione Dettagli, fornisci le seguenti informazioni per la nuova istanza e poi fai clic su Continua:

    • Nome: fornisci un nome per la nuova istanza o accetta quello predefinito.
    • Regione: seleziona us-central1.
    • Zona: seleziona us-central1-a.
  4. Nella sezione Ambiente, fornisci quanto segue e poi fai clic su Continua:

    • Script post-avvio: fai clic su Sfoglia, fai doppio clic sul file poststartup.sh, fai di nuovo clic e poi fai clic su Seleziona.
  5. Nella sezione Tipo di macchina, fornisci quanto segue e poi fai clic su Continua:

    • Shielded VM: seleziona le seguenti caselle di controllo:

      • Avvio protetto
      • Virtual Trusted Platform Module (vTPM)
      • Monitoraggio dell'integrità
  6. Nella sezione Dischi, assicurati che l'opzione Google-managed encryption key sia selezionata, quindi fai clic su Continua:

  7. Nella sezione Networking, fornisci le seguenti informazioni e fai clic su Continua:

    • Networking: seleziona Rete in questo progetto e completa i seguenti passaggi:

      1. Nel campo Rete, seleziona securevertex-vpc.

      2. Nel campo Subnet, seleziona securevertex-subnet-a.

      3. Deseleziona la casella di controllo Assegna indirizzo IP esterno. La mancata assegnazione di un indirizzo IP esterno impedisce all'istanza di ricevere comunicazioni non richieste da internet o da altre reti VPC.

      4. Seleziona la casella di controllo Consenti accesso proxy.

  8. Nella sezione IAM e sicurezza, fornisci quanto segue e poi fai clic su Continua:

    • IAM e sicurezza: per concedere a un singolo utente l'accesso all'interfaccia JupyterLab dell'istanza, completa i seguenti passaggi:

      1. Seleziona Singolo utente.
      2. Nel campo Email utente, inserisci l'indirizzo email di un singolo account utente. Se stai creando l'istanza per qualcun altro, si applicano le seguenti condizioni:
        • Tu (il creatore dell'istanza) non hai accesso all'interfaccia JupyterLab dell'istanza. ma hai comunque il controllo dell'istanza e puoi avviarla, arrestarla o eliminarla.
        • Dopo aver creato l'istanza, devi concedere all'utente il ruolo Utente account di servizio (roles/iam.serviceAccountUser) nel service account dell'istanza. Consulta (Facoltativo) Concedi il ruolo Utente service account all'utente dell'istanza.
      3. Deseleziona la casella di controllo Usa account di servizio predefinito di Compute Engine. Questo passaggio è importante perché il account di servizio predefinito di Compute Engine (e quindi il singolo utente che hai appena specificato) potrebbe avere il ruolo Editor (roles/editor) nel tuo progetto.
      4. Nel campo Email service account, inserisci user-managed-notebook-sa@$projectid.iam.gserviceaccount.com. (Si tratta dell'indirizzo email del service account personalizzato che hai creato in precedenza.) Questo service account dispone di autorizzazioni limitate.

        Per scoprire di più sulla concessione dell'accesso, vedi Gestire l'accesso all'interfaccia JupyterLab di un'istanza di blocchi note gestiti dall'utente.

    • Opzioni di sicurezza: deseleziona la seguente casella di controllo:

      • Accesso root all'istanza

      Seleziona la seguente casella di controllo:

      • nbconvert nbconvert consente agli utenti di esportare e scaricare un file notebook come tipo di file diverso, ad esempio HTML, PDF o LaTeX. Questa impostazione è richiesta da alcuni notebook nel repository GitHub Google Cloud AI generativa.

      Deseleziona la seguente casella di controllo:

      • Download di file

      Seleziona la casella di controllo seguente, a meno che tu non ti trovi in un ambiente di produzione:

      • Accesso al terminale Consente l'accesso al terminale all'istanza dall'interfaccia utente di JupyterLab.
  9. Nella sezione Integrità del sistema, seleziona Upgrade automatico dell'ambiente e fornisci quanto segue:

    • In Report, seleziona le seguenti caselle di controllo:

      • Segnala integrità del sistema
      • Segnala metriche personalizzate a Cloud Monitoring
      • Installa Cloud Monitoring
      • Segnala lo stato del DNS per i domini Google richiesti
  10. Fai clic su Crea.

(Facoltativo) Concedi il ruolo Service Account User all'utente dell'istanza

Se crei l'istanza di blocchi note gestiti dall'utente per un altro utente, devi concedergli il ruolo Utente service account (roles/iam.serviceAccountUser) nel account di servizio personalizzato user-managed-notebook-sa come segue:

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"

Sostituisci i seguenti valori:

  • PROJECT_ID: l'ID progetto
  • USER_EMAIL: l'indirizzo email dell'utente

Verifica che sia stata creata l'istanza di blocchi note gestiti dall'utente

Vertex AI Workbench crea un'istanza di notebook gestiti dall'utente in base alle proprietà specificate e la avvia automaticamente.

Quando l'istanza è pronta per l'uso, Vertex AI Workbench attiva un link Apri JupyterLab. Questo link è accessibile solo all'utente singolo che hai specificato al momento della creazione dell'istanza.

Apri l'istanza in JupyterLab e verifica che sia presente il repository GitHub Google Cloud Generative AI clonato.

  1. Nella console Google Cloud , vai alla pagina Notebook gestiti dall'utente.

    Vai a Notebook gestiti dall'utente

  2. Nell'elenco delle istanze di blocchi note gestiti dall'utente, fai clic sul link Apri JupyterLab per l'istanza che hai creato.

    Nell'elenco delle cartelle, vedrai una cartella generative-ai. Questa cartella contiene il repository GitHub clonato.

Monitorare lo stato di integrità tramite Monitoring

Puoi monitorare le metriche di sistema e delle applicazioni per le istanze di notebook gestiti dall'utente utilizzando la consoleGoogle Cloud . Per saperne di più sul monitoraggio delle istanze e sulla creazione di metriche personalizzate, consulta Monitora lo stato di integrità.

  1. Nella console Google Cloud , vai alla pagina Notebook gestiti dall'utente.

    Vai a Notebook gestiti dall'utente

  2. Fai clic sul nome dell'istanza di blocchi note gestiti dall'utente per cui vuoi visualizzare le metriche.

  3. Nella pagina Dettagli notebook, fai clic sulla scheda Monitoraggio. Esamina l'utilizzo della CPU e i byte di rete per l'istanza notebook. Per scoprire come interpretare queste metriche, consulta Esamina le metriche delle risorse.

    Se hai appena creato l'istanza, non vedrai subito i dati. Attendi qualche minuto e aggiorna la scheda della console.

Crea una pianificazione delle istanze VM per l'istanza di notebook gestiti dall'utente

Poiché un'istanza di notebook gestiti dall'utente è un'istanza VM di Compute Engine, puoi utilizzare le API Compute Engine per creare una pianificazione delle istanze VM.

Utilizza una pianificazione delle istanze VM per avviare e arrestare l'istanza di blocchi note gestiti dall'utente. Durante le ore in cui l'istanza è arrestata, paghi solo i costi di Cloud Storage.

Puoi collegare una pianificazione delle istanze a qualsiasi istanza VM che si trova nella stessa regione, in modo da poter utilizzare la stessa pianificazione delle istanze per controllare tutte le istanze notebook gestite dall'utente nella regione.

Per saperne di più sulle pianificazioni delle istanze VM, consulta Programmazione dell'avvio e dell'arresto di un'istanza VM.

Creare un ruolo IAM personalizzato

Come best practice di sicurezza, ti consigliamo di creare un ruolo IAM personalizzato che disponga solo delle seguenti autorizzazioni e di assegnarlo al account di servizio predefinito di Compute Engine:

  • compute.instances.start
  • compute.instances.stop
  1. In Cloud Shell, crea un ruolo personalizzato denominato Vm_Scheduler e includi le autorizzazioni necessarie:

    Vai a Cloud Shell

    gcloud iam roles create Vm_Scheduler --project=$projectid \
    --title=vm-scheduler-notebooks \
    --permissions="compute.instances.start,compute.instances.stop" --stage=ga 
    
  2. Descrivi il ruolo personalizzato:

    gcloud iam roles describe Vm_Scheduler --project=$projectid
    

Assegna il ruolo al account di servizio Compute Engine predefinito

Per concedere al service account predefinito di Compute Engine l'autorizzazione ad avviare e arrestare le istanze di notebook gestiti dall'utente, devi assegnargli il ruolo personalizzato Vm_Scheduler.

Il account di servizio predefinito di Compute Engine per il tuo progetto ha il seguente indirizzo email: PROJECT_NUMBER-compute@developer.gserviceaccount.com, dove PROJECT_NUMBER è il numero del tuo progetto.

  1. Identifica il numero del progetto e memorizzalo nella variabile della shell project_number:

    project_number=$(gcloud projects describe $projectid --format 'get(projectNumber)')
    echo $project_number
    
  2. Assegna il ruolo personalizzato al account di servizio predefinito:

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

Creare e allegare la programmazione

Per creare una pianificazione dell'istanza che avvii l'istanza di notebook gestiti dall'utente alle 7:00 e la arresti alle 18:00:

  1. Crea una pianificazione di avvio e interruzione denominata 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
    

    Sostituisci TIME_ZONE con il fuso orario IANA basato sulla località per questa pianificazione delle istanze, ad esempio America/Chicago. Se omesso, viene utilizzato il valore predefinito UTC. Per saperne di più, consulta Fuso orario.

  2. Identifica il nome dell'istanza di blocchi note gestiti dall'utente eseguendo il seguente comando e annotando il valore NAME restituito:

    gcloud compute instances list
    
  3. Memorizza il nome nella variabile shell notebook_vm:

    notebook_vm=NOTEBOOK_VM_NAME
    echo $notebook_vm
    

    Sostituisci NOTEBOOK_VM_NAME con il nome dell'istanza di blocchi note gestiti dall'utente.

  4. Collega la pianificazione delle istanze all'istanza di notebook gestiti dall'utente:

    gcloud compute instances add-resource-policies $notebook_vm \
      --resource-policies=optimize-notebooks \
      --zone=us-central1-a
    
  5. Descrivi la pianificazione delle istanze:

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

Puoi verificare se la pianificazione delle istanze viene eseguita correttamente controllando gli audit log di Compute Engine per la policy delle risorse della pianificazione delle istanze e per l'istanza VM collegata. Potresti dover attendere fino a 15 minuti dopo l'ora pianificata per ogni operazione.