このページでは、サービス アカウントと VM アクセス スコープの説明と、Dataproc でそれらを使用する方法が記載されています。
サービス アカウントとは
サービス アカウントは、Compute Engine 仮想マシン(VM)インスタンスで稼働するサービスやアプリケーションが他の Google Cloud APIs との対話に使用できる特殊なアカウントです。アプリケーションは、サービス アカウントの認証情報を使用して一連の API に対する認証を得て、サービス アカウントに付与された権限の範囲内で VM に対するアクションを実行できます。
Dataproc サービス アカウント
下に示すサービス アカウントには、クラスタが存在するプロジェクトで Dataproc アクションを実行するために必要な権限があります。
Dataproc VM サービス・アカウント: Dataproc クラスタ内の VM は、Dataproc データプレーンのオペレーションにこのサービス アカウントを使用します。クラスタを作成する際にVM サービス アカウントを指定しない限り、Compute Engine のデフォルトのサービス アカウント(
project_number-compute@developer.gserviceaccount.com
)が Dataproc VM サービス アカウントとして使用されます。デフォルトでは、Compute Engine のデフォルトのサービス アカウントには Dataproc Worker ロールが付与されます。このロールには、Dataproc データプレーンのオペレーションに必要な権限が含まれています。カスタム サービス アカウント: クラスタの作成時にカスタム サービス アカウントを指定する場合は、そのカスタム サービス アカウントに、Dataproc データプレーンのオペレーションに必要な権限を付与する必要があります。これは、サービス アカウントに Dataproc Worker ロールを割り当てることで実現できます。このロールには、Dataproc データプレーンのオペレーションに必要な権限が含まれているからです。BigQuery に対するデータの読み取りや書き込みといったその他のオペレーションに必要な権限を付与するには、追加のロールが必要です(詳細については、IAM サービス アカウントのロールを表示、管理するをご覧ください)。
Dataproc サービス エージェントのサービス アカウント: Dataproc は、Dataproc ユーザーの Google Cloud プロジェクトに Dataproc サービス エージェントのロールでサービス エージェント サービス アカウント
service-project_number@dataproc-accounts.iam.gserviceaccount.com
を作成します。クラスタを作成する際に、このサービス アカウントをカスタム VM サービス アカウントで置き換えることはできません。このサービス エージェント アカウントは、クラスタ VM の作成、更新、削除などの Dataproc コントロール プレーンのオペレーションを実行するために使用されます。
共有 VPC ネットワーク: クラスタで共有 VPC ネットワークを使用する場合、共有 VPC 管理者は、Dataproc サービス エージェント サービス アカウントに、共有 VPC ホスト プロジェクトのネットワーク ユーザーのロールを付与する必要があります。詳しくは以下をご覧ください。
IAM サービス アカウントのロールを表示、管理する
Dataproc VM サービス アカウントに付与されているロールを表示して管理する手順は次のとおりです。
Google Cloud コンソールの [IAM] ページに移動します。
[Google 提供のロール付与を含みます] をクリックします。
VM サービス アカウントにリストされているロールを表示します。次の図は、Dataproc がデフォルトで VM サービス アカウントとして使用する Compute Engine のデフォルトのサービス アカウント(
project_number-compute@developer.gserviceaccount.com
)に必要な Dataproc ワーカーロールを示しています。サービス アカウントの行に表示される鉛筆アイコンをクリックして、サービス アカウントのロールを付与または削除できます。
Dataproc VM アクセス スコープ
VM アクセス スコープと IAM ロールが連携して、Google Cloud API への VM によるアクセスを制限します。たとえば、クラスタ VM に https://www.googleapis.com/auth/storage-full
スコープのみが付与されている場合、クラスタ VM 上で実行されるアプリケーションは Cloud Storage API を呼び出すことができますが、広範な権限を含む BigQuery のロールが付与された VM サービス アカウントとして実行しても、BigQuery にリクエストを送信することはできません。
VM に広範な cloud-platform
スコープ(https://www.googleapis.com/auth/cloud-platform
)を付与してから、特定の IAM ロールを VM サービス アカウントに付与して VM アクセスを制限するのがベスト プラクティスです。
デフォルトの Dataproc VM スコープ。クラスタの作成時にスコープが指定されていない場合(gcloud dataproc cluster create --scopes を参照)、Dataproc VM には次のデフォルトのスコープセットが適用されます。
https://www.googleapis.com/auth/cloud-platform (clusters created with image version 2.1+
).
https://www.googleapis.com/auth/bigquery
https://www.googleapis.com/auth/bigtable.admin.table
https://www.googleapis.com/auth/bigtable.data
https://www.googleapis.com/auth/cloud.useraccounts.readonly
https://www.googleapis.com/auth/devstorage.full_control
https://www.googleapis.com/auth/devstorage.read_write
https://www.googleapis.com/auth/logging.write
クラスタの作成時にスコープを指定した場合、クラスタ VM には指定したスコープおよび(指定しない場合でも)次の最小の必要なスコープセットが設定されます。
https://www.googleapis.com/auth/cloud-platform (clusters created with image version 2.1+
).
https://www.googleapis.com/auth/cloud.useraccounts.readonly
https://www.googleapis.com/auth/devstorage.read_write
https://www.googleapis.com/auth/logging.write
カスタム VM サービス アカウントを使用してクラスタを作成する
クラスタを作成するときに、デフォルトの VM サービス アカウントの代わりに、クラスタが Dataproc データ プレーン オペレーションに使用するカスタム VM サービス アカウントを指定できます(クラスタの作成後は VM サービス アカウントを変更できません)。IAM ロールが割り当てされた VM サービス アカウントを使用すると、クラスタにプロジェクト リソースへのきめ細かいアクセス権を指定できます。
予備の手順
クラスタが作成されるプロジェクト内にカスタム VM サービス アカウントを作成します。
カスタム VM サービス アカウントに、プロジェクトに対する Dataproc ワーカーのロールと、BigQuery のリーダーとライターのロールなどのジョブに必要な追加のロールを付与します(Dataproc の権限と IAM のロールを参照)。
gcloud CLI の例:
- 次のサンプル コマンドでは、クラスタ プロジェクトのカスタム VM サービス アカウントに Dataproc ワーカーのロールをプロジェクト レベルで付与します。
gcloud projects add-iam-policy-binding CLUSTER_PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role="roles/dataproc.worker"
- カスタムロールを検討する: サービス アカウントに事前定義された Dataproc
Worker
のロールを付与する代わりに、ワーカーロールの権限を含み、storage.objects.*
の権限を制限するカスタムのロールをサービス アカウントに付与できます。- カスタムロールでは、少なくとも Dataproc のステージング バケットと一時バケット内のオブジェクトとクラスタ上で実行されるジョブに必要な追加のバケットのオブジェクトに対する
storage.objects.create
権限、storage.objects.get
権限、およびstorage.objects.update
権限を VM サービス アカウントに付与する必要があります。
- カスタムロールでは、少なくとも Dataproc のステージング バケットと一時バケット内のオブジェクトとクラスタ上で実行されるジョブに必要な追加のバケットのオブジェクトに対する
クラスタを作成する
- プロジェクトにクラスタを作成します。
gcloud コマンド
gcloud dataproc クラスタの create コマンドを使用して、カスタム VM サービス アカウントでクラスタを作成します。
gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --scopes=SCOPE
次のように置き換えます。
- CLUSTER_NAME: クラスタ名。プロジェクト内で一意にする必要があります。名前は先頭を小文字にして、51 文字以下の小文字、数字、ハイフンを使用できます。末尾をハイフンにすることはできません。削除されたクラスタの名前は再使用できます。
- REGION: クラスタが配置されるリージョン。
- SERVICE_ACCOUNT_NAME: サービス アカウント名。
- PROJECT_ID: 使用中の VM サービス アカウントが含まれるプロジェクトの Google Cloud プロジェクト ID。これは、クラスタが作成されるプロジェクトの ID か、別のクラスタにカスタム VM サービス アカウントを持つクラスタを作成している場合は、別のプロジェクトの ID になります。
- SCOPE: クラスタ VM インスタンスのアクセス スコープ(例:
https://www.googleapis.com/auth/cloud-platform
)。
REST API
clusters.create
API リクエストの一部として GceClusterConfig
を完了する際は、次のフィールドを設定します。
serviceAccount
: 別のプロジェクトの VM サービス アカウントを使用している場合を除き、サービス アカウントはクラスタが作成されるプロジェクト内に配置されます。serviceAccountScopes
: クラスタ VM インスタンスのアクセス スコープを指定します(例:https://www.googleapis.com/auth/cloud-platform
)。
Console
Google Cloud コンソールでの Dataproc VM サービス アカウントの設定はサポートされていません。クラスタを作成するときに、Google Cloud コンソールの Dataproc の [クラスタの作成] ページの [セキュリティの管理] パネルの [プロジェクト アクセス] セクションで [このクラスタのクラウド プラットフォーム スコープを有効にする] をクリックして、クラスタ VM の cloud-platform
アクセス スコープを設定できます。
別のプロジェクトの VM サービス アカウントを使用してクラスタを作成する
クラスタを作成するときに、デフォルトの VM サービス アカウントを使用する代わりに、クラスタが Dataproc データ プレーン オペレーションに使用するカスタム VM サービス アカウントを指定できます(クラスタの作成後にカスタム VM サービス アカウントを指定することはできません)。IAM ロールが割り当てされたカスタム VM サービス アカウントを使用すると、クラスタにプロジェクト リソースへのきめ細かいアクセス権を指定できます。
予備の手順
サービス アカウント プロジェクト(カスタム VM サービス アカウントが存在するプロジェクト):
Enable the Dataproc API.
メール アカウント(クラスタを作成するユーザー)に、サービス アカウント プロジェクトのサービス アカウント ユーザーのロールを付与します。また、より細かく制御する場合は、サービス アカウント プロジェクトの VM サービス アカウントのカスタムロールを付与します。
詳細: プロジェクト レベルでロールを付与する場合はプロジェクト、フォルダ、組織へのアクセスを管理するを、サービス アカウント レベルでサービス アカウントへロールを付与する場合はサービス アカウントに対するアクセス権の管理を参照してください。
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
の形式で入力します。カスタム VM サービス アカウントに、クラスタ プロジェクトに対する Dataproc ワーカーのロールを付与します。
gcloud CLI の例:
gcloud projects add-iam-policy-binding CLUSTER_PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \ --role="roles/dataproc.worker"
クラスタ プロジェクトの Dataproc サービス エージェント サービス アカウントに、サービス アカウント プロジェクトの(より細かく制御する場合はサービス アカウント プロジェクトのカスタム VM サービス アカウントの)サービス アカウント ユーザーとサービス アカウント トークン作成者のロールを付与します。これにより、クラスタ プロジェクトの Dataproc サービス エージェント サービス アカウントに、サービス アカウント プロジェクトのカスタム Dataproc VM サービス アカウント用のトークンを作成することを許可します。
詳細: プロジェクト レベルでロールを付与する場合はプロジェクト、フォルダ、組織へのアクセスを管理するを、サービス アカウント レベルでサービス アカウントへロールを付与する場合はサービス アカウントに対するアクセス権の管理を参照してください。
gcloud CLI の例:
- 次のサンプル コマンドでは、クラスタ プロジェクトの Dataproc サービス エージェント サービス アカウントに、サービス アカウント ユーザーとサービス アカウント トークン作成者のロールをプロジェクト レベルで付与します。
gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member=serviceAccount:service-CLUSTER_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member=serviceAccount:service-CLUSTER_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountTokenCreator"
- 次のサンプル コマンドでは、クラスタ プロジェクトの Dataproc サービス エージェント サービス アカウントに、サービス アカウント ユーザーとサービス アカウント トークン作成者のロールを VM サービス アカウント レベルで付与します。
gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \ --member=serviceAccount:service-CLUSTER_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-CLUSTER_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountTokenCreator"
クラスタ プロジェクトの Compute Engine サービス エージェント サービス アカウントに、サービス アカウント プロジェクトの(より細かく制御するには、サービス アカウント プロジェクトのカスタム VM サービス アカウントの)サービス アカウント トークン作成者のロールを付与します。これにより、サービス アカウント プロジェクト内のカスタム Dataproc VM サービス アカウント用のトークンを作成する権限を、クラスタ プロジェクトの Compute Agent サービス エージェント サービス アカウントに付与します。
詳細: プロジェクト レベルでロールを付与する場合はプロジェクト、フォルダ、組織へのアクセスを管理するを、サービス アカウント レベルでサービス アカウントへロールを付与する場合はサービス アカウントに対するアクセス権の管理を参照してください。
gcloud CLI の例:
- 次のサンプル コマンドでは、クラスタ プロジェクトの Compute Engine サービス エージェント サービス アカウントに、サービス アカウント トークン作成者のロールをプロジェクト レベルで付与します。
gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member=serviceAccount:service-CLUSTER_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountTokenCreator"
- 次のサンプル コマンドでは、クラスタ プロジェクトの Compute Engine サービス エージェント サービス アカウントに、サービス アカウント トークン作成者のロールを VM サービス アカウント レベルで付与します。
gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \ --member=serviceAccount:service-CLUSTER_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountTokenCreator"
クラスタを作成する
次のステップ
- サービス アカウント
- Dataproc の権限と IAM ロール
- Dataproc のプリンシパルと役割
- Dataproc サービス アカウント ベースの安全なマルチテナンシー
- Dataproc 個人用クラスタ認証
- Dataproc Granular IAM