Vertex AI による安全なユーザー管理ノートブックの作成

1. はじめに

Vertex AI Workbench ユーザー管理ノートブック インスタンスを使用すると、JupyterLab がパッケージ済みのディープ ラーニング仮想マシン(VM)インスタンスを作成して管理できます。

ユーザー管理のノートブック インスタンスには、ディープ ラーニング パッケージ スイート(TensorFlow と PyTorch フレームワークのサポートなど)がプリインストールされています。CPU のみのインスタンスか GPU 対応のインスタンスを構成できます。

作成するアプリの概要

このチュートリアルでは、ネットワーキングとセキュリティのベスト プラクティスに基づいて、安全なユーザー管理ノートブックをデプロイするプロセスについて説明します。手順は次のとおりです。

  1. VPC を作成する
  2. Cloud Router と Cloud NAT を作成する
  3. 適切なセキュリティ設定でノートブック インスタンスを構成する

このチュートリアルでは、各ステップの詳細な手順について説明します。ユーザー管理ノートブックを保護するためのヒントとベスト プラクティスも含まれています。図 1 は、スタンドアロン VPC を使用したデプロイの図です。

図 1

2292244ba0b11f71.png

学習内容

  • 組織に適した共有 VPC とスタンドアロン VPC を判断する方法
  • スタンドアロン VPC の作成方法
  • Cloud Router と Cloud NAT を作成する方法
  • ユーザー管理ノートブックの作成方法
  • ユーザー管理ノートブックにアクセスする方法
  • ユーザー管理ノートブックの健全性をモニタリングする方法
  • インスタンス スケジュールを作成して適用する方法

必要なもの

  • Google Cloud プロジェクト

IAM 権限

2. VPC ネットワーク

VPC ネットワークは、Google Cloud 内で仮想化されているという点を除き、物理ネットワークと同じように考えることができます。VPC ネットワークは、リージョン サブネットで構成されるグローバル リソースです。VPC ネットワークは、Google Cloud 内で互いに論理的に分離されています。

スタンドアロン VPC

図 2 は、Cloud Router と Cloud NAT に加えてリージョン サブネット(us-central1)で構成されるスタンドアロンのグローバル VPC の例です。Cloud Router と Cloud NAT は、ユーザー管理ノートブックがインターネットへの接続を安全に確立するために使用されます。

図 2

2292244ba0b11f71.png

共有 VPC

共有 VPC を使用すると、ホスト プロジェクトの VPC ネットワークから、同じ組織内のサービス プロジェクトにサブネットをエクスポートできます。ホスト プロジェクトには、サブネット、Cloud NAT、ファイアウォール ルールなど、サービス プロジェクトと共有されるネットワーキング リソースが含まれています。サービス プロジェクトには、ホスト プロジェクトのネットワーキング リソースを活用するアプリケーション レベルのリソースが含まれています。

図 3 は、グローバル共有 VPC の図です。この図では、ネットワーキングとセキュリティ インフラストラクチャがホスト プロジェクトにデプロイされ、ワークロードがサービス プロジェクトにデプロイされています。

図 3

1354a9323c8e5787.png

スタンドアロン VPC と共有 VPC

単一 VPC ネットワークは、複雑な代替手段よりも作成、保守、把握が容易なため、多くの単純なユースケースに十分対応できます。共有 VPC は、複数のチームがある組織にとって効果的なツールです。サービス プロジェクトを使用することで、単一 VPC ネットワークのシンプルなアーキテクチャを複数の作業グループに拡張できるためです。

チュートリアルで使用されている VPC のベスト プラクティス

  • ノートブックにアクセスするには、Cloud NAT を有効にします。
  • サブネットを作成するときに、限定公開の Google アクセス をオンにします。
  • 不要なトラフィックを減らすための推奨ファイアウォール ルールを作成します。たとえば、0.0.0.0/0 tcp を使用する代わりに、正確なサブネットまたはホストの IP アドレスを定義します。
  • ファイアウォール ポリシーを活用して、上り(内向き)ルールの範囲(地理位置情報、脅威インテリジェンス リスト、送信元ドメイン名など)を拡大します。

3. ノートブックのベスト プラクティス

インスタンスのサイズを適切に設定する

  • 未使用のインスタンスを停止または削除する
  • 小さい初期インスタンスを使用して、小さいサンプルデータで反復処理を行う
  • 必要に応じてインスタンスをスケールアップする
  • 小規模なデータセットでテストする

適切なマシンタイプを選択する

  • コスト最適化 VM
  • ハードウェア リソースをより有効に活用してコストを削減する
  • N1 と比べて最大 31% の費用削減
  • 1 年または 3 年間のコミットメントでさらに費用を削減(20 ~ 50%)
  • マシンサイズを大きくしたり、GPU を追加したりすると、パフォーマンスが向上し、メモリ制限エラーを回避できます。

インスタンスのシャットダウンをスケジュールする

  • アイドル状態のインスタンスをオフにする(ディスク ストレージに対してのみ料金が発生する)
  • 特定の時間に自動的にシャットダウンして起動するようにノートブック VM インスタンスをスケジュールする

ノートブックの健全性ステータスをモニタリングする

セキュリティに関する考慮事項

ユーザー管理のノートブックを作成する際の推奨されるセキュリティ上の考慮事項は次のとおりです。

  • 「単一ユーザーのみ」のノートブック アクセス オプションを選択します。指定したユーザーがインスタンスの作成者でない場合は、指定したユーザーにインスタンスのサービス アカウントに対するサービス アカウント ユーザーのロール(roles/iam.serviceAccountUser)を付与する必要があります。
  • 次のオプションを無効にします。
  • ルートアクセス
  • nbconvert
  • JupyterLab UI からのファイルのダウンロード
  • ユーザー管理のノートブックに外部 IP アドレスを割り当てる代わりに、Cloud NAT が使用されます。
  • 次のコンピューティング オプションを選択します。
  • セキュアブート
  • 仮想トラステッド プラットフォーム モジュール(vTPM)
  • 整合性モニタリング

4. 始める前に

チュートリアルをサポートするようにプロジェクトを更新する

このチュートリアルでは、$variables を使用して、Cloud Shell での gcloud 構成の実装を支援します。

Cloud Shell で、次の操作を行います。

gcloud config list project
gcloud config set project [your-project-name]
projectid=your-project-name
echo $projectid

5. VPC の設定

スタンドアロン VPC を作成する

Cloud Shell で、次の操作を行います。

gcloud compute networks create securevertex-vpc --project=$projectid --subnet-mode=custom

ユーザー管理ノートブックのサブネットを作成する

Cloud Shell で、次の操作を行います。

gcloud compute networks subnets create securevertex-subnet-a --project=$projectid --range=10.10.10.0/28 --network=securevertex-vpc --region=us-central1 --enable-private-ip-google-access

Cloud Router と NAT 構成

ユーザー管理のノートブック インスタンスに外部 IP アドレスがないため、ノートブック ソフトウェア パッケージのダウンロードのチュートリアルでは Cloud NAT が使用されています。Cloud NAT には下り(外向き)NAT 機能もあります。つまり、インターネット ホストはユーザー管理のノートブックとの通信を開始できないため、セキュリティが強化されます。

Cloud Shell 内で、リージョン Cloud Router を作成します。

gcloud compute routers create cloud-router-us-central1 --network securevertex-vpc --region us-central1

Cloud Shell 内で、リージョン 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

6. ストレージ バケットを作成する

ストレージ バケットは安全なファイルのアップロードと取得を提供します。このチュートリアルでは、クラウド ストレージに、ユーザー管理ノートブックに生成 AI パッケージをインストールする起動後スクリプトが含まれます。

Cloud Storage バケットを作成し、BUCKET_NAME をグローバルに一意な名前に置き換えます。

Cloud Shell 内で、一意のストレージ バケットを作成します。

gsutil mb -l us-central1 -b on gs://BUCKET_NAME

ラボの期間中、BUCKET_NAME を保存する

BUCKET_NAME=YOUR BUCKET NAME
echo $BUCKET_NAME

7. 起動後スクリプトを作成する

生成 AI パッケージのダウンロードを有効にするには、vi または nano エディタを使用して Cloud Shell に起動後スクリプトを作成し、poststartup.sh として保存します。

#! /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

例:

vpc_admin@cloudshell$ more poststartup.sh 
#! /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

gsutil を使用して、Cloud Shell からストレージ バケットに起動後スクリプトをアップロードする

gsutil cp poststartup.sh gs://$BUCKET_NAME

8. サービス アカウントを作成する

ユーザー管理のノートブックをきめ細かく制御するには、サービス アカウントが必要です。生成されたサービス アカウントの権限は、ビジネス要件に基づいて変更できます。このチュートリアルでは、サービス アカウントに次のルールが適用されます。

続行する前に、Service Account API を必要があります。

Cloud Shell 内で、サービス アカウントを作成します。

gcloud iam service-accounts create user-managed-notebook-sa \
    --display-name="user-managed-notebook-sa"

Cloud Shell 内で、Storage オブジェクト閲覧者のロールを使用してサービス アカウントを更新します。

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

Cloud Shell 内で、Vertex AI ユーザーロールを使用してサービス アカウントを更新します。

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

Cloud Shell で、サービス アカウントを一覧表示し、ユーザー管理ノートブックの作成時に使用されるメールアドレスをメモします。

gcloud iam service-accounts list

例:

$ gcloud iam service-accounts list
DISPLAY NAME: user-managed-notebook-sa
EMAIL: user-managed-notebook-sa@my-project-id.iam.gserviceaccount.com
DISABLED: False

9. セキュリティで保護されたユーザー管理ノートブックを作成する

ユーザー管理のノートブック インスタンスは、最新の機械学習ライブラリとデータ サイエンス ライブラリがプリインストールされたディープ ラーニング仮想マシン インスタンスです。ハードウェア アクセラレーション用に Nvidia GPU を追加することもできます。

コンシューマー API を有効にする

Notebooks API を

ユーザー管理ノートブックを作成する

  1. [ワークベンチ] に移動します。
  2. [ユーザー管理のノートブック] を選択し、[ノートブックを作成] を選択します。[ユーザー管理のノートブックの作成] ページが開きます。
  3. 既存のノートブックがデプロイされている場合は、[ユーザー管理のノートブック] → [新しいノートブック] → [カスタマイズ] を選択します。
  4. [ユーザー管理のノートブックの作成] ページの [詳細] セクションで、新しいインスタンスについて次の情報を入力します。
  • 名前: 新しいインスタンスの名前を入力します。
  • リージョンとゾーン: このチュートリアルでは、リージョン us-central1 とゾーン us-central1-a を使用します。

[続行] を選択します。

  1. [環境] で、次の情報を入力します。
  • オペレーティング システム: 使用するオペレーティング システムを選択します。
  • 使用する環境を選択します。
  • バージョン: 使用するバージョンを選択します。
  • 起動後スクリプト(省略可、以前に作成した生成 AI スクリプトを使用): [参照] を選択して、インスタンスの起動後に実行するスクリプトを選択します。
  • メタデータ: 省略可。インスタンスのカスタム メタデータのキーを指定します。

[続行] を選択します。

  1. [マシンタイプ] セクションで、次の情報を入力します。
  • マシンタイプ: 新しいインスタンスの CPU 数と RAM 容量を選択します。Vertex AI Workbench により、選択した各マシンタイプの 1 か月あたりの費用見積もりが提示されます。
  • GPU のタイプ: 新しいインスタンスの GPU のタイプと GPU の数を選択します。GPU の種類については、Compute Engine の GPU をご覧ください。
  • [NVIDIA GPU ドライバを自動的にインストールする] チェックボックスをオンにします。

Shielded VM

  • セキュアブートをオンにする
  • vTPM をオンにする
  • 整合性のモニタリングを有効にする

[続行] を選択します。

  1. [ディスク] セクションで、次の情報を入力します。
  • ディスク: 省略可。デフォルトのブートディスクまたはデータディスクの設定を変更するには、必要なブートディスクの種類、ブートディスクのサイズ(GB 単位)、データディスクのタイプ、データディスクのサイズ(GB 単位)を選択します。ディスクタイプの詳細については、ストレージ オプションをご覧ください。
  • ゴミ箱に移動: 省略可: オペレーティング システムのデフォルトのゴミ箱動作を使用するには、このチェックボックスをオンにします。デフォルトのゴミ箱動作を使用する場合、JupyterLab ユーザー インターフェースを使用して削除されたファイルは復元できますが、削除されたファイルはディスク容量を使用します。
  • バックアップ: 省略可: Cloud Storage のロケーションをインスタンスのデータディスクと同期するには、[参照] を選択して Cloud Storage のロケーションを指定します。ストレージの費用については、Cloud Storage の料金をご覧ください。
  • 暗号化: Google が管理する暗号鍵

[続行] を選択します。

  1. [ネットワーキング] セクションで、次の情報を入力します。
  • ネットワーキング: [このプロジェクトのネットワーク] または [共有ネットワーク] を選択します。ホスト プロジェクトで 共有 VPC を使用している場合は、サービス プロジェクトの Notebooks サービス エージェントCompute ネットワーク ユーザーのロール(roles/compute.networkUser)を付与する必要があります。
  • [ネットワーク] フィールドで、目的のネットワークを選択します。このチュートリアルでは、ネットワーク securevertex-vpc を使用します。ネットワークで限定公開の Google アクセスが有効になっているか、インターネットにアクセスできる場合は、VPC ネットワークを選択できます。[サブネットワーク] フィールドで、目的のサブネットワークを選択します。このチュートリアルでは、サブネットワーク securevertex-subnet-a が使用されています。
  • 外部 IP アドレスの割り当てを解除する
  • プロキシ アクセスを許可するを選択する

[続行] を選択します。

81bb7dbe31fbf587.png

  1. [IAM とセキュリティ] セクションで、次の操作を行います。
  • [シングル ユーザー] を選択し、[ユーザーのメール] フィールドに、アクセス権を付与するユーザー アカウントを入力します。指定したユーザーがインスタンスの作成者でない場合は、指定したユーザーにインスタンスのサービス アカウントに対するサービス アカウント ユーザーのロール(roles/iam.serviceAccountUser)を付与する必要があります。
  • [Google Cloud APIs を呼び出すために VM でデフォルトの Compute Engine サービス アカウントを使用する] をオフにする
  • 新しく作成したサービス アカウントのメールアドレスを入力します(例: user-managed-notebook-sa@my-project-id.iam.gserviceaccount.com)。

セキュリティ対策

  • インスタンスに対するルートアクセスを有効にするの選択を解除する
  • [nbconvert を有効にする] の選択を解除する
  • [JupyterLab UI からのファイルのダウンロードを有効にする] の選択を解除します
  • ターミナルを有効にする(本番環境では選択を解除)

[続行] を選択します。

e19f3cd05a2c1b7f.png

  1. [システムの状態] セクションで、次の情報を入力します。

環境のアップグレードとシステムの状態

  • [環境の自動アップグレードを有効にする] チェックボックスをオンにします。
  • ノートブックのアップグレード頻度(毎週または毎月)を選択します。

[システムの状態とレポート] で、次のチェックボックスをオンまたはオフにします。

  • システムのヘルスレポートを有効にする
  • Cloud Monitoring にカスタム指標を報告する
  • Cloud Monitoring エージェントをインストールする

[作成] を選択します。

10. 検証

Vertex AI Workbench は、指定されたプロパティに基づいてユーザー管理ノートブック インスタンスを作成し、自動的に開始します。インスタンスを使用する準備が整うと、Vertex AI Workbench で [JupyterLab を開く] リンクが有効になり、エンドユーザーがノートブックにアクセスできるようになります。

11. オブザーバビリティ

Monitoring を使用してシステムとアプリケーションの指標をモニタリングする

ユーザー管理のノートブック インスタンスに Monitoring がインストールされている場合、Google Cloud コンソールを使用して、システムとアプリケーションの指標をモニタリングできます。

  1. Google Cloud コンソールで、[ユーザー管理のノートブック] ページに移動します。
  2. システムとアプリケーションの指標を表示するインスタンス名をクリックします。
  3. [ノートブックの詳細] ページで、[モニタリング] タブをクリックします。インスタンスのシステム指標とアプリケーション指標を確認します。

12. ノートブック スケジュールを作成する

インスタンス スケジュールを使用すると、仮想マシン(VM)インスタンスの起動と停止を自動的に行うことができます。インスタンス スケジュールを使用して VM インスタンスのデプロイを自動化することで、費用を最適化し、VM インスタンスをさらに効率的に管理できます。インスタンス スケジュールは、繰り返しのワークロードと 1 回限りのワークロードの両方に使用できます。たとえば、インスタンス スケジュールを使用して、VM インスタンスを業務時間中にのみ実行したり、1 回限りのイベントに容量を指定したりすることができます。

インスタンス スケジュールを使用するには、起動と停止の動作の詳細を指定したリソース ポリシーを作成し、ポリシーを 1 つ以上の VM インスタンスに接続します。

このチュートリアルでは、ノートブックを午前 7 時にオンにし、午後 6 時にオフにするインスタンス スケジュールを作成する方法について説明します。

インスタンス スケジュールを作成するには、compute.instances.start と compute.instances.stop の権限が必要です。そのため、管理者が作成して付与したカスタムロールを使用することをおすすめします。

作成されたカスタムロールは、プロジェクトのデフォルトの Compute Engine サービス アカウントに割り当てられます。これにより、インスタンス スケジュールでノートブックを起動および停止できるようになります。

カスタムロールを作成する

Cloud Shell で、カスタムロール VmScheduler を作成して必要な権限を追加します。

gcloud iam roles create Vm_Scheduler --project=$projectid \
    --title=vm-scheduler-notebooks \
    --permissions="compute.instances.start,compute.instances.stop" --stage=ga

Cloud Shell からカスタムロールの説明を取得します。

gcloud iam roles describe Vm_Scheduler --project=$projectid

例:

$ gcloud iam roles describe Vm_Scheduler --project=$projectid
etag: BwX991B0_kg=
includedPermissions:
- compute.instances.start
- compute.instances.stop
name: projects/$projectid/roles/Vm_Scheduler
stage: GA
title: vm-scheduler-notebooks

デフォルトのサービス アカウントを更新する

次のセクションでは、PROJECT_NUMBER-compute@developer.gserviceaccount.com という形式のデフォルトのサービス アカウントを特定して更新します。

Cloud Shell で、現在のプロジェクト番号を確認します。

gcloud projects list --filter=$projectid

Cloud Shell で、プロジェクト番号を変数として保存します。

project_number=your_project_number
echo $project_number

Cloud Shell で、カスタムロール VM_Scheduler を使用してデフォルトのコンピューティング サービス アカウントを更新します。

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

インスタンス スケジュールを作成する

Cloud Shell で、開始と停止のスケジュールを作成します。

gcloud compute resource-policies create instance-schedule optimize-notebooks \
    --region=us-central1 \
    --vm-start-schedule='0 7 * * *' \
    --vm-stop-schedule='0 18 * * *' \
        --timezone=America/Chicago

Cloud Shell で、ノートブックの名前を保存します。

gcloud compute instances list
notebook_vm=your_notebookvm_name
echo $notebook_vm

インスタンス スケジュールは、インスタンス スケジュールと同じリージョンにある既存の VM インスタンスに接続できます。

Cloud Shell で、スケジュールをノートブックに関連付けます。

gcloud compute instances add-resource-policies $notebook_vm \
--resource-policies=optimize-notebooks \
--zone=us-central1-a

13. クリーンアップ

コンソールからユーザー管理のノートブックを削除します。Vertex AI → Workbench に移動し、ノートブックを選択して削除します。

Cloud Shell から VPC コンポーネントを削除します。

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 

14. 完了

これで完了です。マネージド ノートブックのセキュリティ強化のベスト プラクティスを使用してカスタムのスタンドアロン VPC を作成し、費用を最適化するためにインスタンス スケジュールを実装することで、セキュリティで保護されたユーザー管理ノートブックを構成して検証しました。

次のステップ

以下のチュートリアルをご覧ください。

参考資料と動画

リファレンス ドキュメント