Crea una instancia segura de notebooks administrados por el usuario en una red de VPC


Este instructivo está dirigido a científicos de datos, investigadores y administradores de redes empresariales. Se muestra cómo proteger una instancia de notebook administrada por el usuario mediante su creación en una red de nube privada virtual (VPC).

Una red de VPC es una versión virtual de una red física, implementada en la red de producción de Google. Es una red privada, con sus propias direcciones IP privadas, subredes y puertas de enlace de red. En la empresa, las redes de VPC se usan para proteger los datos y las instancias mediante el control del acceso a ellas desde otras redes y desde Internet.

La red de VPC de este instructivo es una red independiente. Sin embargo, puedes compartir una red de VPC de un proyecto (denominado proyecto host) a otros que se encuentren en la organización de Google Cloud. Para obtener más información sobre qué tipo de red de VPC usar, consulta Una sola red de VPC y VPC compartida.

Con las recomendaciones de seguridad de red, la red de VPC de este instructivo usa una combinación deCloud Router,Cloud NAT y Acceso privado a Google para proteger la instancia de las siguientes maneras:

  • Tu instancia de notebooks administrada por el usuario no tiene una dirección IP externa
  • La instancia tiene acceso saliente a Internet a través de un Cloud Router regional y una puerta de enlace Cloud NAT para que puedas instalar paquetes de software u otras dependencias. Cloud NAT permite las conexiones salientes y las respuestas entrantes a esas conexiones. No permite solicitudes de entrada no solicitadas desde Internet.
  • La instancia usa el Acceso privado a Google para acceder a las direcciones IP externas de los servicios y las APIs de Google.

En el instructivo, también se muestra cómo hacer lo siguiente:

  • Crea una secuencia de comandos posterior al inicio para clonar automáticamente un repositorio de GitHub en la instancia de notebooks administrada por el usuario recién creada.
  • Usa Cloud Monitoring para supervisar la instancia de notebooks administrados por el usuario.
  • Usa la API de Compute Engine para iniciar y detener la instancia de forma automática para optimizar los costos.

Diagrama de arquitectura de una instancia de notebook administrado por el usuario en una red de VPC

Objetivos

  • Crear una red de VPC y agregar una subred que tenga habilitado el Acceso privado a Google.
  • Crea un Cloud Router y Cloud NAT para la red de VPC.
  • Crear una instancia de notebooks administrados por el usuario en la subred con una secuencia de comandos posterior al inicio que clone el repositorio de GitHub de IA generativa de Google Cloud.
  • Habilitar Cloud Monitoring para la instancia.
  • Crear una programación de instancias de VM y adjuntarla a la instancia.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  1. En la consola de Google Cloud, ve a la página del selector de proyectos.

    Ir al selector de proyectos

  2. Selecciona o crea un proyecto de Google Cloud.

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Abre Cloud Shell para ejecutar los comandos detallados en este instructivo. Cloud Shell es un entorno de shell interactivo para Google Cloud que te permite administrar proyectos y recursos desde el navegador web.
  5. Ir a Cloud Shell
  6. En Cloud Shell, establece el proyecto actual como el ID del proyecto de Google Cloud y almacena el mismo ID del proyecto en la variable de shell projectid:
      projectid="PROJECT_ID"
      gcloud config set project ${projectid}
    Reemplaza PROJECT_ID con el ID del proyecto. Si es necesario, puedes ubicar el ID del proyecto en la consola de Google Cloud. Para obtener más información, consulta Encuentra el ID del proyecto.
  7. Habilita las APIs de 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. Otorga roles a tu Cuenta de Google. Ejecuta el siguiente comando una vez para cada uno de los siguientes roles de 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
    • Reemplaza PROJECT_ID con el ID del proyecto.
    • Reemplaza EMAIL_ADDRESS por tu dirección de correo electrónico.
    • Reemplaza ROLE por cada rol individual.

Crea y configura una VPC independiente

  1. Crea una red de VPC llamada securevertex-vpc:

    gcloud compute networks create securevertex-vpc --subnet-mode=custom
    
  2. Crea una subred llamada securevertex-subnet-a, con un rango 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
    

    Si lo deseas, puedes proporcionar un valor diferente para el parámetro --range. Sin embargo, la longitud mínima del prefijo para un solo notebook es 29. Para obtener más información, consulta Rangos de subredes IPv4.

  3. Crea un Cloud Router regional llamado cloud-router-us-central1:

    gcloud compute routers create cloud-router-us-central1 --network securevertex-vpc --region us-central1
    
  4. Crea una puerta de enlace de Cloud NAT regional llamada 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 de Cloud Storage

  1. Crea el bucket de Cloud Storage:

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

    Reemplaza BUCKET_NAME con un nombre de bucket único.

  2. Configura la variable de shell BUCKET_NAME y verifica que se haya ingresado de forma correcta:

    BUCKET_NAME=BUCKET_NAME
    echo $BUCKET_NAME
    

    Reemplaza BUCKET_NAME por el nombre del bucket:

Crea y sube una secuencia de comandos posterior al inicio

  1. Para crear la secuencia de comandos, usa un editor de texto, como vi o nano, para crear un archivo llamado poststartup.sh.

  2. Pega la siguiente secuencia de comandos de configuración en el archivo.

    #! /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. Guarda el archivo.

  4. Sube un archivo a tu bucket de Cloud Storage.

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

Crea una cuenta de servicio personalizada

Cuando crees una instancia de notebooks administrados por el usuario, te recomendamos que borres la casilla de verificación Usar la cuenta de servicio predeterminada de Compute Engine y especifiques una cuenta de servicio personalizada. La cuenta de servicio predeterminada de Compute Engine (y, por lo tanto, cualquier persona que especifiques como usuario de la instancia) recibe el rol de editor (roles/editor) en tu proyecto. Puedes inhabilitar este comportamiento si inhabilitas las asignaciones de roles automáticos para las cuentas de servicio predeterminadas.

  1. Crea una cuenta de servicio personalizada llamada user-managed-notebook-sa:

    gcloud iam service-accounts create user-managed-notebook-sa \
    --display-name="user-managed-notebook-sa"
    
  2. Asigna el rol de IAM de visualizador de objetos de almacenamiento a la cuenta de servicio:

    gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.objectViewer"
    
  3. Asigna el rol de IAM de usuario de Vertex AI a la cuenta de servicio:

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

Crea una instancia de notebooks administrados por el usuario

  1. En la consola de Google Cloud, ve a la página Notebooks administrados por el usuario.

    Ir a Notebooks administrados por el usuario

  2. Haz clic en Crear nueva y selecciona Opciones avanzadas.

    Se abre la página Crear instancia.

  3. En la página Crear instancia, en la sección Detalles, proporciona la siguiente información para tu nueva instancia y haz clic en Continuar:

    • Nombre: Proporciona un nombre para la instancia nueva o acepta el valor predeterminado.
    • Región: selecciona us-central1.
    • Zona: selecciona us-central1-a.
  4. En la sección Entorno, proporciona lo siguiente y, luego, haz clic en Continuar.

    • Secuencia de comandos posterior al inicio: haz clic en Explorar, haz doble clic en el archivo poststartup.sh, haz clic una vez más y, luego, en Seleccionar.
  5. En la sección Tipo de máquina, proporciona lo siguiente y, luego, haz clic en Continuar:

    • VM protegida: Selecciona las siguientes casillas de verificación:

      • Inicio seguro
      • Módulo de plataforma segura virtual (vTPM)
      • Supervisión de integridad
  6. En la sección Discos, asegúrate de que la Clave de encriptación administrada por Google esté seleccionada y, luego, haz clic en Continuar:

  7. En la sección Herramientas de redes, proporciona lo siguiente y haz clic en Continuar:

    • Herramientas de redes: Selecciona Red en este proyecto y completa los siguientes pasos:

      1. En el campo Red, selecciona securevertex-vpc.

      2. En el campo Subred, selecciona securevertex-subnet-a.

      3. Desmarca la casilla de verificación Asignar dirección IP externa. Si no asignas una dirección IP externa, se evita que la instancia reciba comunicaciones no solicitadas desde Internet o desde otras redes de VPC.

      4. Selecciona la casilla de verificación Permitir acceso al proxy.

  8. En la sección IAM y seguridad, proporciona lo siguiente y, luego, haz clic en Continuar:

    • IAM y seguridad: Para otorgar acceso a un solo usuario a la interfaz de JupyterLab de la instancia, completa los siguientes pasos:

      1. Selecciona Usuario único.
      2. En el campo Correo electrónico del usuario, ingresa la dirección de correo electrónico de una sola cuenta de usuario. Si creas la instancia para otra persona, se aplican las siguientes condiciones:
        • Tú (el creador de la instancia) no tienes acceso a la interfaz de JupyterLab de la instancia. Sin embargo, tú controlas la instancia y puedes iniciarla, detenerla o borrarla.
        • Después de crear la instancia, debes otorgar al usuario el rol de usuario de cuenta de servicio (roles/iam.serviceAccountUser) en la cuenta de servicio de la instancia. Consulta Opcional: Otorga el rol de usuario de cuenta de servicio al usuario de la instancia.
      3. Desmarca la casilla de verificación Usar la cuenta de servicio predeterminada de Compute Engine. Este paso es importante, ya que a la cuenta de servicio predeterminada de Compute Engine (y, por lo tanto, al usuario único que acabas de especificar) se le otorga el rol de editor (roles/editor) en tu proyecto.
      4. En el campo Correo electrónico de la cuenta de servicio, ingresa user-managed-notebook-sa@$projectid.iam.gserviceaccount.com. (Esta es la dirección de correo electrónico de la cuenta de servicio personalizada que creaste antes). Esta cuenta de servicio tiene permisos limitados.

        Para obtener más información sobre cómo otorgar acceso, consulta Administra el acceso a la interfaz de JupyterLab de una instancia de notebooks administrados por el usuario.

    • Opciones de seguridad: Desmarca la siguiente casilla de verificación:

      • Acceso raíz a la instancia

      Selecciona la siguiente casilla de verificación:

      • nbconvert: nbconvert permite a los usuarios exportar y descargar un archivo de notebook como un tipo de archivo diferente, como HTML, PDF o LaTeX. Algunos de los notebooks del repositorio de GitHub de Google Cloud Generativa AI requieren esta configuración.

      Desmarca la siguiente casilla de verificación:

      • Descarga de archivos

      Selecciona la siguiente casilla de verificación, a menos que estés en un entorno de producción:

      • Acceso a la terminal: Esto habilita el acceso a la terminal a tu instancia desde la interfaz de usuario de JupyterLab.
  9. En la sección Estado del sistema, selecciona Actualización automática del entorno y proporciona lo siguiente:

    • En Informes, seleccione las siguientes casillas de verificación:

      • Genera informes sobre el estado del sistema
      • Generar informes sobre las métricas personalizadas en Cloud Monitoring
      • Instalar Cloud Monitoring
      • Informar el estado de DNS de los dominios de Google obligatorios
  10. Haz clic en Crear.

Opcional: Otorga el rol de usuario de cuenta de servicio al usuario de la instancia

Si creas la instancia de notebooks administrados por el usuario para otro usuario, debes otorgarle el rol de usuario de cuenta de servicio (roles/iam.serviceAccountUser) en la cuenta de servicio personalizada user-managed-notebook-sa de la siguiente manera:

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"

Reemplaza los siguientes valores:

  • PROJECT_ID: el ID del proyecto
  • USER_EMAIL: la dirección de correo electrónico del usuario

Verifica que se haya creado la instancia de notebooks administrados por el usuario

Vertex AI Workbench crea una instancia de notebooks administrados por el usuario en función de las propiedades que especificaste y, luego, inicia la instancia de forma automática.

Cuando la instancia está lista para usarse, Vertex AI Workbench activa un vínculo Abrir JupyterLab. Este vínculo solo está disponible para el usuario que especificaste en el momento de la creación de la instancia.

Abre la instancia en JupyterLab y verifica que esté presente el repositorio de GitHub de IA generativa de Google Cloud clonado.

  1. En la consola de Google Cloud, ve a la página Notebooks administrados por el usuario.

    Ir a Notebooks administrados por el usuario

  2. En la lista de instancias de notebooks administrados por el usuario, haz clic en el vínculo Open JupyterLab para abrir la instancia que creaste.

    En la lista de carpetas, verás una carpeta generative-ai. Esta carpeta contiene el repositorio de GitHub clonado.

Supervisa el estado a través de Monitoring

Puedes supervisar las métricas del sistema y de la aplicación para tus instancias de notebooks administrados por el usuario mediante la consola de Google Cloud. Para obtener más información sobre la supervisión de instancias y la creación de métricas personalizadas, consulta Supervisa el estado.

  1. En la consola de Google Cloud, ve a la página Notebooks administrados por el usuario.

    Ir a Notebooks administrados por el usuario

  2. Haz clic en el nombre de la instancia de notebooks administrados por el usuario de la que deseas ver las métricas.

  3. En la página Detalles del notebook, haz clic en la pestaña Monitoring. Revisa el Uso de CPU y los Bytes de red de tu instancia de notebook. Para aprender a interpretar estas métricas, consulta Revisa las métricas de recursos.

    Si acabas de crear la instancia, no verás ningún dato de inmediato. Espera unos minutos y actualiza la pestaña de la consola.

Crea una programación de instancias de VM para tu instancia de notebooks administrados por el usuario

Debido a que una instancia de notebooks administrados por el usuario es una instancia de VM de Compute Engine, puedes usar las APIs de Compute Engine para crear una programación de instancias de VM para ella.

Usa una programación de instancias de VM para iniciar y detener la instancia de notebooks administrada por el usuario. Durante las horas en que se detiene la instancia, solo pagas por los costos de Cloud Storage.

Puedes adjuntar una programación de instancias a cualquier instancia de VM que esté en la misma región, por lo que puedes usar la misma programación de instancias para controlar todas tus instancias de notebooks administrados por el usuario en la región.

Para obtener más información sobre las programaciones de instancias de VM, consulta Programa una instancia de VM para que se inicie y se detenga.

Crea un rol de IAM personalizado

Como práctica recomendada de seguridad, recomendamos crear un rol de IAM personalizado que solo tenga los siguientes permisos y asignarla a la cuenta de servicio predeterminada de Compute Engine:

  • compute.instances.start
  • compute.instances.stop
  1. Dentro de Cloud Shell, crea un rol personalizado llamado Vm_Scheduler e incluye los permisos necesarios:

    Ir 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. Describe el rol personalizado:

    gcloud iam roles describe Vm_Scheduler --project=$projectid
    

Asigna el rol a la cuenta de servicio predeterminada de Compute Engine

Para otorgar permiso a la cuenta de servicio predeterminada de Compute Engine para iniciar y detener las instancias de notebooks administrados por el usuario, debes asignarle el rol personalizado Vm_Scheduler.

La cuenta de servicio predeterminada de Compute Engine de tu proyecto tiene la siguiente dirección de correo electrónico: [email protected], en la que PROJECT_NUMBER es tu número de proyecto.

  1. Identifica el número de tu proyecto y almacénalo en la variable de shell project_number:

    project_number=$(gcloud projects describe $projectid --format 'get(projectNumber)')
    echo $project_number
    
  2. Asigna el rol personalizado a la cuenta de servicio predeterminada:

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

Crea y adjunta la programación

Para crear una programa de instancias que inicie tu instancia de notebooks administrados por el usuario a las 7 a.m. y las detenga a las 6 p.m., haz lo siguiente:

  1. Crea una programación de inicio y detención con el nombre 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
    

    Reemplaza TIME_ZONE por la zona horaria de IANA basada en la ubicación para este programa de instancias, por ejemplo, America/Chicago. Si se omite, se usa el valor predeterminado UTC. Para obtener más información, consulta la zona horaria.

  2. Para identificar el nombre de tu instancia de notebooks administrados por el usuario, ejecuta el siguiente comando y anota el valor NAME que muestra lo siguiente:

    gcloud compute instances list
    
  3. Almacena el nombre en la variable de shell notebook_vm:

    notebook_vm=NOTEBOOK_VM_NAME
    echo $notebook_vm
    

    Reemplaza NOTEBOOK_VM_NAME por el nombre de tu instancia de notebooks administrados por el usuario.

  4. Adjunta la programación de instancias a tu instancia de notebooks administrados por el usuario:

    gcloud compute instances add-resource-policies $notebook_vm \
      --resource-policies=optimize-notebooks \
      --zone=us-central1-a
    
  5. Describe el programa de la instancia:

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

Puedes verificar si el programa de la instancia se ejecuta con éxito si verificas los registros de auditoría para la política de recursos del programa de instancias y la instancia de VM adjunta. Es posible que debas esperar hasta 15 minutos después del tiempo programado para cada operación.

Limpia

Para evitar que se apliquen cargos a su cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Puedes borrar los recursos individuales del proyecto de la siguiente manera:

  1. En la consola de Google Cloud, ve a la página Notebooks administrados por el usuario.

    Ir a Notebooks administrados por el usuario

  2. Selecciona tu instancia de notebook administrado por el usuario.

  3. Haz clic en Borrar.

  4. En Cloud Shell, ejecuta los siguientes comandos para borrar los recursos individuales restantes.

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

¿Qué sigue?