Apache Spark 向け Google Cloud Serverless サービス アカウント

Apache Spark 向け Serverless バッチ ワークロードとインタラクティブ セッションは エンドユーザーまたはサービスアカウントの認証情報を使用して実行されます。サービス アカウント の認証情報を使用する場合、バッチ ワークロードまたは インタラクティブ セッションの実行に使用されるサービス アカウントは、バッチまたはセッションのランタイム バージョンによって異なります。

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

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

3.0 以降のランタイム サービス アカウント

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

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

  • Cloud Logging と Cloud Monitoring
  • getheartbeatmintOAuthToken などの Dataproc Resource Manager ノードの基本オペレーション

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

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

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

    IAM に移動

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

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

    次の図は、Apache Spark 向け Serverless がデフォルトでワークロードまたはセッション サービス アカウントとして使用する Compute Engine のデフォルトのサービス アカウント project_number-compute@developer.gserviceaccount.com に含まれている必要な Dataproc ワーカー ロール を示しています。

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

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

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

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

設定の手順

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

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

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

    2. Enable the Dataproc API.

      Roles required to enable APIs

      To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

      Enable the 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. サービス アカウントに、バッチ プロジェクトに対する Dataproc ワーカー のロールを付与します。

      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. Dataproc サービス エージェント サービス アカウントに、サービス アカウント プロジェクトの(より細かく制御する場合はサービス アカウント プロジェクトのサービス アカウントの)サービス アカウント ユーザーサービス アカウント トークン作成者のロールを付与します。これにより、 バッチ プロジェクトの Dataproc サービス エージェント サービス アカウントに、 サービス アカウント プロジェクトのサービス アカウント用のトークンを作成することを許可します。

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

      gcloud CLI の例:

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

      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"
      

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

      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"
      

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

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

権限に基づくエラーのトラブルシューティング

バッチ ワークロードまたはセッションで使用されるサービス アカウントの権限が正しくないか、不十分な場合、「Driver compute node failed to initialize for batch in 600 seconds」というエラー メッセージが報告され、バッチまたはセッション 作成の失敗につながる可能性があります。このエラーは、割り当てられたタイムアウト期間内に Spark ドライバ を起動できなかったことを示します。これは、 リソースへの必要なアクセス権がないことが原因であることがよくあります。 Google Cloud

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

  • Dataproc ワーカー ロール(roles/dataproc.worker): このロールは、Apache Spark 向け Serverless が 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 の権限: 効果的なデバッグを行うには、サービス アカウントに Cloud Logging にログを書き込む権限が必要です。通常、 Logging Writer ロール(roles/logging.logWriter)で十分です。
  • dataproc.worker ロールがない: このコアロールがないと、 Apache Spark 向け Serverless インフラストラクチャはドライバ ノードを適切にプロビジョニングして 管理できません。

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

  • ネットワークまたはファイアウォールの問題: VPC Service Controls またはファイアウォール ルールにより、サービス アカウントが API またはリソースに アクセスできなくなることがあります。 Google Cloud

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

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

Apache Spark 向け Serverless のロールと権限のリストについては、 Apache Spark 向け Serverless の権限と IAM ロールをご覧ください。