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

エージェントレス転送の場合、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 Cloud コンソール

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

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

REST API

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

サービス アカウントのメールアドレス(SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com)または一意の ID (123456789012345678901)を使用できます。

次に例を示します。

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": "SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com",
"transferSpec": {
    ...
  }
}

サービス アカウントの一意の ID を取得する

AWS S3 または Microsoft Azure ストレージへのフェデレーション アクセスを構成する場合、または REST API リクエストでサービス アカウントを指定する場合は、ユーザー管理のサービス アカウントの一意の ID が必要になることがあります。

uniqueId を取得するには:

Google Cloud コンソール

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

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

  2. サービス アカウントのメールアドレスをクリックします。

  3. [詳細] タブで、[一意の ID] を見つけます。

gcloud CLI

次の Google Cloud CLI コマンドを使用します。

gcloud iam service-accounts describe USER_MANAGED_SERVICE_ACCOUNT_EMAIL \
  --format='value(uniqueId)'