Dataproc サービス アカウント

このページでは、サービス アカウントと VM アクセス スコープの説明と、Dataproc でそれらを使用する方法が記載されています。

サービス アカウントとは

サービス アカウントは、Compute Engine 仮想マシン(VM)インスタンスで稼働するサービスやアプリケーションが他の Google Cloud APIs との対話に使用できる特殊なアカウントです。アプリケーションは、サービス アカウントの認証情報を使用して一連の API に対する認証を得て、サービス アカウントに付与された権限の範囲内で VM に対するアクションを実行できます。

Dataproc サービス アカウント

下に示すサービス アカウントには、クラスタが存在するプロジェクトで Dataproc アクションを実行するために必要な権限があります。

  • Dataproc サービス エージェントのサービス アカウント: Dataproc は、Dataproc ユーザーの Google Cloud プロジェクトに Dataproc サービス エージェントのロールでこのサービス アカウントを作成します。クラスタを作成するとき、このサービス アカウントをカスタム VM サービス アカウントに置き換えることはできません。 このサービス エージェント アカウントを使用すれば、クラスタ VM の作成、更新、削除などの Dataproc コントロール プレーンの処理を実行できます(Dataproc サービス エージェント(コントロール プレーン ID)をご覧ください)。

    デフォルトでは、Dataproc は service-[project-number]@dataproc-accounts.iam.gserviceaccount.com をサービス エージェント アカウントとして使用します。そのサービス アカウントに権限がない場合、Dataproc は Google API サービス エージェント アカウント[project-number]@cloudservices.gserviceaccount.com)を使用して、コントロール プレーン オペレーションを行います。

共有 VPC ネットワーク: クラスタで共有 VPC ネットワークを使用する場合、共有 VPC 管理者は、上記のサービス アカウントの両方に、共有 VPC ホスト プロジェクト用のネットワーク ユーザーのロールを付与する必要があります。詳しくは以下をご覧ください。

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 サービス アカウントを使用すると、クラスタに対してプロジェクト リソースに対するきめ細かいアクセス権を付与できます。

準備手順

  1. クラスタが作成されるプロジェクト内にカスタム VM サービス アカウントを作成します。

  2. カスタム 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 サービス アカウントに付与する必要があります。

クラスタを作成する

  • プロジェクトにクラスタを作成します。

gcloud コマンド

gcloud dataproc clusters 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 を完了する際には、次のフィールドを設定します。

コンソール

Google Cloud コンソールでの Dataproc VM サービス アカウントの設定はサポートされていません。クラスタを作成するときに、Google Cloud コンソールの Dataproc の [クラスタの作成] ページの [セキュリティの管理] パネルの [プロジェクト アクセス] セクションで [このクラスタのクラウド プラットフォーム スコープを有効にする] をクリックして、クラスタ VM の cloud-platform アクセス スコープを設定できます。

別のプロジェクトのカスタム VM サービス アカウントを使用してクラスタを作成する

クラスタを作成するときに、デフォルトの VM サービス アカウントを使用する代わりに、クラスタが Dataproc データ プレーン オペレーションに使用するカスタム VM サービス アカウントを指定できます(クラスタの作成後にカスタム VM サービス アカウントを指定することはできません)。IAM ロールが割り当てられたカスタム VM サービス アカウントを使用すると、プロジェクト リソースに対するきめ細かいアクセス権をクラスタに付与できます。

準備手順

  1. サービス アカウント プロジェクト(カスタム VM サービス アカウントが存在するプロジェクト):

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

    2. Dataproc API を有効にします。

      API を有効にする

  2. メール アカウント(クラスタを作成するユーザー)に、サービス アカウント プロジェクトのサービス アカウント ユーザーのロールを付与します。また、より細かく制御する場合は、サービス アカウント プロジェクトの 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 の形式で指定します。

  3. カスタム 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"
     
  4. クラスタ プロジェクトの 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"
    
  5. クラスタ プロジェクトの Compute Engine サービス エージェント サービス アカウントに、サービス アカウント プロジェクトの(より細かく制御するには、サービス アカウント プロジェクトのカスタム VM サービス アカウントの)サービス アカウント トークン作成者のロールを付与します。これにより、クラスタ プロジェクトの Compute Engine サービス エージェント サービス アカウントに、サービス アカウント プロジェクトのカスタム Dataproc VM サービス アカウントのトークンを作成する権限が付与されます。

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

    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"
     

クラスタを作成する

次のステップ