Créer une instance de notebooks gérés par l'utilisateur sécurisée dans un réseau VPC


Ce tutoriel est destiné aux data scientists, aux chercheurs et aux administrateurs réseau d'entreprise. Il montre comment sécuriser une instance de notebooks gérés par l'utilisateur en la créant dans un réseau cloud privé virtuel (VPC).

Un réseau VPC est une version virtuelle d'un réseau physique, mise en œuvre au sein du réseau de production de Google Il s'agit d'un réseau privé, avec ses propres adresses IP, sous-réseaux et passerelles réseau. Dans l'entreprise, les réseaux VPC permettent de protéger les données et les instances en contrôlant l'accès à ceux-ci depuis d'autres réseaux et depuis Internet.

Le réseau VPC de ce tutoriel est un réseau autonome. Cependant, vous pouvez partager un réseau VPC d'un projet (appelé projet hôte) avec d'autres projets de votre organisation Google Cloud. Pour en savoir plus sur le type de réseau VPC à utiliser, consultez la page Réseau VPC unique et VPC partagé.

Conformément aux bonnes pratiques de sécurité réseau, le réseau VPC de ce tutoriel utilise une combinaison de Cloud Router, Cloud NAT et Accès privé à Google pour sécuriser l'instance comme suit :

  • L'instance de notebooks gérés par l'utilisateur ne possède pas d'adresse IP externe
  • L'instance dispose d'un accès Internet sortant via un routeur Cloud Router régional et une passerelle Cloud NAT afin que vous puissiez installer des packages logiciels ou d'autres dépendances. Cloud NAT autorise les connexions sortantes et les réponses entrantes à destination de ces connexions. Cloud NAT n'autorise pas les requêtes entrantes non sollicitées en provenance d'Internet.
  • L'instance utilise l'accès privé à Google pour accéder aux adresses IP externes des API et services Google.

Le tutoriel explique également comment effectuer les opérations suivantes :

  • Créer un script post-démarrage pour cloner automatiquement un dépôt GitHub dans l'instance de notebooks gérés par l'utilisateur nouvellement créée.
  • Utiliser Cloud Monitoring pour surveiller l'instance de notebooks gérés par l'utilisateur.
  • Utiliser l'API Compute Engine pour démarrer et arrêter automatiquement l'instance afin d'optimiser les coûts.

Schéma d'architecture d'une instance de notebook gérée par l'utilisateur dans un réseau VPC.

Objectifs

  • Créez un réseau VPC et ajoutez un sous-réseau sur lequel l'accès privé à Google est activé.
  • Créez un routeur Cloud et Cloud NAT pour le réseau VPC.
  • Créez une instance de notebooks gérés par l'utilisateur dans le sous-réseau à l'aide d'un script post-démarrage qui clone le dépôt GitHub Google Cloud Generative AI.
  • Activez Cloud Monitoring pour l'instance.
  • Créez une programmation d'instances de VM et associez-la à l'instance.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

  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. Make sure that billing is enabled for your Google Cloud project.

  4. Ouvrez Cloud Shell pour exécuter les commandes répertoriées dans ce tutoriel. Cloud Shell est un environnement shell interactif pour Google Cloud qui vous permet de gérer vos projets et vos ressources depuis un navigateur Web.
  5. Accéder à Cloud Shell
  6. Dans Cloud Shell, définissez le projet actuel sur votre ID de projet Google Cloud, puis stockez le même ID de projet dans la variable de shell projectid :
      projectid="PROJECT_ID"
      gcloud config set project ${projectid}
    Remplacez PROJECT_ID par l'ID du projet. Si nécessaire, vous pouvez le trouver dans la console Google Cloud. Pour en savoir plus, consultez la section Trouver votre ID de projet.
  7. Enable the IAM, Compute Engine, Notebooks, Cloud Storage, and Vertex AI APIs:

    gcloud services enable iam.googleapis.com  compute.googleapis.com notebooks.googleapis.com storage.googleapis.com aiplatform.googleapis.com
  8. Grant roles to your user account. Run the following command once for each of the following IAM roles: 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:USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

Créer et configurer un VPC autonome

  1. Créez un réseau VPC nommé securevertex-vpc :

    gcloud compute networks create securevertex-vpc --subnet-mode=custom
    
  2. Créez un sous-réseau nommé securevertex-subnet-a avec une plage IPv4 principale 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
    

    Si vous le souhaitez, vous pouvez indiquer une valeur différente pour le paramètre --range. Cependant, la longueur minimale du préfixe pour un seul notebook est de 29. Pour en savoir plus, consultez la section sur les plages de sous-réseaux IPv4.

  3. Créez un routeur Cloud Router régional nommé cloud-router-us-central1 :

    gcloud compute routers create cloud-router-us-central1 --network securevertex-vpc --region us-central1
    
  4. Créez une passerelle Cloud NAT régionale nommée 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
    

Créer un bucket Cloud Storage

  1. Créez le bucket Cloud Storage :

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

    Remplacez BUCKET_NAME par un nom de bucket unique.

  2. Définissez la variable d'interface système BUCKET_NAME et vérifiez qu'elle a été saisie correctement :

    BUCKET_NAME=BUCKET_NAME
    echo $BUCKET_NAME
    

    Remplacez BUCKET_NAME par le nom du bucket.

Créer et importer un script post-démarrage

  1. Pour créer le script, utilisez un éditeur de texte tel que vi ou nano pour créer un fichier nommé poststartup.sh.

  2. Collez le script suivant dans le fichier.

    #! /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. Enregistrez le fichier.

  4. Importez un fichier dans votre bucket Cloud Storage :

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

Créer un compte de service personnalisé

Lorsque vous créez une instance de notebooks gérés par l'utilisateur, nous vous recommandons vivement de décocher la case Utiliser le compte de service Compute Engine par défaut et de spécifier un compte de service personnalisé. Le compte de service Compute Engine par défaut (et donc toute personne que vous spécifiez en tant qu'utilisateur d'instance) se voit attribuer le rôle Éditeur (roles/editor) sur votre projet. Vous pouvez désactiver ce comportement en désactivant les attributions automatiques de rôles pour les comptes de service par défaut.

  1. Créez un compte de service personnalisé nommé user-managed-notebook-sa :

    gcloud iam service-accounts create user-managed-notebook-sa \
    --display-name="user-managed-notebook-sa"
    
  2. Attribuez le rôle IAM de lecteur des objets de l'espace de stockage au compte de service :

    gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.objectViewer"
    
  3. Attribuez le rôle IAM "Utilisateur Vertex AI" au compte de service :

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

Créer une instance de notebooks gérés par l'utilisateur

  1. Dans Google Cloud Console, accédez à la page Notebooks gérés par l'utilisateur.

    Accéder à la page Notebooks gérés par l'utilisateur

  2. Cliquez sur  Créer, puis sélectionnez Options avancées.

    La page Créer une instance s'affiche.

  3. Dans la section Détails de la page Créer une instance, fournissez les informations suivantes pour la nouvelle instance, puis cliquez sur Continuer :

    • Nom : donnez un nom à la nouvelle instance ou acceptez la valeur par défaut.
    • Région : sélectionnez us-central1.
    • Zone : sélectionnez us-central1-a.
  4. Dans la section Environnement, fournissez les informations suivantes, puis cliquez sur Continuer :

    • Script post-démarrage : cliquez sur Parcourir, double-cliquez sur le fichier poststartup.sh, cliquez à nouveau sur ce fichier, puis cliquez sur Sélectionnez.
  5. Dans la section Type de machine, fournissez les informations suivantes, puis cliquez sur Continuer :

    • VM protégée : cochez les cases suivantes :

      • Démarrage sécurisé
      • Module vTPM (Virtual Trusted Platform Module)
      • Surveillance de l'intégrité
  6. Dans la section Disques, assurez-vous que l'option Clé de chiffrement gérée par Google est sélectionnée, puis cliquez sur Continuer :

  7. Dans la section Mise en réseau, fournissez les informations suivantes, puis cliquez sur Continuer :

    • Mise en réseau : sélectionnez Réseau dans ce projet et procédez comme suit :

      1. Dans le champ Réseau, sélectionnez securevertex-vpc.

      2. Dans le champ Sous-réseau, sélectionnez securevertex-subnet-a.

      3. Décochez la case Attribuer une adresse IP externe. Le fait de ne pas attribuer d'adresse IP externe empêche l'instance de recevoir des communications non sollicitées en provenance d'Internet ou d'autres réseaux VPC.

      4. Cochez la case Autoriser l'accès proxy.

  8. Dans la section IAM et sécurité, spécifiez les éléments suivants, puis cliquez sur Continuer :

    • IAM et sécurité : pour accorder à un seul utilisateur l'accès à l'interface JupyterLab de l'instance, procédez comme suit :

      1. Sélectionnez Un seul utilisateur.
      2. Dans le champ Adresse e-mail de l'utilisateur, saisissez l'adresse e-mail d'un seul compte utilisateur. Si vous créez l'instance pour un autre utilisateur, les conditions suivantes s'appliquent :
        • Vous (le créateur de l'instance) n'avez pas accès à l'interface JupyterLab de l'instance. Cependant, vous contrôlez toujours l'instance, et vous pouvez la démarrer, l'arrêter ou la supprimer.
        • Après avoir créé l'instance, vous devez attribuer à l'utilisateur le rôle d'utilisateur du compte de service (roles/iam.serviceAccountUser) sur le compte de service de l'instance. Consultez la section Facultatif : Attribuez le rôle Utilisateur du compte de service à l'utilisateur de l'instance.
      3. Décochez la case Utiliser le compte de service Compute Engine par défaut. Cette étape est importante, car le compte de service Compute Engine par défaut (et donc l'utilisateur que vous venez de spécifier) se voit attribuer le rôle d'éditeur (roles/editor) sur votre projet.
      4. Dans le champ Adresse e-mail du compte de service, saisissez user-managed-notebook-sa@$projectid.iam.gserviceaccount.com. (Il s'agit de l'adresse e-mail du compte de service personnalisé que vous avez créé précédemment.) Ce compte de service dispose d'autorisations limitées.

        Pour en savoir plus sur l'attribution d'autorisations d'accès, consultez la page Gérer l'accès à l'interface JupyterLab d'une instance de notebooks gérés par l'utilisateur.

    • Options de sécurité : décochez la case suivante :

      • Accès root à l'instance

      Cochez la case suivante :

      • nbconvert nbconvert permet aux utilisateurs d'exporter et de télécharger un fichier notebook sous un type de fichier différent, tel que HTML, PDF ou LaTeX. Ce paramètre est requis par certains notebooks du dépôt GitHub Google Cloud Generative AI.

      Décochez la case suivante :

      • Téléchargement de fichiers

      Cochez la case suivante, sauf si vous êtes dans un environnement de production :

      • Accès au terminal   cette option permet d'accéder au terminal de votre instance à partir de l'interface utilisateur de JupyterLab.
  9. Dans la section État du système, sélectionnez Mise à niveau automatique de l'environnement et fournissez les informations suivantes :

    • Dans Création de rapports, cochez les cases suivantes :

      • Rendez compte de l'état du système
      • Transmettre des métriques personnalisées à Cloud Monitoring
      • Installer Cloud Monitoring
      • Signaler l'état DNS des domaines Google requis
  10. Cliquez sur Créer.

Facultatif : Attribuer le rôle d'utilisateur du compte de service à l'utilisateur de l'instance

Si vous créez l'instance de notebooks gérés par l'utilisateur pour un autre utilisateur, vous devez lui attribuer le rôle Utilisateur du compte de service (roles/iam.serviceAccountUser) sur le compte de service personnalisé user-managed-notebook-sa comme suit :

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"

Remplacez les valeurs suivantes :

  • PROJECT_ID : ID du projet
  • USER_EMAIL : adresse e-mail de l'utilisateur.

Vérifier que l'instance de notebooks gérés par l'utilisateur a été créée

Vertex AI Workbench crée une instance de notebooks gérés par l'utilisateur en fonction des propriétés spécifiées et la démarre automatiquement.

Lorsque l'instance est prête à l'emploi, Vertex AI Workbench active automatiquement un lien Ouvrir JupyterLab. Ce lien n'est accessible qu'à l'utilisateur que vous avez spécifié au moment de la création de l'instance.

Ouvrez l'instance dans JupyterLab et vérifiez que le dépôt GitHub Google Cloud Generative AI cloné est présent.

  1. Dans Google Cloud Console, accédez à la page Notebooks gérés par l'utilisateur.

    Accéder à la page Notebooks gérés par l'utilisateur

  2. Dans la liste des instances de notebooks gérés par l'utilisateur, cliquez sur le lien Ouvrir JupyterLab pour l'instance que vous avez créée.

    Dans la liste des dossiers, un dossier generative-ai s'affiche. Ce dossier contient le dépôt GitHub cloné.

Surveiller l'état de fonctionnement via Monitoring

Vous pouvez surveiller les métriques du système et des applications de vos instances de notebooks gérés par l'utilisateur à l'aide de la console Google Cloud. Pour en savoir plus sur la surveillance des instances et sur la création de métriques personnalisées, consultez la section Surveiller l'état de fonctionnement.

  1. Dans Google Cloud Console, accédez à la page Notebooks gérés par l'utilisateur.

    Accéder à la page Notebooks gérés par l'utilisateur

  2. Cliquez sur le nom de l'instance de notebooks gérés par l'utilisateur dont vous souhaitez afficher les métriques.

  3. Sur la page Notebook, cliquez sur l'onglet Monitoring. Examinez l'utilisation du processeur et les octets réseau de votre instance de notebook. Pour apprendre à interpréter ces métriques, consultez la page Examiner les métriques de ressources.

    Si vous venez de créer l'instance, aucune donnée ne s'affiche immédiatement. Attendez quelques minutes et actualisez l'onglet de la console.

Créer une programmation d'instances de VM pour votre instance de notebooks gérés par l'utilisateur

Une instance de notebooks gérés par l'utilisateur étant une instance de VM Compute Engine, vous pouvez utiliser les API Compute Engine pour lui créer une programmation d'instances de VM.

Utilisez une programmation d'instances de VM pour démarrer et arrêter votre instance de notebooks gérés par l'utilisateur. Pendant les heures d'arrêt de l'instance, vous ne payez que les coûts liés à Cloud Storage.

Vous pouvez associer une programmation d'instances à toute instance de VM située dans la même région, afin de pouvoir utiliser la même programmation pour contrôler toutes vos instances de notebooks gérés par l'utilisateur dans la région.

Pour en savoir plus sur les programmations d'instances de VM, consultez la page Planifier le démarrage et l'arrêt d'une instance de VM.

Créer un rôle IAM personnalisé

Pour des raisons de sécurité, nous vous recommandons de créer un rôle IAM personnalisé qui ne dispose que des autorisations suivantes et de l'attribuer au compte de service Compute Engine par défaut :

  • compute.instances.start
  • compute.instances.stop
  1. Dans Cloud Shell, créez un rôle personnalisé nommé Vm_Scheduler et incluez les autorisations nécessaires :

    Accéder à Cloud Shell

    gcloud iam roles create Vm_Scheduler --project=$projectid \
    --title=vm-scheduler-notebooks \
    --permissions="compute.instances.start,compute.instances.stop" --stage=ga
    
  2. Décrivez le rôle personnalisé :

    gcloud iam roles describe Vm_Scheduler --project=$projectid
    

Attribuer le rôle au compte de service Compute Engine par défaut

Pour autoriser le compte de service Compute Engine par défaut à démarrer et à arrêter vos instances de notebooks gérés par l'utilisateur, vous devez lui attribuer le rôle personnalisé Vm_Scheduler.

Le compte de service Compute Engine par défaut de votre projet possède l'adresse e-mail suivante : PROJECT_NUMBER-compute@developer.gserviceaccount.com, où PROJECT_NUMBER est votre numéro de projet.

  1. Identifiez le numéro de votre projet et stockez-le dans la variable d'interface système project_number :

    project_number=$(gcloud projects describe $projectid --format 'get(projectNumber)')
    echo $project_number
    
  2. Attribuez le rôle personnalisé au compte de service par défaut :

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

Créer et associer la programmation

Pour créer une programmation d'instances qui démarre votre instance de notebooks gérés par l'utilisateur à 7h00 et l'arrête à 18h00, procédez comme suit :

  1. Créez une planification de démarrage et d'arrêt nommée 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
    

    Remplacez TIME_ZONE par le fuseau horaire IANA basé sur l'emplacement pour cette programmation d'instances, par exemple America/Chicago. En cas d'omission, la valeur par défaut UTC est utilisée. Pour plus d'informations, consultez la section Fuseau horaire.

  2. Identifiez le nom de votre instance de notebooks gérés par l'utilisateur en exécutant la commande suivante et en notant la valeur NAME qu'elle renvoie :

    gcloud compute instances list
    
  3. Stockez le nom dans la variable d'interface système notebook_vm :

    notebook_vm=NOTEBOOK_VM_NAME
    echo $notebook_vm
    

    Remplacez NOTEBOOK_VM_NAME par le nom de votre instance de notebooks gérés par l'utilisateur.

  4. Associez la programmation d'instance à votre instance de notebooks gérés par l'utilisateur :

    gcloud compute instances add-resource-policies $notebook_vm \
      --resource-policies=optimize-notebooks \
      --zone=us-central1-a
    
  5. Décrivez la programmation d'instances :

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

Vous pouvez vérifier si la programmation d'instances est correctement exécutée en consultant les journaux d'audit Compute Engine de la stratégie de ressources de programmation d'instances et de l'instance de VM associée. Vous devrez peut-être attendre jusqu'à 15 minutes après l'heure programmée de chaque opération.

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez chaque ressource individuellement.

Vous pouvez supprimer les ressources individuelles du projet comme suit :

  1. Dans Google Cloud Console, accédez à la page Notebooks gérés par l'utilisateur.

    Accéder à la page Notebooks gérés par l'utilisateur

  2. Sélectionnez votre instance de notebook gérée par l'utilisateur.

  3. Cliquez sur Supprimer.

  4. Dans Cloud Shell, supprimez les ressources individuelles restantes en exécutant les commandes suivantes.

    Accéder à 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
    

Étapes suivantes