Crea un'istanza sicura di blocchi note gestiti dall'utente in una rete VPC


Questo tutorial è destinato a data scientist, ricercatori e amministratori di rete aziendali. Mostra come proteggere un'istanza di blocchi note 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. È una rete privata con indirizzi IP, subnet e gateway di rete privati. Nelle aziende, le reti VPC vengono utilizzate per proteggere dati e istanze controllando l'accesso alle stesse da altre reti e da internet.

La rete VPC in questo tutorial è una rete autonoma. Tuttavia, puoi condividere una rete VPC da un progetto (denominato progetto host) con altri progetti nell'organizzazione Google Cloud. Per saperne di più sul tipo di rete VPC da utilizzare, consulta Rete VPC singola e VPC condiviso.

Seguendo le best practice per la sicurezza di rete, la rete VPC di questo tutorial utilizza una combinazione di router Cloud, Cloud NAT e accesso privato Google 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 a livello di regione e un gateway Cloud NAT per l'installazione di pacchetti software o altre dipendenze. Cloud NAT consente le connessioni in uscita e le risposte in entrata a queste connessioni. Non consente di ricevere 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 illustra anche le seguenti azioni:

  • 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 dei blocchi note gestiti dall'utente.
  • Utilizza l'API Compute Engine per avviare e arrestare l'istanza automaticamente al fine di ottimizzare i costi.

Diagramma dell'architettura di un'istanza di blocco note gestita dall'utente in una rete VPC.

Obiettivi

  • Crea una rete VPC e aggiungi una subnet in cui è abilitato l'accesso privato Google.
  • Crea un router Cloud e Cloud NAT per la rete VPC.
  • Crea un'istanza di blocchi note gestiti dall'utente nella subnet utilizzando uno script post-avvio che clona il repository GitHub dell'IA generativa di Google Cloud.
  • Abilitare Cloud Monitoring per l'istanza.
  • Creare una pianificazione di un'istanza VM e collegarla all'istanza.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

Prima di iniziare

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

    Go to project selector

  2. Select or create a Google Cloud project.

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Apri Cloud Shell per eseguire i comandi elencati in questo tutorial. Cloud Shell è un ambiente shell interattivo per Google Cloud che ti consente di gestire progetti e risorse dal tuo browser web.
  5. Vai a Cloud Shell
  6. In Cloud Shell, imposta il progetto attuale sul tuo ID progetto Google Cloud e archivia lo stesso ID progetto nella variabile shell projectid:
      projectid="PROJECT_ID"
      gcloud config set project ${projectid}
    Sostituisci PROJECT_ID con il tuo ID progetto. Se necessario, puoi individuare il tuo ID progetto nella console Google Cloud. Per maggiori informazioni, consulta Trovare l'ID progetto.
  7. Abilita le API 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. Concedi i ruoli al tuo Account Google. Esegui questo comando una volta per ciascuno dei seguenti ruoli 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
    • Sostituisci PROJECT_ID con l'ID progetto.
    • Sostituisci EMAIL_ADDRESS con il tuo indirizzo email.
    • Sostituisci ROLE con ogni singolo ruolo.

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 principale 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 blocco note è pari a 29. Per maggiori informazioni, consulta Intervalli di subnet IPv4.

  3. Crea un router Cloud a livello di regione 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.

Crea e carica 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 blocchi note gestiti dall'utente, ti consigliamo vivamente di deselezionare la casella di controllo Utilizza account di servizio predefinito di Compute Engine e di specificare un account di servizio personalizzato. All'account di servizio predefinito di Compute Engine (e di conseguenza a chiunque specifichi come utente dell'istanza) viene concesso il ruolo Editor (roles/editor) sul progetto. Puoi disattivare questo comportamento disabilitando le concessioni automatiche dei ruoli per gli account di servizio 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 Visualizzatore oggetti Storage all'account di servizio:

    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 all'account di servizio:

    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 Blocchi note gestiti dall'utente.

    Vai a Blocchi note gestiti dall'utente

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

    Viene visualizzata la pagina Crea istanza.

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

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

    • Script post-avvio: fai clic su Sfoglia, fai doppio clic sul file poststartup.sh, fai clic ancora una volta sul file e infine fai clic su Seleziona.
  5. Nella sezione Tipo di macchina, fornisci i dati seguenti e 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 sia selezionata l'opzione Chiave di crittografia gestita da Google, quindi fai clic su Continua:

  7. Nella sezione Networking, fornisci quanto segue, quindi 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 fai clic su Continua:

    • IAM e sicurezza: per concedere a un singolo utente l'accesso all'interfaccia JupyterLab dell'istanza, completa questi 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:
        • In qualità di creatore dell'istanza, non hai accesso all'interfaccia JupyterLab dell'istanza. Tuttavia, sei tu a controllare l'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) nell'account di servizio dell'istanza. Vedi Facoltativo: concedi il ruolo Utente account di servizio all'utente dell'istanza.
      3. Deseleziona la casella di controllo Utilizza account di servizio predefinito di Compute Engine. Questo passaggio è importante, perché all'account di servizio predefinito di Compute Engine (e quindi al singolo utente appena specificato) viene assegnato il ruolo Editor (roles/editor) sul progetto.
      4. Nel campo Email account di servizio, inserisci user-managed-notebook-sa@$projectid.iam.gserviceaccount.com. Si tratta dell'indirizzo email dell'account di servizio personalizzato che hai creato in precedenza. Questo account di servizio ha autorizzazioni limitate.

        Per scoprire di più sulla concessione dell'accesso, consulta 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 blocco note come tipo di file diverso, ad esempio HTML, PDF o LaTeX. Questa impostazione è richiesta da alcuni blocchi note nel repository GitHub dell'IA generativa di Google Cloud.

      Deseleziona la casella di controllo seguente:

      • Download del file

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

      • Accesso terminale Questo consente l'accesso del terminale alla tua istanza dall'interfaccia utente di JupyterLab.
  9. Nella sezione Integrità del sistema, seleziona Upgrade automatico dell'ambiente e specifica 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 Utente account di servizio all'utente dell'istanza

Se stai creando l'istanza di blocchi note gestiti dall'utente per un altro utente, devi concedere a quest'ultimo il ruolo Utente account di servizio (roles/iam.serviceAccountUser) nell'account di servizio personalizzato user-managed-notebook-sa nel seguente modo:

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: 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 blocchi note gestiti dall'utente in base alle proprietà specificate e avvia automaticamente l'istanza.

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

Apri l'istanza in JupyterLab e verifica che sia presente il repository GitHub di IA generativa di Google Cloud clonato.

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

    Vai a Blocchi note 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 di 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 dell'applicazione per le tue istanze di blocchi note gestiti dall'utente utilizzando la console Google Cloud. Per scoprire di più sul monitoraggio delle istanze e sulla creazione di metriche personalizzate, consulta Monitorare lo stato di integrità.

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

    Vai a Blocchi note gestiti dall'utente

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

  3. Nella pagina Dettagli blocco note, fai clic sulla scheda Monitoring. Esamina l'utilizzo della CPU e i byte di rete per la tua istanza blocco note. Per informazioni su come interpretare queste metriche, consulta Esaminare le metriche delle risorse.

    Se hai appena creato l'istanza, non vedrai alcun dato immediatamente. Attendi alcuni minuti e aggiorna la scheda della console.

Crea una pianificazione dell'istanza VM per l'istanza di blocchi note gestiti dall'utente

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

Usa la pianificazione di un'istanza VM per avviare e arrestare l'istanza di blocchi note gestiti dall'utente. Nelle ore in cui l'istanza viene arrestata, paghi solo per i costi di Cloud Storage.

Puoi collegare una pianificazione dell'istanza a qualsiasi istanza VM che si trova nella stessa regione, in modo da utilizzare la stessa pianificazione dell'istanza per controllare tutte le istanze di blocchi note gestiti dall'utente nella regione.

Per ulteriori informazioni sulle pianificazioni delle istanze VM, consulta Pianificazione dell'avvio e dell'arresto di un'istanza VM.

Crea un ruolo IAM personalizzato

Come best practice per la sicurezza, ti consigliamo di creare un ruolo IAM personalizzato che abbia solo le autorizzazioni seguenti e di assegnarlo all'account di servizio predefinito di Compute Engine:

  • compute.instances.start
  • compute.instances.stop
  1. All'interno di 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 all'account di servizio predefinito di Compute Engine

Per concedere all'account di servizio predefinito di Compute Engine l'autorizzazione ad avviare e arrestare le istanze di blocchi note gestiti dall'utente, devi assegnare il ruolo personalizzato Vm_Scheduler.

L'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 shell project_number:

    project_number=$(gcloud projects describe $projectid --format 'get(projectNumber)')
    echo $project_number
    
  2. Assegna il ruolo personalizzato all'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"
    

Crea e allega il programma

Per creare una pianificazione delle istanze che avvii l'istanza dei blocchi note gestiti dall'utente alle 7:00 e le arresti alle 18:00:

  1. Crea una pianificazione di inizio e di fine 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 posizione per questa pianificazione dell'istanza, ad esempio America/Chicago. Se omesso, viene utilizzato il valore predefinito UTC. Per ulteriori informazioni, consulta la sezione sul fuso orario.

  2. Identifica il nome della tua istanza di blocchi note gestiti dall'utente eseguendo questo comando e annotando il valore NAME che restituisce:

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

    notebook_vm=NOTEBOOK_VM_NAME
    echo $notebook_vm
    

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

  4. Collega la pianificazione dell'istanza all'istanza di blocchi note gestiti dall'utente:

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

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

Per verificare se la pianificazione dell'istanza viene eseguita correttamente, controlla gli audit log di Compute Engine per il criterio delle risorse di pianificazione delle istanze e l'istanza VM collegata. Potresti dover attendere fino a 15 minuti dopo l'orario pianificato per ogni operazione.

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Puoi eliminare le singole risorse nel progetto nel seguente modo:

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

    Vai a Blocchi note gestiti dall'utente

  2. Seleziona la tua istanza di blocco note gestita dall'utente.

  3. Fai clic su Elimina.

  4. In Cloud Shell, elimina le singole risorse rimanenti eseguendo questi comandi.

    Vai a 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 
    

Passaggi successivi