このドキュメントでは、Identity and Access Management サービス アカウントのロールを表示して管理する方法について説明します。Serverless for Apache Spark のバッチ ワークロードまたはインタラクティブ セッションは、バッチ ワークロードを送信、セッションを作成、または セッション ランタイム テンプレートを作成するときにカスタム サービス アカウントを指定しない限り、Compute Engine のデフォルトのサービス アカウントとして実行されます。
セキュリティ要件: Serverless for Apache Spark ワークロードまたはセッションを実行するには、サービス アカウントの ActAs
権限が必要です。Service Account User
ロールにはこの権限が含まれています。サービス アカウントの権限の詳細については、サービス アカウントの認証用のロールをご覧ください。
必要な Dataproc ワーカーのロール
Apache Spark ワークロードまたはセッションのサービス アカウントには、IAM の Dataproc ワーカー ロールが必要です。Serverless for Apache Spark が使用する Compute Engine のデフォルトのサービス アカウント project_number-compute@developer.gserviceaccount.com
には、デフォルトでこのロールが付与されています。バッチ ワークロード、セッション、セッション テンプレートの作成時に別のサービス アカウントを指定する場合は、サービス アカウントに Dataproc ワーカーロールを付与する必要があります。Cloud Storage や BigQuery とのデータの読み書きなど、他のオペレーションには追加のロールが必要になる場合があります。
一部のプロジェクトでは、バッチ ワークロードまたはセッションのサービス アカウントにプロジェクトの編集者ロールが自動的に付与されている場合があります。このロールには、Dataproc ワーカーのロールの権限に加えて、Apache Spark 向け Serverless に必要のない追加の権限が含まれています。最小権限のセキュリティ ベスト プラクティスの原則に従うには、サービス アカウントの編集者ロールを Dataproc ワーカーロールに置き換えます。
権限ベースのエラーのトラブルシューティング
Serverless for Apache Spark バッチ ワークロードまたはセッションで使用されるサービス アカウントの権限が正しくないか、権限が不足していると、バッチまたはセッションの作成が失敗し、「Driver compute node failed to initialize for batch in 600 seconds」というエラー メッセージが報告されることがあります。このエラーは、割り当てられたタイムアウト時間内に Spark ドライバを起動できなかったことを示します。これは通常、 Google Cloud リソースへの必要なアクセス権がないことが原因です。
この問題を解決するには、サービス アカウントに次の最小限のロールまたは権限があることを確認します。
- Dataproc Worker ロール(
roles/dataproc.worker
): このロールは、Apache Spark 向け Serverless が Spark ワークロードとセッションを管理および実行するために必要な権限を付与します。 - Storage オブジェクト閲覧者(
roles/storage.objectViewer
)、Storage オブジェクト作成者(roles/storage.objectCreator
)、または Storage オブジェクト管理者(roles/storage.admin
): Spark アプリケーションが Cloud Storage バケットから読み取りまたは 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 用サーバーレス インフラストラクチャがドライバ ノードを適切にプロビジョニングして管理できません。Cloud Storage 権限が不足している: 必要なサービス アカウント権限がない状態で、Spark アプリケーションが Cloud Storage バケットから入力データを読み取ろうとしたり、Cloud Storage バケットに出力を書き込もうとしたりすると、重要なリソースにアクセスできないため、ドライバの初期化が失敗する可能性があります。
ネットワークまたはファイアウォールの問題: VPC Service Controls またはファイアウォール ルールにより、サービス アカウントの Google Cloud API またはリソースへのアクセスが誤ってブロックされることがあります。
サービス アカウントの権限を確認して更新するには:
- Google Cloud コンソールで、[IAM と管理] > [IAM] ページに移動します。
- Serverless for Apache Spark バッチ ワークロードまたはセッションに使用されるサービス アカウントを見つけます。
- 必要なロールが割り当てられていることを確認します。追加されていない場合は、追加します。
Serverless for Apache Spark のロールと権限の一覧については、Serverless for Apache Spark の権限と IAM ロールをご覧ください。
IAM サービス アカウントのロールを表示して管理する
Serverless for Apache Spark バッチ ワークロードまたはセッション サービス アカウントに付与されているロールを表示して管理するには、次の操作を行います。
Google Cloud コンソールで、[IAM] ページに移動します。
[Google 提供のロール付与を含める] をクリックします。
バッチ ワークロードまたはセッション サービス アカウントにリストされているロールを表示します。次の図は、Apache Spark 用 Serverless がデフォルトでワークロードまたはセッションのサービス アカウントとして使用する Compute Engine のデフォルトのサービス アカウント
project_number-compute@developer.gserviceaccount.com
に含まれている必要な Dataproc ワーカーロールを示しています。Google Cloud コンソールの IAM セクションで、Compute Engine のデフォルトのサービス アカウントに割り当てられた Dataproc ワーカーロール。 サービス アカウントの行に表示されている鉛筆アイコンをクリックして、サービス アカウントのロールを付与または削除できます。
プロジェクト間のサービス アカウント
バッチ ワークロード プロジェクト(バッチが送信されるプロジェクト)とは異なるプロジェクトのサービス アカウントを使用する Serverless for Apache Spark バッチ ワークロードを送信できます。このセクションでは、サービス アカウントが存在するプロジェクトを service account project
、バッチが送信されるプロジェクトを batch project
と呼びます。
バッチ ワークロードの実行にプロジェクト間サービス アカウントを使用する理由考えられる理由の 1 つは、他のプロジェクトのサービス アカウントに、そのプロジェクトのリソースへのきめ細かいアクセスを提供する IAM ロールが割り当てられている場合です。
設定の手順
サービス アカウント プロジェクトで:
Enable the Dataproc API.
メール アカウント(クラスタを作成するユーザー)に、サービス アカウント プロジェクトのサービス アカウント ユーザーのロールを付与します。また、より細かく制御する場合は、サービス アカウント プロジェクトのサービス アカウントのロールを付与します。
詳細については、プロジェクト レベルでロールを付与する場合はプロジェクト、フォルダ、組織へのアクセスを管理するを、サービス アカウント レベルでサービス アカウントへロールを付与する場合はサービス アカウントに対するアクセス権の管理を参照してください。
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
の形式で入力します。
サービス アカウントに、バッチ プロジェクトに対する 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"
バッチ プロジェクトでは、次の操作を行います。
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"
バッチ プロジェクトの 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"
バッチ ワークロードを送信する
設定手順を完了したら、バッチ ワークロードを送信できます。サービス アカウント プロジェクトで、バッチ ワークロードに使用するサービス アカウントを指定してください。