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 の作成方法
  • 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 の例です。この VPC は、ユーザー管理のノートブックがインターネットへの安全な接続を確立するために使用されています。

図 2

2292244ba0b11f71.png

共有 VPC

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

図 3 はグローバル共有 VPC の図です。この 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. 始める前に

プロジェクトを更新してチュートリアルをサポートする

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

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. Storage バケットを作成する

ストレージ バケットではファイルを安全にアップロード/取得できますが、このチュートリアルでは、ユーザーが管理するノートブックに生成 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 パッケージのダウンロードを有効にするには、Cloud Shell で vi または nano エディタを使用して起動後のスクリプトを作成し、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. 安全なユーザー管理ノートブックを作成する

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

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

Notebooks API を

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

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

[続行] を選択します。

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

[続行] を選択します。

  1. [マシンタイプ] セクションで、次の情報を入力します。
  • マシンタイプ: 新しいインスタンスの CPU 数と RAM 容量を選択します。Vertex AI Workbench は、選択した各マシンタイプの月額費用の見積もりを提供します。
  • 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)を付与する必要があります。
  • [VM で Google Cloud APIs を呼び出すためにデフォルトの Compute Engine サービス アカウントを使用する] の選択を解除する
  • 新しく作成したサービス アカウントのメールアドレスを入力します。例: user-managed-notebook-sa@my-project-id.iam.gserviceaccount.com

セキュリティ対策

  • インスタンスへの root アクセスを有効にするの選択を解除
  • 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] → [ワークベンチ] に移動して、ノートブックを選択して削除します。

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 を作成し、費用を最適化するインスタンス スケジュールを実装することで、安全なユーザー管理ノートブックの構成と検証を正常に完了できました。

次のステップ

チュートリアルをご覧ください...

参考資料と動画

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