VPC ネットワークにセキュリティで保護されたユーザー管理ノートブック インスタンスを作成する


このチュートリアルは、企業のデータ サイエンティスト、研究者、ネットワーク管理者を対象としています。ここでは、Virtual Private Cloud(VPC)ネットワークでユーザー管理ノートブック インスタンスを作成し、保護する方法について説明します。

VPC ネットワークは、Google の本番環境ネットワーク内に仮想的に実装された物理ネットワークです。これは、独自のプライベート IP アドレス、サブネット、ネットワーク ゲートウェイを持つプライベート ネットワークです。企業では、他のネットワークやインターネットからのアクセスを制御してデータとインスタンスを保護するために、VPC ネットワークが使用されています。

このチュートリアルの VPC ネットワークはスタンドアロン ネットワークです。ただし、1 つのプロジェクト(ホスト プロジェクト)から Google Cloud 組織内の他のプロジェクトへの VPC ネットワークを共有できます。使用する VPC ネットワークの種類の詳細については、単一 VPC ネットワークと共有 VPC をご覧ください。

ネットワーク セキュリティのベスト プラクティスに従い、このチュートリアルの VPC ネットワークでは、Cloud RouterCloud 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 生成 AI GitHub リポジトリのクローンを作成する起動後のスクリプトを実行して、サブネットにユーザー管理ノートブック インスタンスを作成します。
  • インスタンスで Cloud Monitoring を有効にします。
  • VM インスタンス スケジュールを作成してインスタンスに適用します。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. Google Cloud コンソールでプロジェクトの選択ページに移動します。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトを選択または作成します。

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  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 に置き換えます。プロジェクト ID は Google Cloud コンソールでも確認できます。詳細については、プロジェクト ID を確認するをご覧ください。
  7. IAM, Compute Engine, Notebooks, Cloud Storage, and Vertex AI API を有効にします。

    gcloud services enable iam.googleapis.com compute.googleapis.comnotebooks.googleapis.com storage.googleapis.com aiplatform.googleapis.com
  8. Google アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。 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. プライマリ IPv4 範囲が 10.10.10.0/29securevertex-subnet-a という名前のサブネットを作成します。

    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 パラメータに別の値を指定できます。ただし、1 つのノートブックの最小プレフィックス長は 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 シェル変数を設定し、この変数が正しく入力されていることを確認します。

    BUCKET_NAME=BUCKET_NAME
    echo $BUCKET_NAME
    

    BUCKET_NAME は、バケット名に置き換えます。

起動後スクリプトを作成して作成する

  1. スクリプトを作成するには、vinano などのテキスト エディタを使用して poststartup.sh という名前のファイルを作成します。

  2. このファイルに次のシェル スクリプトを貼り付けます。

    #! /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 のデフォルトのサービス アカウント(インスタンス ユーザーとして指定するすべてのユーザー)には、プロジェクトの編集者のロール(roles/editor)が付与されます。この動作を無効にするには、デフォルトのサービス アカウントに対するロールの自動付与を無効にします

  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 コンソールで、[ユーザー管理のノートブック] ページに移動します。

    [ユーザー管理のノートブック] に移動

  2. [ 新規作成] をクリックし、[詳細オプション] を選択します。

    [インスタンスを作成] ページが開きます。

  3. [インスタンスを作成] ページの [詳細] セクションで、新しいインスタンスについて次の情報を入力し、[続行] をクリックします。

    • 名前: 新しいインスタンスの名前を入力するか、デフォルトをそのまま使用します。
    • リージョン - 「us-central1」を選択します。
    • ゾーン: 「us-central1-a」を選択します。
  4. [環境] セクションで、以下を指定して [続行] をクリックします。

    • 起動後のスクリプト: [参照] をクリックして、poststartup.sh ファイルをダブルクリックします。このファイルをもう一度クリックして、[選択] をクリックします。
  5. [マシンタイプ] セクションで、以下を指定して [続行] をクリックします。

    • Shielded VM: 次のチェックボックスをオンにします。

      • セキュアブート
      • 仮想トラステッド プラットフォーム モジュール(vTPM)
      • 整合性モニタリング
  6. [ディスク] セクションで [Google が管理する暗号鍵] が選択されていることを確認して、[続行] をクリックします。

  7. [ネットワーキング] セクションで次の設定を行い、[続行] をクリックします。

    • ネットワーキング: [このプロジェクトのネットワーク] を選択し、次の操作を行います。

      1. [ネットワーク] フィールドで「securevertex-vpc」を選択します。

      2. [サブネットワーク] フィールドで「securevertex-subnet-a」を選択します。

      3. [外部 IP アドレスを割り当て] チェックボックスをオフにします。外部 IP アドレスを割り当てると、インスタンスはインターネットまたは他の VPC ネットワークからの未承諾通信を受信できなくなります。

      4. [プロキシ アクセスを許可] チェックボックスをオンにします。

  8. [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 で [JupyterLab を開く] が有効になります。このリンクには、インスタンスの作成時に指定した単一のユーザーのみがアクセスできます。

JupyterLab でインスタンスを開き、Google Cloud 生成 AI GitHub リポジトリのクローンが存在することを確認します。

  1. Google Cloud コンソールで、[ユーザー管理のノートブック] ページに移動します。

    [ユーザー管理のノートブック] に移動

  2. ユーザー管理ノートブック インスタンスのリストで、作成したインスタンスの [JupyterLab を開く] リンクをクリックします。

    フォルダの一覧に generative-ai フォルダが表示されます。このフォルダに、GitHub リポジトリのクローンが含まれています。

Monitoring でヘルス ステータスをモニタリングする

ユーザー管理ノートブック インスタンスのシステム指標とアプリケーション指標をモニタリングするには、Google Cloud コンソールを使用します。インスタンスのモニタリングとカスタム指標の作成の詳細については、ヘルス ステータスをモニタリングするをご覧ください。

  1. Google Cloud コンソールで、[ユーザー管理のノートブック] ページに移動します。

    [ユーザー管理のノートブック] に移動

  2. 指標を表示するユーザー管理ノートブック インスタンスの名前をクリックします。

  3. [ノートブックの詳細] ページで、[モニタリング] タブをクリックします。ノートブック インスタンスの CPU 使用率ネットワーク バイトを確認します。これらの指標の解釈方法については、リソース指標を確認するをご覧ください。

    インスタンスを作成した直後はデータが表示されません。数分待ってから、コンソールのタブを更新します。

ユーザー管理ノートブック インスタンスの VM インスタンス スケジュールを作成する

ユーザー管理ノートブック インスタンスは 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 のデフォルト サービス アカウントに付与するには、Vm_Scheduler カスタムロールを割り当てる必要があります。

プロジェクトの Compute Engine のデフォルト サービス アカウントには、[email protected] というメールアドレスが設定されています。ここで、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:[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 シェル変数に格納します。

    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 コンソールで、[ユーザー管理のノートブック] ページに移動します。

    [ユーザー管理のノートブック] に移動

  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
    

次のステップ