VPC ネットワークに安全な Vertex AI Workbench インスタンスを作成する

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

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

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

ネットワーク セキュリティのベスト プラクティスに従い、このチュートリアルの VPC ネットワークでは、Cloud RouterCloud NATプライベート Google アクセスを使用し、次のようにインスタンスを保護します。

  • Vertex AI Workbench インスタンスには外部 IP アドレスがありません。
  • インスタンスは、リージョン Cloud Router と Cloud NAT ゲートウェイ経由でアウトバウンド インターネットにアクセスします。そのため、ソフトウェア パッケージやその他の依存関係をインストールできます。Cloud NAT により、アウトバウンド接続とそれに対するインバウンド レスポンスを可能にしています。インターネットからの未承諾のインバウンド リクエストは許可されません。
  • このインスタンスは、限定公開の Google アクセスを使用して、Google API とサービスの外部 IP アドレスにアクセスします。

このチュートリアルでは、次の方法も説明します。

  • 起動後のスクリプトを作成して、新しく作成した Vertex AI Workbench インスタンスに GitHub リポジトリのクローンを自動的に作成する。
  • Cloud Monitoring を使用して Vertex AI Workbench インスタンスをモニタリングする。
  • Compute Engine API を使用してインスタンスの起動と停止を自動化し、コストを最適化する。

VPC ネットワーク内の Vertex AI Workbench インスタンスのアーキテクチャ図。

スタンドアロン 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 バケットを作成する

このセクションでは、新しい Vertex AI Workbench インスタンスの作成時に実行できる起動後スクリプトを保持する 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
    

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

このセクションでは、起動後スクリプトを作成して、GitHub リポジトリのクローンを新しい Vertex AI Workbench インスタンスに作成します。

  1. スクリプトを作成するには、vimnano などのテキスト エディタを使用して poststartup.sh という名前のファイルを作成します。ファイルへの書き込み権限を付与するには、sudo を先頭に追加する必要があります。次に例を示します。

    sudo vim 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 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. 次のようにファイルを保存します。

    • vim を使用している場合は、Esc キーを押してから、「:wq」と入力してファイルを保存し、終了します。
    • nano を使用している場合は、「Control+O」と入力して Enter を押してファイルを保存し、「Control+X」と入力して終了します。
  4. Cloud Storage バケットにファイルをアップロードします。

    gcloud storage cp poststartup.sh gs://BUCKET_NAME
    

カスタム サービス アカウントを作成する

Vertex AI Workbench インスタンスを作成する場合は、[Compute Engine のデフォルトのサービス アカウントを使用する] チェックボックスをオフにして、カスタム サービス アカウントを指定することを強くおすすめします。組織で iam.automaticIamGrantsForDefaultServiceAccounts 組織のポリシー制約が適用されていない場合、Compute Engine のデフォルトのサービス アカウント(インスタンス ユーザーとして指定するすべてのユーザー)には、プロジェクトの編集者のロール(roles/editor)が付与されます。この動作を無効にするには、デフォルトのサービス アカウントへの自動的なロール付与を無効にするをご覧ください。

  1. workbench-sa という名前のカスタム サービス アカウントを作成します。

    gcloud iam service-accounts create workbench-sa \
        --display-name="workbench-sa"
    
  2. サービス アカウントに Storage オブジェクト閲覧者 IAM ロールを割り当てます。

    gcloud projects add-iam-policy-binding $projectid \
        --member="serviceAccount:workbench-sa@$projectid.iam.gserviceaccount.com" \
        --role="roles/storage.objectViewer"
    
  3. サービス アカウントにモニタリング指標書き込みの IAM ロールを割り当てます。

    gcloud projects add-iam-policy-binding $projectid \
        --member="serviceAccount:workbench-sa@$projectid.iam.gserviceaccount.com" \
        --role="roles/monitoring.metricWriter"
    
  4. サービス アカウントに Vertex AI ユーザーの IAM ロールを割り当てます。

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

Vertex AI Workbench インスタンスを作成する

このセクションでは、Vertex AI Workbench インスタンスを作成します。インスタンスが作成されると、作成した起動後スクリプトが自動的に実行されます。

  1. Google Cloud コンソールで、[Vertex AI Workbench] ページの [インスタンス] タブに移動します。

    [Vertex AI Workbench] に移動

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

    [新しいインスタンス] ページが開きます。

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

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

    • 起動後スクリプト: [参照] をクリックします。バケット名の横にある [子リソースを表示] をクリックし、poststartup.sh をクリックして、[選択] をクリックします。
  5. [マシンタイプ] セクションで、以下を指定して [続行] をクリックします。

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

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

  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. [サービス アカウントのメールアドレス] フィールドに、次のように入力します。PROJECT_ID は、プロジェクト ID に置き換えます。

        workbench-sa@PROJECT_ID.iam.gserviceaccount.com
        

        (これは、先ほど作成したカスタム サービス アカウントのメールアドレスです)このサービス アカウントの権限は制限されています。

        アクセス権の付与の詳細については、Vertex AI Workbench インスタンスの JupyterLab インターフェースへのアクセスを管理するをご覧ください。

    • セキュリティ オプション: 次のチェックボックスをオフにします。

      • インスタンスに対するルートアクセス

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

      • nbconvert: nbconvert を使用すると、ユーザーはノートブック ファイルを別の形式(HTML、PDF、LaTeX など)でエクスポートして、ダウンロードできます。この設定は、Google Cloud 生成 AI GitHub リポジトリの一部のノートブックで必要になります。

      以下のチェックボックスをオフにします。

      • ファイルのダウンロード

      本番環境以外の場合は、次のチェックボックスをオンにします。

      • ターミナル アクセス: JupyterLab ユーザー インターフェースからインスタンスへのターミナル アクセスが可能になります。
  9. [システムの状態] セクションで [環境の自動アップグレード] を選択し、次の情報を入力します。

    • [レポート] で、次のチェックボックスをオンにします。

      • システムの状態を報告
      • Cloud Monitoring にカスタム指標を報告する
      • Cloud Monitoring をインストールする
      • 必要な Google ドメインの DNS ステータスを報告する
  10. [作成] をクリックし、Vertex AI Workbench インスタンスが作成されるまで数分待ちます。

省略可: インスタンス ユーザーにサービス アカウント ユーザーのロールを付与する

別のユーザーの Vertex AI Workbench インスタンスを作成する場合は、対象のユーザーに workbench-sa カスタム サービス アカウントに対するサービス アカウント ユーザーのロールroles/iam.serviceAccountUser)を付与する必要があります。

gcloud iam service-accounts add-iam-policy-binding \
    workbench-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 は、指定されたプロパティに基づいて Vertex AI Workbench インスタンスを作成し、自動的に開始します。

インスタンスを使用する準備が整うと、Vertex AI Workbench で [JupyterLab を開く] が有効になります。このリンクには、インスタンスの作成時に指定した単一のユーザーのみがアクセスできます。

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

  1. Google Cloud コンソールで、[Vertex AI Workbench] ページに移動します。

    [Vertex AI Workbench] に移動

  2. Vertex AI Workbench インスタンスのリストで、作成したインスタンスの [JupyterLab を開く] リンクをクリックします。

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

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

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

  1. Google Cloud コンソールで、[Vertex AI Workbench] ページに移動します。

    [Vertex AI Workbench] に移動

  2. 指標を表示する Vertex AI Workbench インスタンスの名前をクリックします。

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

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

Vertex AI Workbench インスタンスの VM インスタンス スケジュールを作成する

Vertex AI Workbench インスタンスは Compute Engine VM インスタンスであるため、Compute Engine API を使用して、そのインスタンスの VM インスタンス スケジュールを作成できます。

VM インスタンス スケジュールを使用して、Vertex AI Workbench インスタンスの起動と停止を行います。インスタンスが停止している間は、Cloud Storage の費用のみが課金されます。

インスタンス スケジュールを同じリージョン内の任意の VM インスタンスに適用できます。これにより、同じインスタンス スケジュールを使用して、リージョン内のすべての Vertex AI Workbench インスタンスを制御できます。

VM インスタンス スケジュールの詳細については、VM インスタンスの起動と停止のスケジュール設定をご覧ください。

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

セキュリティのベスト プラクティスとして、次の権限のみを持つカスタム IAM ロールを作成し、Compute Engine のデフォルト サービス アカウントに割り当てることをおすすめします。

  • compute.instances.start
  • compute.instances.stop
  1. Cloud Shell で、Vm_Scheduler という名前のカスタムロールを作成して必要な権限を追加します。

    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 のデフォルト サービス アカウントにロールを割り当てる

Vertex AI Workbench インスタンスを起動および停止する権限を Compute Engine のデフォルト サービス アカウントに付与するには、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:service-$project_number@compute-system.iam.gserviceaccount.com" \
        --role="projects/$projectid/roles/Vm_Scheduler"
    

スケジュールを作成して適用する

Vertex AI Workbench インスタンスを午前 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. 次のコマンドを実行して、Vertex AI Workbench インスタンスの名前を確認します。この戻り値は NAME です。

    gcloud compute instances list
    
  3. 名前を notebook_vm シェル変数に格納します。

    notebook_vm=NOTEBOOK_VM_NAME
    echo $notebook_vm
    

    NOTEBOOK_VM_NAME は、Vertex AI Workbench インスタンス名に置き換えます。

  4. インスタンス スケジュールを Vertex AI Workbench インスタンスに適用します。

    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 分待つことが必要な場合があります。