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


本教學課程適用於企業數據資料學家、研究人員和網路管理員。本教學課程說明如何建立虛擬私有雲 (VPC) 網路,藉此保護使用者管理的筆記本執行個體。

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

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

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

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

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

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

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

目標

  • 建立虛擬私有雲網路,並新增已啟用私人 Google 存取權的子網路。
  • 為虛擬私有雲網路建立 Cloud Router 和 Cloud NAT。
  • 在子網路中建立由使用者管理的筆記本執行個體,並使用開機後指令碼複製 Google Cloud Generative AI GitHub 存放區。
  • 為執行個體啟用 Cloud Monitoring。
  • 建立 VM 執行個體排程,並附加至執行個體。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。

事前準備

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

  4. 開啟 Cloud Shell,執行本教學課程中列出的指令。Cloud Shell 是一種互動式殼層環境,可讓您透過網路瀏覽器管理專案和資源。 Google Cloud
  5. 前往 Cloud Shell
  6. 在 Cloud Shell 中,將目前的專案設為您的 Google Cloud 專案 ID,並將相同的專案 ID 儲存到 projectid 殼層變數中:
      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.

    Enable the APIs

  8. Make sure that you have the following role or roles on the project: roles/compute.networkAdmin, roles/compute.securityAdmin, roles/compute.instanceAdmin, roles/notebooks.admin, roles/resourcemanager.projectIamAdmin, roles/iam.serviceAccountAdmin, roles/iam.serviceAccountUser, roles/storage.Admin

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      前往 IAM
    2. 選取專案。
    3. 按一下 「授予存取權」
    4. 在「New principals」(新增主體) 欄位中,輸入您的使用者 ID。 這通常是 Google 帳戶的電子郵件地址。

    5. 在「Select a role」(選取角色) 清單中,選取角色。
    6. 如要授予其他角色,請按一下 「新增其他角色」,然後新增每個其他角色。
    7. 按一下 [Save]

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

  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. 在「Service account email」(服務帳戶電子郵件地址) 欄位中輸入 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 控制台,監控使用者管理的 Notebook 執行個體的系統和應用程式指標。如要進一步瞭解執行個體監控和如何建立自訂指標,請參閱「監控健康狀態」。

  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. 執行下列指令,找出使用者管理的筆記本執行個體名稱,並記下傳回的 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 分鐘。

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

您可以按照下列步驟刪除專案中的個別資源:

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

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

  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:$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 
    

後續步驟