Dataproc サービス アカウント

このページでは、サービス アカウントと 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 データプレーンのオペレーションに必要な権限をはじめとして、ほとんどの Google Cloud サービスのリソースを作成および削除する権限が含まれています。

    カスタム サービス アカウント: クラスタの作成時にカスタム サービス アカウントを指定する場合は、そのカスタム サービス アカウントに、Dataproc データプレーンのオペレーションに必要な権限を付与する必要があります。これは、サービス アカウントに Dataproc Worker ロールを割り当てることで実現できます。このロールには、Dataproc データプレーンのオペレーションに必要な最小限の権限が含まれているからです。BigQuery に対するデータの読み出しや書き込みといったその他のオペレーションに必要な権限を付与するには、追加のロールが必要です。

  • 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 クラスタの 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 を完了する際は、次のフィールドを設定します。

Console

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

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

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

予備の手順

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

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

    2. Enable the Dataproc API.

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

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

    gcloud CLI の例:

    • 次のサンプル コマンドでは、クラスタ プロジェクトの Google API サービス エージェント サービス アカウントに、サービス アカウント トークン作成者のロールをプロジェクト レベルで付与します。
    gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
        --member=serviceAccount:CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com \
        --role="roles/iam.serviceAccountTokenCreator"
     
    • 次のサンプル コマンドでは、クラスタ プロジェクトの Google API サービス エージェント サービス アカウントに、サービス アカウント トークン作成者のロールを VM サービス アカウント レベルで付与します。Google API
    gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \
        --member=serviceAccount:CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com \
        --role="roles/iam.serviceAccountTokenCreator"
     
  6. クラスタ プロジェクトの 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"
     

クラスタを作成する

次のステップ