サービス エージェントの権限をユーザー管理のサービス アカウントに委任する

エージェントレス転送の場合、Storage Transfer Service はデフォルトでサービス エージェントを使用して、ソースと宛先の間でデータを転送します。サービス エージェントに Cloud Storage バケットへのアクセス権を付与します。

プロジェクト内のすべての転送で同じ Storage Transfer Service サービス エージェントが使用されるため、すべての転送に関与するすべてのバケットに対する権限が必然的に付与されます。

または、バケット権限を複数のユーザー管理サービス アカウントに割り当てることもできます。これらのユーザー管理サービス アカウントには、特定の送信元バケットと宛先バケットに対する権限が付与され、特定のユーザー アカウント(転送ジョブを作成またはトリガーするアカウント)にも制限されます。

サンプル事例

次のシナリオでは、サービス エージェントとユーザー管理サービス アカウントを使用して、さまざまな権限オプションを示します。

各セクションを開くと、詳細が表示されます。

シナリオ 1: サービス エージェントのみ

このシナリオでは、すべての権限がサービス エージェントに付与されます。

  • サービス エージェントには、バケット A、B、C、D に対する書き込み権限が付与されます。

転送ジョブを作成する権限を持つユーザーは、バケット A、B、C、D との間で転送できます。

これは、Storage Transfer Service ユーザーがすべてのバケット内のデータの信頼できるユーザーであり、誤ったバケットとの間でデータを移動しないように転送ジョブを正しく構成できる場合に有効です。

シナリオ 2: ユーザー管理のサービス エージェントのみ

このシナリオでは、すべての権限がユーザー管理のサービス アカウントに付与されます。

  • ユーザー管理のサービス アカウント 1 に、バケット A と B に対する権限が付与されます。
  • ユーザー管理のサービス アカウント #2 には、バケット C と D に対する権限が付与されます。

さらに、

  • ユーザー Alpha にサービス アカウント #1 へのアクセス権が付与されます。
  • ユーザー Bravo にサービス アカウント #2 へのアクセス権が付与されます。
  • ユーザー Charlie にサービス アカウント #1 と #2 へのアクセス権が付与されます。

この例の場合は、次のようになります。

  • Alpha はバケット A とバケット B の間でのみ転送できます。
  • Bravo はバケット C と D の間でのみ転送できます。
  • Charlie は、バケット A と B の間、および C と D の間でのみ転送できます。
  • Charlie は、A と C、A と D、B と C、B と D の間で転送することはできません。

シナリオ 3: 混合権限

このシナリオでは、プロジェクトにサービス エージェントの権限とユーザー管理のサービス アカウントの権限が混在しています。

  • サービス エージェントには、バケット A とバケット B に対する書き込み権限が付与されます。
  • ユーザー管理のサービス アカウント 1 に、バケット C に対する読み取り専用権限と、バケット D に対する書き込み権限が付与されています。
  • ユーザー Alpha に、ユーザー管理サービス アカウント #1 へのアクセス権が付与されます。

この例の場合は、次のようになります。

  • 転送ジョブを作成する権限を持つユーザーは、バケット A とバケット B の間で転送できます。バケット C または D に転送することはできません。
  • ユーザー Alpha はバケット A とバケット B の間で移動できます。
  • Alpha はバケット C からバケット D に転送できます。
  • Alpha はバケット C からバケット A または B に転送できません。

実装の概要

実装は次のとおりです。

  • ユーザー管理のサービス アカウントを作成するか、既存のサービス アカウントを使用します。
  • 権限を付与します。
    • ユーザーがユーザー管理のサービス アカウントにアクセスできるようにします。
    • サービス エージェントがユーザー管理のサービス アカウントからアクセス トークンを生成できるようにします。
    • ユーザー管理のサービス アカウントがバケットにアクセスできるようにします。
  • ユーザーは、ユーザー管理のサービス アカウントを指定する転送ジョブを作成します。
  • Storage Transfer Service は、ユーザーにサービス アカウントに対する正しい権限が付与されていることを確認します。適切な権限が付与されていない場合、転送ジョブの作成は失敗します。
  • サービス エージェントは、ユーザー管理サービス アカウントの代わりに OAuth トークンを生成します。OAuth トークンにより、Storage Transfer Service は転送に関与するバケットにアクセスできます。
  • 転送ジョブが実行されます。
  • OAuth トークンは有効期間が短く、期限切れになります。トークンの有効期限が切れたときに転送ジョブが進行中の場合、Storage Transfer Service は新しいトークンを生成して転送を続行します。

権限の委任を設定する

手順に沿って、サービス エージェントのアクセス権をユーザー管理のサービス アカウントに委任します。

要件

  • 新しいユーザー マネージド サービス アカウントを作成するには、プロジェクトに対するサービス アカウントの作成(roles/iam.serviceAccountCreator)ロールが必要です。
  • ユーザーとサービス エージェントにユーザー管理サービス アカウントへのアクセス権を付与するには、ユーザー管理サービス アカウントまたはプロジェクトに対するサービス アカウント管理者(roles/iam.serviceAccountAdmin)ロールが必要です。

ユーザー管理のサービス アカウントを作成または特定する

新しいユーザー管理のサービス アカウントを作成することも、既存のサービス アカウントを使用することもできます。

  • ユーザー管理のサービス アカウントを作成するには、サービス アカウントを作成するの手順に沿って操作します。

  • 既存のユーザー管理サービス アカウントを使用するには、次の形式のメールアドレスが必要です。

    SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

サービス アカウントが転送ジョブとは異なるプロジェクトにある場合は、プロジェクト間でサービス アカウントの接続を有効にするをご覧ください。

ユーザーにアクセス権を付与する

新しいユーザー管理のサービス アカウントへのアクセス権をユーザー アカウントに付与し、サービス アカウント ユーザーロール(roles/iam.serviceAccountUser)を割り当てます。ユーザー アカウントは、転送ジョブの作成または更新に使用されるアカウントです。

Google Cloud コンソール

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

  2. プロジェクトを選択します。

  3. ユーザー管理のサービス アカウントのメールアドレスをクリックします。

  4. [権限] タブを選択します。

  5. [ アクセスを許可] をクリックします。

  6. ユーザーのメールアドレスを入力します。例: user1@example.com

  7. [ロール] プルダウン リストから [サービス アカウント ユーザー] を選択します。

  8. [保存] をクリックします。プリンシパルにサービス アカウントのロールが付与されます。

gcloud

プリンシパルにロールを付与するには、add-iam-policy-binding コマンドを実行します。

gcloud iam service-accounts add-iam-policy-binding USER_MANAGED_SERVICE_ACCOUNT_EMAIL \
  --member=PRINCIPAL --role=roles/iam.serviceAccountUser

次の変数を置き換えます。

  • USER_MANAGED_SERVICE_ACCOUNT_EMAIL: SA_NAME@PROJECT_ID.iam.gserviceaccount.com 形式のユーザー管理のサービス アカウントのメールアドレス。
  • PRINCIPAL: 転送ジョブを実行するユーザーのメールアドレス(user:name@example.com 形式)。

サービス エージェントへのアクセス権を付与する

サービス エージェントがユーザー管理のサービス アカウントからアクセス トークンを生成できるようにするには、サービス エージェントにユーザー管理のサービス アカウントへのアクセス権を付与し、サービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)を割り当てます。

アクセス権を付与するには、サービス エージェントのメールアドレスが必要です。サービス エージェントのメールアドレスを確認するには:

  1. googleServiceAccounts.get リファレンス ページに移動します。

    [Try this method] というインタラクティブ パネルが開きます。

  2. パネルの [Request parameters] にプロジェクト ID を入力します。ここで指定するプロジェクトは、Storage Transfer Service の管理に使用しているプロジェクトである必要があります。

  3. [実行] をクリックします。

    サービス エージェントのメールアドレスが accountEmail の値として返されます。形式は project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com です。

次に、サービス エージェントにユーザー管理のサービス アカウントへのアクセス権を付与します。

Google Cloud コンソール

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

  2. プロジェクトを選択します。

  3. ユーザー管理のサービス アカウントのメールアドレスをクリックします。

  4. [権限] タブを選択します。

  5. [ アクセスを許可] をクリックします。

  6. サービス エージェントのメールアドレスを入力します。

  7. [役割] プルダウン リストから、[サービス アカウント トークン作成者] を選択します。

  8. [保存] をクリックします。プリンシパルにサービス アカウントのロールが付与されます。

gcloud

プリンシパルにロールを付与するには、add-iam-policy-binding コマンドを実行します。

gcloud iam service-accounts add-iam-policy-binding USER_MANAGED_SERVICE_ACCOUNT_EMAIL \
  --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/iam.serviceAccountTokenCreator

次の変数を置き換えます。

  • USER_MANAGED_SERVICE_ACCOUNT_EMAIL: SA_NAME@PROJECT_ID.iam.gserviceaccount.com 形式のユーザー管理のサービス アカウントのメールアドレス。
  • SERVICE_AGENT_EMAIL: サービス エージェントのメールアドレス。

ユーザー管理のサービス アカウントにバケット権限を付与する

サービス エージェントではなく、ユーザー管理のサービス アカウントに、Google 管理のサービス エージェントの権限に記載されている権限を付与します。

ユーザー管理のサービス アカウントを使用して転送ジョブを作成する

適切な権限を付与したら、新しい転送ジョブを作成するときにユーザー管理のサービス アカウントを指定できます。

Google Cloud コンソール

手順に沿って転送を作成します。転送ジョブを確定する前に:

  1. [設定を選択] ページで、[サービス アカウントのタイプ] セクションを見つけます。
  2. [ユーザー管理サービス アカウント] を選択します。
  3. SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com の形式で、ユーザー管理サービス アカウントのメールアドレスを入力します。
  4. [作成] をクリックして転送を作成します。

REST API

transferJobs.create リクエストの serviceAccount フィールドの値として、ユーザー管理サービス アカウントを指定します。

値は projects/-/serviceAccounts/ACCOUNT_EMAIL_OR_UNIQUEID の形式にする必要があります。

文字列には、サービス アカウントのメールアドレス(SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com)または一意の ID(123456789012345678901)のいずれかを指定できます。- ワイルドカード文字は必須です。ワイルドカード文字をプロジェクト ID で置き換えると無効になります。

次に例を示します。

POST https://storagetransfer.googleapis.com/v1/transferJobs
{
"description": "A transfer using a user-managed service account for bucket permissions",
"status": "ENABLED",
"projectId": "PROJECT_ID",
"serviceAccount": "projects/-/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com",
"transferSpec": {
    ...
  }
}