サービス アカウントを使用してマルチテナント クラスタを作成する

Dataproc サービス アカウント ベースの安全なマルチテナンシーを使用すると、クラスタの作成時に、サービス アカウントにマッピングされたユーザー アカウントのセットが含まれるクラスタを複数のユーザーと共有できます。ユーザーは、独立したユーザー環境のマルチテナント クラスタで実行されているカーネルに、Jupyter ノートブックなどのインタラクティブ ワークロードを送信できます。

ユーザーがマルチテナント クラスタにジョブを送信すると、次のようになります。

  • ジョブは、特定の Kerberos プリンシパルを持つ特定の OS ユーザーとして実行されます。

  • ジョブは、マッピングされたサービス アカウントを使用して Google Cloud リソースにアクセスします。

このドキュメントでは、Dataproc マルチテナント クラスタを作成し、Jupyter ノートブックを起動してクラスタで実行されている PySpark カーネルに接続する方法について説明します。

考慮事項と制限事項

マルチテナント クラスタを作成する場合:

  • クラスタを使用できるのは、マッピングされたサービス アカウントを持つ Google アカウント ユーザーのみです。Google グループはマッピングできません。マッピングされていないユーザーはクラスタでジョブを実行できません。

  • 安全なクラスタ内通信を行えるように、Kerberos が有効になっており、クラスタで構成されています。Kerberos によるエンドユーザー認証はサポートされていません。

  • クラスタ VM 上で起動スクリプトを実行するなど、クラスタと Compute Engine の機能への直接的な SSH アクセスはブロックされます。また、sudo 権限を使用してジョブを実行することはできません。

  • Dataproc Workflows はサポートされていません。

マルチテナント クラスタを作成する

マルチテナント機能は、Dataproc クラスタの作成時に有効にします。

コンソール

Google Cloud コンソールを使用して、次のように Dataproc クラスタを作成します。

  1. Google Cloud コンソールで、Dataproc の [Compute Engine で Dataproc クラスタを作成する] ページに移動します。 Compute Engine で Dataproc クラスタを作成する

  2. [クラスタの設定] パネルで次の操作を行います。

    1. [コンポーネント] で、次の操作を行います。
      1. [コンポーネント ゲートウェイ] で [コンポーネント ゲートウェイを有効にする] を選択します。
      2. [オプション コンポーネント] で [Jupyter Kernel Gateway] を選択して、複数のユーザーが Jupyter ノートブックをマルチテナント クラスタに接続できるようにします。
  3. [クラスタのカスタマイズ] パネルで次の操作を行います。

    1. [クラスタ プロパティ] で、次の操作を行います。

      1. クラスタを再作成せずにマルチテナント ユーザーを追加または削除できるようにするには(マルチテナント クラスタ ユーザーを更新するを参照)、[プロパティを追加] をクリックして、dataproc 接頭辞と dynamic.multi.tenancy.enabled プロパティを追加し、その値を true に設定します。

        推奨事項: マルチテナント クラスタで実行されているノートブック カーネルごとにかなりのクラスタ リソースを YARN が消費するため、リソース割り当てを増やすため Spark プロパティと YARN プロパティを追加します。

        例:

        接頭辞 キー
        spark spark.driver.memory 5g
        spark spark.executor.memory 5g
        spark spark.executor.cores 200
        capacity-scheduler yarn.scheduler.capacity.maximum-am-resource-percent 0.5

  4. [セキュリティ管理] パネルで次の操作を行います。

    1. [プロジェクト アクセス] で、[このクラスタのクラウド プラットフォーム スコープを有効にします] を選択します。
    2. [安全なマルチテナンシー] で、次の操作を行います。
      1. [有効にする] を選択します。
      2. [マルチテナンシー マッピング] で、次の操作を行います。
        1. [マルチテナンシー マッピングを追加] をクリックして、ユーザー アカウントとサービス アカウントのマッピングを追加します。
  5. 他のクラスタ設定を確認または入力します( Google Cloud コンソールを使用して Dataproc クラスタを作成するをご覧ください)。

  6. [作成] をクリックします。

gcloud

gcloud dataproc clusters create command--secure-multi-tenancy-user-mapping フラグを使用して、ユーザー アカウントからサービス アカウントへのマッピングのリストを指定します。

gcloud dataproc clusters create CLUSTER_NAME \
    --region=REGION \
    --secure-multi-tenancy-user-mapping=USER_MAPPINGS: \
    --properties "dataproc:dataproc.dynamic.multi.tenancy.enabled=true" \
    --service-account=CLUSTER_SERVICE_ACCOUNT@iam.gserviceaccount.com \
    --scopes=https://www.googleapis.com/auth/iam \
    --optional-components=JUPYTER_KERNEL_GATEWAY \
    --enable-component-gateway \
    other args ...

注:

  • USER_MAPPINGS: ユーザー アカウントをサービス アカウントにマッピングするカンマ区切りのリストを指定します。

    --secure-multi-tenancy-user-mapping=UserA@my-company.com:SERVICE_ACCOUNT_FOR_USERA@iam.gserviceaccount.com,UserB@my-company.com:SERVICE_ACCOUNT_FOR_USERB@iam.gserviceaccount.com,UserC@my-company.com:SERVICE_ACCOUNT_FOR_USERC@iam.gserviceaccount.com
    
    YAML マッピング ファイルを使用する: --secure-multi-tenancy-user-mapping フラグを使用してユーザー アカウントとサービス アカウントのマッピングを指定する代わりに、--identity-config-file フラグを使用して、マッピングを含む YAML ファイル(ローカルまたは Cloud Storage)を指定できます。
    --identity-config-file=LOCAL_FILE or gs://BUCKET/FOLDER/FILENAME
    
    マッピング ファイルの各行は、ユーザー アカウントをサービス アカウントにマッピングします。1 行目には user_service_account_mapping: ヘッダーが含まれています。
    user_service_account_mapping:
    UserA@my-company.com:SERVICE_ACCOUNT_FOR_USERA@iam.gserviceaccount.com
    UserB@my-company.com:SERVICE_ACCOUNT_FOR_USERB@iam.gserviceaccount.com
    UserC@my-company.com:SERVICE_ACCOUNT_FOR_USERC@iam.gserviceaccount.com
    

  • --properties "dataproc:dataproc.dynamic.multi.tenancy.enabled=true": このプロパティを使用すると、クラスタを再作成せずにマルチテナント クラスタ ユーザーを追加または削除できます(マルチテナント クラスタ ユーザーを更新するをご覧ください)。

    推奨事項: マルチテナント クラスタで実行されているノートブック カーネルごとにかなりのクラスタ リソースを YARN が消費するため、リソース割り当てを増やすため Spark プロパティと YARN プロパティを追加します。

    例:

    --properties=" \
    spark:spark.driver.memory=5g,\
    spark:spark.executor.memory=5g,\
    spark:spark.executor.cores=200, \
    capacity-scheduler:yarn.scheduler.capacity.maximum-am-resource-percent=0.5"
    
  • CLUSTER_SERVICE_ACCOUNT(省略可): --service-account flag を使用して、クラスタのカスタム VM サービス アカウントを指定できます。このフラグを省略すると、デフォルトのクラスタ VM サービス アカウントPROJECT_NUMBER-compute@developer.gserviceaccount.com)が使用されます。

    推奨事項: クラスタごとに異なるクラスタ サービス アカウントを使用して、各クラスタ VM サービス アカウントで、マッピングされたユーザー サービス アカウントの限定されたグループのみが権限を借用できるようにします。

  • クラスタ サービス アカウントが権限借用を実行するには、--scopes=https://www.googleapis.com/auth/iam が必要です。

  • --enable-component-gateway--optional-components=JUPYTER_KERNEL_GATEWAY: Dataproc コンポーネント ゲートウェイJupyter Kernel Gateway を有効にすると、複数のユーザーが Jupyter ノートブックをマルチテナント クラスタに接続できます。

API

SecurityConfig.IdentityConfig.userServiceAccountMapping field を使用して、ユーザー アカウントとサービス アカウントのマッピングのリストを指定します。

Identity and Access Management の権限を付与する

ユーザー ノートブックをマルチテナント クラスタで実行されているノートブック カーネルに接続するには、マッピングされたユーザー、マッピングされたサービス アカウント、クラスタ VM サービス アカウントに、リソースへのアクセスに必要な IAM 権限が必要です。

マッピングされたユーザー権限

マッピングされた各ユーザーには、マルチテナント クラスタで実行されているノートブック カーネルにアクセスして接続するために必要な dataproc.clusters.get 権限と dataproc.clusters.use 権限が必要です。これらの権限を含む Dataproc 編集者ロール(roles/dataproc.editorを付与するか(単一の IAM ロールを付与するをご覧ください)、これらの権限を含むカスタムロールを作成します。

マッピングされたサービス アカウントの権限

マッピングされた各サービス アカウントには、マッピングされたユーザーのノートブック アプリケーションに必要な権限(Cloud Storage バケットへのアクセス権や BigQuery テーブルへのアクセス権など)が必要です(サービス アカウントへのアクセスを管理するをご覧ください)。

VM サービス アカウントの権限

マルチテナント クラスタの VM サービス アカウントには、マッピングされた各サービス アカウントに対する iam.serviceAccounts.getAccessToken 権限が必要です。この権限を含むサービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreatorを付与するか(サービス アカウントへのアクセスを管理するをご覧ください)、この権限を含むカスタムロールを作成できます。他の VM サービス アカウントのロールについては、Dataproc VM サービス アカウントをご覧ください。

Jupyter ノートブックをマルチテナント クラスタ カーネルに接続する

マッピングされたマルチテナント クラスタ ユーザーは、Vertex AI Workbench またはユーザー管理の Jupyter ノートブックをマルチテナント クラスタにインストールされているカーネルに接続できます。

Vertex AI ノートブック

Jupyter ノートブックを作成してマルチテナント クラスタに接続するには、次の操作を行います。

  1. Vertex AI Workbench インスタンスを作成します
  2. Workbench の [インスタンス] タブで、インスタンスの [JupyterLab を開く] リンクをクリックします。
  3. [Dataproc Cluster Notebooks] で、[PySpark (YARN Cluster) on MULTI_TENANCY_CLUSTER_NAME] カードをクリックして、新しい Jupyter PySpark ノートブックに接続して起動します。

ユーザー管理のノートブック

ユーザー管理の Jupyter ノートブックを作成して Dataproc マルチテナント クラスタに接続するには、ユーザー管理の VM に JupyterLab 拡張機能をインストールするの手順に沿って操作します。

マルチテナント クラスタのユーザーを更新する(プレビュー)

マルチテナント クラスタの作成時dataproc:dataproc.dynamic.multi.tenancy.enabled クラスタ プロパティを true に設定した場合は、クラスタの作成後にマルチテナント クラスタのユーザーを追加、削除、置換できます。

ユーザーを追加する

次の更新コマンドでは、--add-user-mappings フラグを使用して、セキュアなマルチテナント クラスタに 2 つの新しいユーザー アカウントとサービス アカウントのマッピングを追加します。

gcloud dataproc clusters update CLUSTER_NAME \
    --region=REGION \
    --add-user-mappings=new-user1@my-company.com=SERVICE_ACCOUNT_FOR_NEW_USER1@iam.gserviceaccount.com,new-user2@my-company.com=SERVICE_ACCOUNT_FOR_NEW_USER2@iam.gserviceaccount.com

ユーザーを削除する

次の更新コマンドでは、--remove-user-mappings フラグを使用して、マルチテナント クラスタから 2 人のユーザーを削除します。このフラグには、削除するユーザーのユーザー アカウントを指定します。

gcloud dataproc clusters update CLUSTER_NAME \
    --region=REGION \
    --remove-user-mappings=UserB@my-company.com,UserC@my-company.com

ユーザーを置き換える

更新コマンドと --identity-config-file フラグを使用して、既存のユーザーセットを新しいセットに置き換えることができます。このフラグは、1 つの更新コマンドでユーザーの追加と削除を行う場合に便利です。

gcloud dataproc clusters update CLUSTER_NAME \
    --region=REGION \
    --identity-config-file=identity-config.yaml

注:

  • --identity-config-file: 新しいユーザー アカウントとサービス アカウントのマッピングを含む YAML ファイル(ローカルまたは Cloud Storage)を指定します。
    --identity-config-file=LOCAL_FILE or gs://BUCKET/FOLDER/FILENAME
    
    マッピング ファイルの各行は、ユーザー アカウントをサービス アカウントにマッピングします。1 行目には user_service_account_mapping: ヘッダーが含まれています。
    user_service_account_mapping:
    new-user1@my-company.com:SERVICE_ACCOUNT_FOR_NEW_USER1@iam.gserviceaccount.com
    new-user2@my-company.com:SERVICE_ACCOUNT_FOR_NEW_USER2@iam.gserviceaccount.com