Managed Service for Apache Spark サービス アカウント

Managed Service for Apache Spark のサービス アカウントを使用すると、バッチ ワークロードとインタラクティブ セッションを認証して、 Google Cloud リソースに安全にアクセスできます。ワークロードは、エンドユーザーまたはサービス アカウントの認証情報を使用して実行されます。サービス アカウントの認証情報を使用する場合、ワークロードの実行に割り当てられる特定のサービス アカウントは、バッチまたはセッションのランタイム バージョンによって異なります。

3.0 より前のランタイム サービス アカウント

サービス アカウントの認証情報を使用する 3.0 より前の Spark ランタイム バージョンでは、Compute Engine のデフォルトのサービス アカウントまたはユーザー指定のカスタム サービス アカウントを使用して、バッチ ワークロードを送信するか、インタラクティブ セッションを作成します。

3.0+ ランタイム サービス アカウント

サービス アカウントの認証情報を使用する Spark ランタイム バージョン 3.0 以降では、ユーザー指定のカスタム サービス アカウントを使用して、バッチ ワークロードを送信するか、インタラクティブ セッションを作成します。

Managed Service for Apache Spark 3.0 以降のランタイムは、Managed Service for Apache Spark ユーザーの Google Cloud プロジェクトに Dataproc Resource Manager ノード サービス エージェントのロールで Dataproc Resource Manager ノード サービス エージェントのサービス アカウント service-project-number@gcp-sa-dataprocrmnode.iam.gserviceaccount.com を作成します。このサービス アカウントは、ワークロードが作成されたプロジェクトにある Managed Service for Apache Spark リソースに対して、次のシステム オペレーションを実行します。

  • Cloud Logging と Cloud Monitoring
  • Managed Service for Apache Spark Resource Manager ノードの基本オペレーション(get、heartbeat、mintOAuthToken など)

IAM サービス アカウントのロールを表示して管理する

バッチ ワークロードまたはセッション サービス アカウントに付与されているロールを表示して管理するには、次の操作を行います。

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

    [Identity and Access Management(IAM)] に移動

  2. [Google 提供のロール付与を含める] をクリックします。

  3. バッチ ワークロードまたはセッションのデフォルトまたはカスタム サービス、デフォルトまたはカスタム サービス アカウントにリストされているロールを表示します。

    次の図は、Compute Engine のデフォルトのサービス アカウント(project_number-compute@developer.gserviceaccount.com)に必要な Managed Service for Apache Spark ワーカーロールが一覧表示されています。このアカウントは、Managed Service for Apache Spark がデフォルトでワークロードまたはセッション サービス アカウントとして使用します。

    IAM コンソールでの Compute Engine のデフォルト サービス アカウントの Dataproc ワーカーロール
    Google Cloud コンソールの IAM セクションで Compute Engine のデフォルト サービス アカウントに割り当てられた Managed Service for Apache Spark ワーカーロール。
  4. サービス アカウントの行に表示されている鉛筆アイコンをクリックして、サービス アカウントのロールを付与または削除できます。

プロジェクト間サービス アカウントの使用方法

バッチ ワークロード プロジェクト(バッチが送信されるプロジェクト)とは異なるプロジェクトのサービス アカウントを使用するバッチ ワークロードを送信できます。このセクションでは、サービス アカウントが存在するプロジェクトを service account project と呼び、バッチが送信されるプロジェクトを batch project と呼びます。

プロジェクト間サービス アカウントを使用してバッチ ワークロードを実行する理由考えられる理由の 1 つは、他のプロジェクトのサービス アカウントに、そのプロジェクトのリソースへのきめ細かいアクセス権を提供する IAM ロールが割り当てられていることです。

設定の手順

このセクションの例は、3.0 より前のランタイム バージョンで実行されるバッチ ワークロードの送信に適用されます。

  1. サービス アカウント プロジェクト:

    1. プロジェクト間でのサービス アカウントの接続を有効にします。

    2. Managed Service for Apache Spark API が有効になっていない場合は有効にします。

      API を有効にするために必要なロール

      API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を介してこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を介してこの権限を取得できます。ロールを付与する方法を確認する。

      API の有効化

    3. メール アカウント(クラスタを作成するユーザー)に、サービス アカウント プロジェクトのサービス アカウント ユーザーのロールを付与します。また、より細かく制御する場合は、サービス アカウント プロジェクトのサービス アカウントのカスタムロールを付与します。

      詳細については、プロジェクト レベルでロールを付与する場合はプロジェクト、フォルダ、組織へのアクセスを管理するを、サービス アカウント レベルでサービス アカウントへロールを付与する場合はサービス アカウントに対するアクセス権の管理をご覧ください。

      gcloud CLI の例:

      次のサンプル コマンドでは、ユーザーにサービス アカウントのユーザーロールをプロジェクト レベルで付与します。

      gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
          --member=USER_EMAIL \
          --role="roles/iam.serviceAccountUser"
      

      注:

      • USER_EMAIL: ユーザー アカウントのメールアドレスを user:user-name@example.com の形式で入力します。

      次のサンプル コマンドでは、ユーザーにサービス アカウントのユーザーロールをサービス アカウント レベルで付与します。

      gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \
          --member=USER_EMAIL \
          --role="roles/iam.serviceAccountUser"
      

      注:

      • USER_EMAIL: ユーザー アカウントのメールアドレスを user:user-name@example.com の形式で入力します。
    4. サービス アカウントに、バッチ プロジェクトに対する Managed Service for Apache Spark ワーカーのロールを付与します。

      gcloud CLI の例:

      gcloud projects add-iam-policy-binding BATCH_PROJECT_ID \
          --member=serviceAccount:SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
          --role="roles/dataproc.worker"
      
  2. バッチ プロジェクトで、次の操作を行います。

    1. Managed Service for Apache Spark サービス エージェント サービス アカウントに、サービス アカウント プロジェクトの(より細かく制御する場合はサービス アカウント プロジェクトのサービス アカウントの)サービス アカウント ユーザーとサービス アカウント トークン作成者のロールを付与します。これにより、バッチ プロジェクトの Managed Service for Apache Spark サービス エージェント サービス アカウントに、サービス アカウント プロジェクトのサービス アカウント用のトークンを作成することを許可します。

      詳細については、プロジェクト レベルでロールを付与する場合はプロジェクト、フォルダ、組織へのアクセスを管理するを、サービス アカウント レベルでサービス アカウントへロールを付与する場合はサービス アカウントに対するアクセス権の管理をご覧ください。

      gcloud CLI の例:

      次のコマンドは、バッチ プロジェクトの Managed Service for Apache Spark サービス エージェント サービス アカウントに、サービス アカウント ユーザーとサービス アカウント トークン作成者のロールをプロジェクト レベルで付与します。

      gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
          --member=serviceAccount:service-BATCH_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \
          --role="roles/iam.serviceAccountUser"
      
      gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
          --member=serviceAccount:service-BATCH_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \
          --role="roles/iam.serviceAccountTokenCreator"
      

      次のサンプル コマンドでは、バッチ プロジェクトの Managed Service for Apache Spark サービス エージェント サービス アカウントに、サービス アカウント ユーザーとサービス アカウント トークン作成者のロールをサービス アカウント レベルで付与します。

      gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \
          --member=serviceAccount:service-BATCH_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \
          --role="roles/iam.serviceAccountUser"
      
      gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \
          --member=serviceAccount:service-BATCH_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \
          --role="roles/iam.serviceAccountTokenCreator"
      
    2. バッチ プロジェクトの Compute Engine サービス エージェント サービス アカウントに、サービス アカウント プロジェクトの(より細かく制御するには、サービス アカウント プロジェクトのサービス アカウントの)サービス アカウント トークン作成者のロールを付与します。これにより、サービス アカウント プロジェクト内のサービス アカウント用のトークンを作成する権限を、バッチ プロジェクトの Compute Agent サービス エージェント サービス アカウントに付与します。

      詳細については、プロジェクト レベルでロールを付与する場合はプロジェクト、フォルダ、組織へのアクセスを管理するを、サービス アカウント レベルでサービス アカウントへロールを付与する場合はサービス アカウントに対するアクセス権の管理をご覧ください。

      gcloud CLI の例:

      次のサンプル コマンドでは、バッチ プロジェクトの Compute Engine サービス エージェント サービス アカウントに、サービス アカウント トークン作成者のロールをプロジェクト レベルで付与します。

      gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
          --member=serviceAccount:service-BATCH_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
          --role="roles/iam.serviceAccountTokenCreator"
      

      次のサンプル コマンドでは、クラスタ プロジェクトの Compute Engine サービス エージェント サービス アカウントに、サービス アカウント トークン作成者のロールをサービス アカウント レベルで付与します。

      gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \
          --member=serviceAccount:service-BATCH_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
          --role="roles/iam.serviceAccountTokenCreator"
      

バッチ ワークロードを送信する

設定手順を完了したら、バッチ ワークロードを送信できます。サービス アカウント プロジェクトのサービス アカウントを、バッチ ワークロードに使用するサービス アカウントとして指定します。

権限ベースのエラーのトラブルシューティング

バッチ ワークロードまたはセッションで使用されるサービス アカウントの権限が正しくないか不十分な場合、バッチまたはセッションの作成に失敗し、「ドライバ コンピューティング ノードが 600 秒以内にバッチの初期化に失敗しました」というエラー メッセージが表示されることがあります。このエラーは、Spark ドライバが割り当てられたタイムアウト期間内に起動できなかったことを示します。多くの場合、 Google Cloud リソースへの必要なアクセス権がないことが原因です。

この問題をトラブルシューティングするには、サービス アカウントに次の最小限のロールまたは権限が付与されていることを確認します。

  • Managed Service for Apache Spark ワーカーロール(roles/dataproc.worker): このロールは、Managed Service for Apache Spark が Spark ワークロードとセッションを管理して実行するために必要な権限を付与します。
  • Storage オブジェクト閲覧者(roles/storage.objectViewer)、Storage オブジェクト作成者(roles/storage.objectCreator)、または Storage オブジェクト管理者(roles/storage.admin): Spark アプリケーションが Cloud Storage バケットの読み取りまたは書き込みを行う場合、サービス アカウントにはバケットにアクセスするための適切な権限が必要です。たとえば、入力データが Cloud Storage バケットにある場合は、Storage Object Viewer が必要です。アプリケーションが出力を Cloud Storage バケットに書き込む場合は、Storage Object Creator または Storage Object Admin が必要です。
  • BigQuery データ編集者(roles/bigquery.dataEditor)または BigQuery データ閲覧者(roles/bigquery.dataViewer): Spark アプリケーションが BigQuery とやり取りする場合は、サービス アカウントに適切な BigQuery ロールが付与されていることを確認します。
  • Cloud Logging の権限: サービス アカウントには、効果的なデバッグのために Logging にログを書き込む権限が必要です。通常は、Logging Writer ロール(roles/logging.logWriter)で十分です。
  • dataproc.worker ロールがない: このコアロールがないと、Managed Service for Apache Spark インフラストラクチャはドライバノードを適切にプロビジョニングして管理できません。

  • Cloud Storage の権限が不十分: Spark アプリケーションが、必要なサービス アカウント権限なしで Cloud Storage バケットから入力データを読み取ろうとしたり、出力を書き込もうとしたりすると、重要なリソースにアクセスできないため、ドライバの初期化に失敗することがあります。

  • ネットワークまたはファイアウォールの問題: VPC Service Controls またはファイアウォール ルールにより、サービス アカウントによる Google Cloud API またはリソースへのアクセスが誤ってブロックされることがあります。

サービス アカウントの権限を確認して更新するには:

  1. Google Cloud コンソールの [IAM と管理] > [IAM] ページに移動します。
  2. バッチ ワークロードまたはセッションに使用されるサービス アカウントを見つけます。
  3. 必要なロールが割り当てられていることを確認します。追加されていない場合は、追加します。

Managed Service for Apache Spark のロールと権限の一覧については、Managed Service for Apache Spark の権限と IAM ロールをご覧ください。