在 VPC 网络中创建安全的用户管理的笔记本实例


本教程适用于企业数据科学家、研究人员和网络管理员。它展示了如何在 Virtual Private Cloud (VPC) 网络中创建用户管理的笔记本实例来保护实例。

VPC 网络是物理网络的虚拟版本,在 Google 的生产网络内实现它是专用网络,具有自己的专用 IP 地址、子网和网络网关。在企业中,使用 VPC 网络通过控制从其他网络和互联网访问数据和实例来保护数据和实例。

本教程中的 VPC 网络是一个独立的网络。但是,您可以将 VPC 网络从一个项目(称为宿主项目)共享到您的 Google Cloud 组织中的其他项目。如需详细了解要使用的 VPC 网络类型,请参阅单个 VPC 网络和共享 VPC

遵循网络安全最佳实践,本教程中的 VPC 网络使用 Cloud Router 路由器Cloud NAT专用 Google 访问通道通过以下方式保护实例:

  • 用户管理的笔记本实例没有外部 IP 地址。
  • 该实例具有通过区域 Cloud Router 和 Cloud NAT 网关进行的出站互联网访问权限,因此您可以安装软件包或其他依赖项。Cloud NAT 允许出站连接和对这些连接的入站响应。它不允许来自互联网的未经请求的入站请求。
  • 该实例使用专用 Google 访问通道访问 Google API 和服务的外部 IP 地址。

本教程还介绍了如何执行以下操作:

  • 创建启动后脚本,以将 GitHub 代码库自动克隆到新创建的用户管理的笔记本实例中。
  • 使用 Cloud Monitoring 监控用户管理的笔记本实例。
  • 使用 Compute Engine API 自动启动和停止实例以优化费用。

VPC 网络中用户管理的笔记本实例的架构图。

目标

  • 创建 VPC 网络并添加启用了专用 Google 访问通道的子网。
  • 为 VPC 网络创建 Cloud Router 路由器和 Cloud NAT。
  • 使用克隆 Google Cloud Generative AI GitHub 代码库的启动后脚本,在子网中创建一个用户管理的笔记本实例。
  • 为实例启用 Cloud Monitoring。
  • 创建虚拟机实例时间表并将其与实例相关联。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

须知事项

  1. 在 Google Cloud Console 中,转到项目选择器页面。

    转到“项目选择器”

  2. 选择或创建 Google Cloud 项目。

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 打开 Cloud Shell 以执行本教程中列出的命令。Cloud Shell 是 Google Cloud 的交互式 Shell 环境,可让您通过网络浏览器管理项目和资源。
  5. 转到 Cloud Shell
  6. 在 Cloud Shell 中,将当前项目设置为您的 Google Cloud 项目 ID,并将同一项目 ID 存储在 projectid shell 变量中:
      projectid="PROJECT_ID"
      gcloud config set project ${projectid}
    PROJECT_ID 替换为您的项目 ID。如有必要,您可以在 Google Cloud 控制台中查找项目 ID。如需了解详情,请参阅查找项目 ID
  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. 向您的 Google 账号授予角色。对以下每个 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
    • PROJECT_ID 替换为您的项目 ID。
    • EMAIL_ADDRESS 替换为您的电子邮件地址。
    • ROLE 替换为每个角色。

创建和配置独立 VPC

  1. 创建名为 securevertex-vpc 的 VPC 网络:

    gcloud compute networks create securevertex-vpc --subnet-mode=custom
    
  2. 创建一个名为 securevertex-subnet-a 的子网,其主要 IPv4 范围为 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
    

    如果需要,您可以为 --range 参数提供不同值。但是,单个笔记本的最小前缀长度为 29。如需了解详情,请参阅 IPv4 子网范围

  3. 创建名为 cloud-router-us-central1 的区域级 Cloud Router 路由器:

    gcloud compute routers create cloud-router-us-central1 --network securevertex-vpc --region us-central1
    
  4. 创建名为 cloud-nat-us-central1 的区域级 Cloud NAT 网关:

    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
    

创建 Cloud Storage 存储桶

  1. 创建 Cloud Storage 存储桶:

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

    BUCKET_NAME 替换为唯一的存储桶名称。

  2. 设置 BUCKET_NAME Shell 变量并验证其输入是否正确:

    BUCKET_NAME=BUCKET_NAME
    echo $BUCKET_NAME
    

    BUCKET_NAME 替换为存储桶名称。

创建并上传启动后脚本

  1. 如需创建脚本,请使用文本编辑器(如 vinano)创建名为 poststartup.sh 的文件。

  2. 将以下 Shell 脚本粘贴到此文件中:

    #! /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. 保存文件。

  4. 将该文件上传到 Cloud Storage 存储桶:

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

创建自定义服务账号

创建用户管理的笔记本实例时,我们强烈建议您清除使用 Compute Engine 默认服务账号复选框并指定自定义服务账号。Compute Engine 默认服务账号(以及您指定为实例用户的任何人)将被授予项目的 Editor 角色 (roles/editor)。您可以通过为默认服务账号停用自动角色授予来停用此行为。

  1. 创建名为 user-managed-notebook-sa 的自定义服务账号:

    gcloud iam service-accounts create user-managed-notebook-sa \
    --display-name="user-managed-notebook-sa"
    
  2. 将 Storage Object Viewer IAM 角色分配给服务账号:

    gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.objectViewer"
    
  3. 将 Vertex AI User IAM 角色分配给服务账号:

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

创建用户管理的笔记本实例

  1. 在 Google Cloud 控制台中,转到用户管理的笔记本页面。

    进入“用户管理的笔记本”

  2. 点击  新建,然后选择高级选项

    此时会打开创建实例页面。

  3. 创建实例页面的详细信息部分中,为新实例提供以下信息,然后点击继续

    • 名称:为新实例提供名称,或接受默认值。
    • 区域:选择 us-central1
    • 可用区:选择 us-central1-a
  4. 环境部分中,提供以下内容,然后点击继续

    • 启动脚本后:点击浏览,双击 poststartup.sh 文件,再次点击它,然后点击 选择
  5. 机器类型部分中,提供以下内容,然后点击继续

    • 安全强化型虚拟机:选中以下复选框:

      • 安全启动
      • 虚拟可信平台模块 (vTPM)
      • 完整性监控
  6. 磁盘部分中,确保选中 Google 管理的加密密钥,然后点击继续

  7. 网络部分中,提供以下内容,然后点击继续

    • 网络:选择此项目中的网络并完成以下步骤:

      1. 网络字段中,选择 securevertex-vpc

      2. 子网字段中,选择 securevertex-subnet-a

      3. 清除分配外部 IP 地址复选框。不分配外部 IP 地址可防止实例接收来自互联网或其他 VPC 网络的未经请求的通信。

      4. 选中允许代理访问复选框。

  8. IAM 和安全部分,提供以下内容,然后点击继续

    • IAM 和安全:要向单个用户授予对实例的 JupyterLab 界面的访问权限,请完成以下步骤:

      1. 选择单个用户
      2. 用户电子邮件字段中,输入单个用户账号的电子邮件地址。如果您要为其他人创建实例,则适用以下条件:
        • 您(实例创建者)无权访问实例的 JupyterLab 界面。但您仍然可以控制实例,并且可以启动、停止或删除实例。
        • 创建实例后,您需要向用户授予实例服务账号上的 Service Account User 角色 (roles/iam.serviceAccountUser)。请参阅可选:向实例用户授予 Service Account User 角色
      3. 清除使用 Compute Engine 默认服务账号复选框。此步骤非常重要,因为 Compute Engine 默认服务账号(以及您刚刚指定的单个用户)被授予项目的 Editor 角色 (roles/editor)。
      4. 服务账号电子邮件地址字段中,输入 user-managed-notebook-sa@$projectid.iam.gserviceaccount.com。(这是您先前创建的自定义服务账号电子邮件地址。)此服务账号的权限有限。

        如需详细了解如何授予访问权限,请参阅管理对用户管理的笔记本实例的 JupyterLab 界面的访问权限

    • 安全选项:清除以下复选框:

      • 对实例的根访问权限

      选中以下复选框:

      • nbconvert nbconvert 可让用户以其他文件类型(如 HTML、PDF 或 LaTeX)导出和下载笔记文文件。Google Cloud Generative AI GitHub 代码库中的某些笔记本需要此设置。

      清除以下复选框:

      • 文件下载

      除非您处于生产环境,否则请选择以下复选框:

      • 终端访问权限 这将从 JupyterLab 界面对终端进行终端访问。
  9. 系统健康状况部分中,选择环境自动升级并提供以下信息:

    • 报告中,选中以下复选框:

      • 报告系统健康状况
      • 向 Cloud Monitoring 报告自定义指标
      • 安装 Cloud Monitoring
      • 报告所需 Google 网域的 DNS 状态
  10. 点击创建

可选:向实例用户授予 Service Account User 角色

如果您要为其他用户创建用户管理的笔记本实例,则必须向其授予 Service Account User 角色 (roles/iam.serviceAccountUser) user-managed-notebook-sa 自定义服务账号,如下所示:

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"

替换以下值:

  • PROJECT_ID:项目 ID
  • USER_EMAIL:用户的电子邮件地址

验证用户管理的笔记本实例是否已创建

Vertex AI Workbench 会根据您指定的属性创建用户管理的笔记本实例,并自动启动该实例。

当实例可供使用时,Vertex AI Workbench 会激活一个打开 JupyterLab 链接。 只有您在创建实例时指定的单个用户才能访问此链接。

在 JupyterLab 中打开实例,并验证克隆的 Google Cloud Generative AI GitHub 代码库是否存在。

  1. 在 Google Cloud 控制台中,转到用户管理的笔记本页面。

    进入“用户管理的笔记本”

  2. 在用户管理的笔记本实例列表中,点击您创建的实例的打开 JupyterLab 链接。

    在文件夹列表中,您会看到一个 generative-ai 文件夹。此文件夹包含克隆的 GitHub 代码库。

通过 Monitoring 监控健康状况

您可以使用 Google Cloud 控制台监控用户管理的笔记本实例的系统和应用指标。如需详细了解实例监控以及如何创建自定义指标,请参阅监控运行状况

  1. 在 Google Cloud 控制台中,转到用户管理的笔记本页面。

    进入“用户管理的笔记本”

  2. 点击要查看其指标的用户管理的笔记本实例的名称。

  3. 笔记本详情页面上,点击 Monitoring 标签页。查看笔记本实例的 CPU 利用率网络字节。如需了解如何解读这些指标,请参阅查看资源指标

    如果您刚刚创建了实例,则不会看到任何数据。等待几分钟,然后刷新控制台标签页。

为用户管理的笔记本实例创建虚拟机实例时间表

由于用户管理的笔记本实例是 Compute Engine 虚拟机实例,因此您可以使用 Compute Engine API 为其创建虚拟机实例时间表。

使用虚拟机实例时间表启动和停止用户管理的笔记本实例。在实例停止期间,您只需支付 Cloud Storage 费用。

您可以将实例时间表挂接到同一区域中的任何虚拟机实例,以便使用同一实例时间表来控制区域中所有用户管理的笔记本实例。

如需详细了解虚拟机实例时间表,请参阅安排虚拟机实例启动和停止

创建自定义 IAM 角色

为保证安全性,我们建议创建仅具有以下权限的自定义 IAM 角色,并将其分配给 Compute Engine 默认服务账号:

  • compute.instances.start
  • compute.instances.stop
  1. 在 Cloud Shell 中,创建一个名为 Vm_Scheduler 的自定义角色并包含必要的权限:

    打开 Cloud Shell

    gcloud iam roles create Vm_Scheduler --project=$projectid \
    --title=vm-scheduler-notebooks \
    --permissions="compute.instances.start,compute.instances.stop" --stage=ga
    
  2. 描述自定义角色:

    gcloud iam roles describe Vm_Scheduler --project=$projectid
    

将角色分配给 Compute Engine 默认服务账号

如需授予 Compute Engine 默认服务账号启动和停止用户管理的笔记本实例的权限,您需要为其分配 Vm_Scheduler 自定义角色。

项目的 Compute Engine 默认服务账号具有以下电子邮件地址:[email protected],其中 PROJECT_NUMBER 是您的项目编号。

  1. 识别您的项目编号并将其存储在 project_number Shell 变量中:

    project_number=$(gcloud projects describe $projectid --format 'get(projectNumber)')
    echo $project_number
    
  2. 将自定义角色分配给默认服务账号:

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

创建并附加时间表

如需创建实例时间表以在上午 7 点启动用户管理的笔记本实例,并在下午 6 点停止这些实例,请执行以下操作:

  1. 创建名为 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
    

    TIME_ZONE 替换为此实例时间表基于位置的 IANA 时区,例如 America/Chicago。如果省略,则使用默认值 UTC。如需了解详情,请参阅时区

  2. 通过运行以下命令并记下其返回的 NAME 值,确定用户管理的笔记本实例的名称:

    gcloud compute instances list
    
  3. 将名称存储在 notebook_vm shell 变量中:

    notebook_vm=NOTEBOOK_VM_NAME
    echo $notebook_vm
    

    NOTEBOOK_VM_NAME 替换为用户管理的笔记本实例名称。

  4. 将实例时间表与用户管理的笔记本实例相关联:

    gcloud compute instances add-resource-policies $notebook_vm \
      --resource-policies=optimize-notebooks \
      --zone=us-central1-a
    
  5. 描述实例时间表:

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

如需验证实例时间表是否成功运行,您可以查看实例时间表资源政策和附加的虚拟机实例的 Compute Engine 审核日志。每项操作的预定时间最长可达 15 分钟。

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

您可以按如下方式删除项目中的各个资源:

  1. 在 Google Cloud 控制台中,转到用户管理的笔记本页面。

    进入“用户管理的笔记本”

  2. 选择用户管理的笔记本实例。

  3. 点击删除

  4. 在 Cloud Shell 中,通过执行以下命令删除其余各个资源。

    打开 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
    

后续步骤