在虛擬私有雲網路中建立安全的使用者自行管理的筆記本執行個體

本教學課程適用於企業資料科學家、研究人員和網路管理員。本教學課程說明如何透過在虛擬私有雲 (VPC) 網路中建立執行個體,確保使用者管理的筆記本執行個體安全無虞。

虛擬私有雲網路是實體網路的虛擬版本,建構於 Google 的正式環境網路之內,這是私人網路,有自己的私人 IP 位址、子網路和網路閘道。在企業中,虛擬私有雲網路可用於控管其他網路和網際網路對資料和執行個體的存取權,藉此保護資料和執行個體。

本教學課程中的虛擬私有雲網路是獨立網路。不過,您可以從一個專案 (稱為主專案) 將 VPC 網路提供給 Google Cloud 機構中的其他專案使用。如要進一步瞭解要使用哪種虛擬私有雲網路,請參閱「單一虛擬私有雲網路和共用虛擬私有雲」。

根據網路安全最佳做法,本教學課程中的虛擬私有雲網路會結合使用 Cloud RouterCloud NAT私人 Google 存取權,以確保執行個體安全無虞:

  • 使用者管理的 Notebooks 執行個體沒有外部 IP 位址。
  • 執行個體透過區域 Cloud Router 和 Cloud NAT 閘道連出網際網路,因此您可以安裝軟體套件或其他依附元件。Cloud NAT 允許傳出連線,以及這些連線的傳入回應。允許來自網際網路的未經要求傳入要求。
  • 執行個體使用 Private Google Access 存取 Google API 和服務的外部 IP 位址。

本教學課程也會說明如何執行下列操作:

  • 建立開機後指令碼,將 GitHub 存放區自動複製到新建立的由使用者管理的筆記本執行個體。
  • 使用 Cloud Monitoring 監控使用者管理的筆記本執行個體。
  • 使用 Compute Engine API 自動啟動及停止執行個體,以節省費用。

虛擬私有雲網路中由使用者管理的筆記本執行個體架構圖。

建立及設定獨立虛擬私有雲

  1. 建立名為 securevertex-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 bucket:

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

    BUCKET_NAME 替換成不重複的值區名稱。

  2. 設定 BUCKET_NAME 殼層變數,並確認輸入正確:

    BUCKET_NAME=BUCKET_NAME
    echo $BUCKET_NAME
    

    BUCKET_NAME 替換為 bucket 名稱。

建立並上傳開機後指令碼

  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 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. 儲存檔案。

  4. 將檔案上傳至 Cloud Storage bucket:

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

建立自訂服務帳戶

建立使用者管理的筆記本執行個體時,強烈建議您取消勾選「使用 Compute Engine 預設服務帳戶」核取方塊,並指定自訂服務帳戶。如果貴機構未強制執行 iam.automaticIamGrantsForDefaultServiceAccounts 組織政策限制,系統會將專案的編輯者角色 (roles/editor) 授予 Compute Engine 預設服務帳戶 (因此,您指定為執行個體使用者的任何人也會獲得此角色)。如要關閉這項行為,請參閱「停用預設服務帳戶的自動角色授予功能」。

  1. 建立名為 user-managed-notebook-sa 的自訂服務帳戶:

    gcloud iam service-accounts create user-managed-notebook-sa \
    --display-name="user-managed-notebook-sa" 
    
  2. 將 Storage 物件檢視者 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 使用者 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 控制台的「User-managed notebooks」頁面。

    前往使用者自行管理的筆記本

  2. 依序點選 「新建」和「進階選項」

    「建立執行個體」頁面隨即開啟。

  3. 在「建立執行個體」頁面的「詳細資料」部分,為新執行個體提供下列資訊,然後按一下「繼續」

    • 名稱:為新執行個體命名,或接受預設名稱。
    • 地區:選取 us-central1
    • 區域:選取 us-central1-a
  4. 在「環境」部分中,提供下列資訊,然後按一下「繼續」

    • 開機後指令碼:按一下「瀏覽」,然後依序按兩下 poststartup.sh 檔案、按一下該檔案,最後按一下「選取」
  5. 在「Machine type」(機器類型) 區段中,提供下列資訊,然後按一下「Continue」(繼續)

    • 受防護的 VM:勾選下列核取方塊:

      • 安全啟動
      • 虛擬信任平台模組 (vTPM)
      • 完整性監控
  6. 在「Disks」(磁碟) 區段中,確認已選取 Google-managed encryption key,然後按一下「Continue」(繼續)

  7. 在「Networking」(網路) 專區中,提供下列資訊,然後按一下「Continue」(繼續)

    • 網路:選取「這項專案中的網路」,然後完成下列步驟:

      1. 在「Network」(網路) 欄位中,選取「securevertex-vpc」

      2. 在「Subnetwork」(子網路) 欄位中,選取「securevertex-subnet-a」

      3. 取消勾選「指派外部 IP 位址」核取方塊。不指派外部 IP 位址可防止執行個體接收來自網際網路或其他虛擬私有雲網路的未經要求通訊。

      4. 勾選「允許 Proxy 存取」核取方塊。

  8. 在「IAM and security」(IAM 和安全性) 部分中,提供下列資訊,然後按一下「繼續」

    • IAM 和安全性:如要將執行個體 JupyterLab 介面的存取權授予單一使用者,請完成下列步驟:

      1. 選取「單一使用者」
      2. 在「使用者電子郵件」欄位中,輸入單一使用者帳戶的電子郵件地址。如果為他人建立執行個體,請遵守下列條件:
        • 您 (執行個體建立者) 無法存取執行個體的 JupyterLab 介面。但您仍可控制執行個體,並啟動、停止或刪除執行個體。
        • 建立執行個體後,您必須將執行個體服務帳戶的服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予使用者。請參閱「選用:將服務帳戶使用者角色授予執行個體使用者」。
      3. 取消勾選「使用 Compute Engine 的預設服務帳戶」核取方塊。 這個步驟非常重要,因為 Compute Engine 預設服務帳戶 (以及您剛才指定的單一使用者) 可能具有專案的「編輯者」角色 (roles/editor)。
      4. 在「服務帳戶電子郵件地址」欄位中,輸入 user-managed-notebook-sa@$projectid.iam.gserviceaccount.com。(這是您先前建立的自訂服務帳戶電子郵件地址)。這個服務帳戶的權限有限。

        如要進一步瞭解如何授予存取權,請參閱管理使用者管理的筆記本執行個體 JupyterLab 介面的存取權

    • 安全性選項:取消勾選下列核取方塊:

      • 執行個體的根目錄存取權

      勾選下列核取方塊:

      • nbconvert nbconvert 可讓使用者匯出筆記本檔案,並下載為其他檔案類型,例如 HTML、PDF 或 LaTeX。Google Cloud 生成式 AI GitHub 存放區中的部分筆記本需要這項設定。

      取消勾選下列核取方塊:

      • 下載檔案

      除非您位於正式環境,否則請選取下列核取方塊:

      • 終端機存取權 這項設定可讓您透過 JupyterLab 使用者介面存取執行個體的終端機。
  9. 在「系統健康狀態」部分,選取「環境自動升級」,然後提供下列資訊:

    • 在「報表」中,勾選下列核取方塊:

      • 回報系統健康狀態
      • 向 Cloud Monitoring 回報自訂指標
      • 安裝 Cloud Monitoring
      • 回報所需 Google 網域的 DNS 狀態
  10. 點選「建立」

選用:將服務帳戶使用者角色授予執行個體使用者

如果您要為其他使用者建立使用者管理的筆記本執行個體,請務必在user-managed-notebook-sa自訂服務帳戶中,授予對方服務帳戶使用者角色 (roles/iam.serviceAccountUser),方法如下:

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 會啟用「Open JupyterLab」(開啟 JupyterLab) 連結。只有您在建立執行個體時指定的使用者,才能存取這個連結。

在 JupyterLab 中開啟執行個體,確認已複製 Google Cloud 生成式 AI GitHub 存放區。

  1. 前往 Google Cloud 控制台的「User-managed notebooks」頁面。

    前往使用者自行管理的筆記本

  2. 在使用者管理的筆記本執行個體清單中,按一下您建立的執行個體「Open JupyterLab」連結。

    資料夾清單中會顯示「generative-ai」資料夾。這個資料夾包含複製的 GitHub 存放區。

透過 Monitoring 監控健康狀態

您可以使用Google Cloud 控制台,監控使用者管理的 Notebooks 執行個體的系統和應用程式指標。如要進一步瞭解執行個體監控和如何建立自訂指標,請參閱「監控健康狀態」。

  1. 前往 Google Cloud 控制台的「User-managed notebooks」頁面。

    前往使用者自行管理的筆記本

  2. 按一下要查看指標的使用者管理 Notebooks 執行個體名稱。

  3. 在「Notebook details」(筆記本詳細資料) 頁面上,按一下「Monitoring」(監控) 分頁標籤。查看筆記本執行個體的 CPU 使用率網路位元組。如要瞭解如何解讀這些指標,請參閱「查看資源指標」一文。

    如果您剛建立執行個體,不會立即看到任何資料。請稍候幾分鐘,然後重新整理控制台分頁。

為使用者管理的筆記本執行個體建立 VM 執行個體排程

由於使用者管理的 Notebooks 執行個體是 Compute Engine VM 執行個體,因此您可以使用 Compute Engine API 為其建立 VM 執行個體排程。

使用 VM 執行個體排程,啟動及停止使用者管理的筆記本執行個體。在執行個體停止運作的時段,您只需支付 Cloud Storage 費用。

您可以將執行個體排程附加至相同區域中的任何 VM 執行個體,因此可以使用相同的執行個體排程,控管該區域中的所有使用者管理筆記本執行個體。

如要進一步瞭解 VM 執行個體排程,請參閱「排定 VM 執行個體的啟動與停止時間」。

建立自訂 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 預設服務帳戶啟動及停止使用者管理 Notebook 執行個體的權限,請為該帳戶指派 Vm_Scheduler 自訂角色。

專案的 Compute Engine 預設服務帳戶具有下列電子郵件地址:PROJECT_NUMBER-compute@developer.gserviceaccount.com,其中 PROJECT_NUMBER 是您的專案編號。

  1. 找出專案編號,並儲存在 project_number 殼層變數中:

    project_number=$(gcloud projects describe $projectid --format 'get(projectNumber)')
    echo $project_number
    
  2. 將自訂角色指派給預設服務帳戶:

    gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:$project_number-compute@developer.gserviceaccount.com" --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. 執行下列指令,找出使用者管理的 Notebooks 執行個體名稱,並記下傳回的 NAME 值:

    gcloud compute instances list
    
  3. 將名稱儲存在 notebook_vm 殼層變數中:

    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
    

如要確認執行個體排程是否順利執行,請檢查執行個體排程資源政策和附加的 VM 執行個體的 Compute Engine 稽核記錄。每項作業排定時間後,最多可能需要等待 15 分鐘。