送信元へのアクセスを構成する: Cloud Storage

Storage Transfer Service は、次の 2 つの転送タイプで Cloud Storage ソースバケットを使用できます。

  • エージェントレス転送: Cloud Storage から Cloud Storage、Cloud Storage から AWS S3、Cloud Storage から Azure Blob Storage などのクラウド間転送。権限は Storage Transfer Service サービス エージェントに付与されます。

  • エージェント駆動型の転送: 転送エージェントとエージェント プールを使用するファイル システムまたはオンプレミス ストレージに関連する転送。権限は、サービス エージェントと転送エージェント アカウントの両方に付与する必要があります。

Google Cloud コンソールでの権限の自動付与

Google Cloud コンソールを使用してエージェントレス転送を作成し、必要なユーザー権限がある場合、サービス エージェントには、ソースバケットに必要な権限が自動的に付与されます。

このページの手順はスキップできます。必要に応じて、宛先へのアクセスを構成してから、転送を作成します。

前提条件

  • ユーザー アカウントの権限: このページに記載されている必要な IAM ロールを付与するには、ユーザー アカウント(またはユーザー管理のサービス アカウント)に、ソースバケットとエージェント プール プロジェクトの IAM ポリシーを変更する権限が必要です。ユーザー アカウントの要件の詳細については、ユーザー アカウントの権限をご覧ください。

  • エージェントベースの転送プロジェクトの権限: エージェントベースの転送の場合は、サービス エージェントと転送エージェント アカウントに必要なプロジェクト レベルのロールが構成されていることを確認します。エージェント ベースのプロジェクト レベルの権限をご覧ください。

サービス エージェントのメールアドレスを確認する

サービス エージェントは、転送ジョブを初めて作成するとき、gcloud transfer 設定コマンドを実行するとき、Google Cloud コンソールの [Storage Transfer] ページにアクセスするとき、または googleServiceAccounts.get を呼び出すときに自動的に作成されます。

Storage Transfer Service コマンドでサービス エージェントを識別するために使用されるサービス エージェントのメールアドレスを取得するには:

  1. googleServiceAccounts.get リファレンス ページに移動します。[Try this method] というインタラクティブ パネルが開きます。
  2. パネルの [Request parameters] にプロジェクト ID を入力します。
  3. [実行] をクリックします。

accountEmail の値をコピーします。project-PROJECT_NUMBER@storage-transfer-service. の形式を使用します。

必要な権限を付与する

転送タイプを選択して、アクセス権を付与する手順を確認します。

エージェントレス転送

次の事前定義ロールは、ソースバケットに必要な権限をサービス エージェントに付与します。

  • Storage レガシー バケット読み取り(roles/storage.legacyBucketReader)
  • さらに、次のいずれか:
    • Storage オブジェクト閲覧者(roles/storage.objectViewer)。ソース オブジェクトが保持される場合。
    • Storage オブジェクト ユーザー(roles/storage.objectUser)。転送後にソース オブジェクトを削除する場合(deleteObjectsFromSourceAfterTransfer)。
    • ストレージ オブジェクト管理者(roles/storage.objectAdmin): オブジェクト ACL(ACL_PRESERVE)を保持する場合。転送後のソース オブジェクトの削除もサポートします。

サービス エージェントをソースバケットの IAM ポリシーに追加します。

コンソール

  1. Google Cloud コンソールで Cloud Storage の [バケット] ページに移動します。

    [バケット] に移動

  2. ソースバケットの [バケット オーバーフロー] メニュー()をクリックします。
  3. [アクセス権を編集] を選択します。
  4. [+ プリンシパルを追加] をクリックします。
  5. [新しいプリンシパル] に、サービス エージェントのメールアドレスを入力します。
  6. [ロールの選択] プルダウン メニューから Storage Legacy Bucket Reader を選択します。
  7. [別のロールを追加] をクリックし、次のいずれかを選択します。
    • Storage Object Viewer
    • Storage Object User
    • Storage Object Admin
  8. [保存] をクリックします。

gcloud

次の gcloud storage コマンドを実行します。

gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
--member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/storage.legacyBucketReader
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
--member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/storage.OBJECT_ROLE

次のように置き換えます。

  • BUCKET_NAME: ソースバケットの名前。
  • SERVICE_AGENT_EMAIL: サービス エージェントのメールアドレス。
  • OBJECT_ROLE: 転送オプションに応じて、次のいずれかを選択します。
  • objectViewer: ソース オブジェクトを保持する場合。
  • objectUser: 転送後にソース オブジェクトを削除する場合。
  • objectAdmin: オブジェクト ACL を保持する場合。転送後のソース オブジェクトの削除もサポートしています。

REST API

  1. リクエストを認証するためのアクセス トークンを生成します。gcloud CLI を使用している場合は、次のコマンドを実行します。

    gcloud auth print-access-token
  2. 既存のバケット IAM ポリシー(GET https://storage./storage/v1/b/<var>BUCKET_NAME</var>/iam)を取得し、次のバインディングを bindings 配列に追加して、統合されたポリシーを source_policy.json として保存します。

    {
    "bindings": [
      {
        "role": "roles/storage.legacyBucketReader",
        "members": ["serviceAccount:SERVICE_AGENT_EMAIL"]
      },
      {
        "role": "roles/storage.OBJECT_ROLE",
        "members": ["serviceAccount:SERVICE_AGENT_EMAIL"]
      }
    ]
    }

    次のように置き換えます。

    • SERVICE_AGENT_EMAIL: サービス エージェントのメールアドレス。
    • OBJECT_ROLE: ソース オブジェクトを保持する場合は objectViewer、ソース オブジェクトを削除する場合は objectUser、オブジェクト ACL を保持する場合は objectAdmin を選択します。
  3. curl を使用して PUT リクエストを送信します。

    curl -X PUT --data-binary @source_policy.json \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      -H "Content-Type: application/json" \
      "https://storage./storage/v1/b/BUCKET_NAME/iam"

    次のように置き換えます。

    • OAUTH2_TOKEN: ステップ 1 で生成された OAuth 2.0 アクセス トークン。
    • BUCKET_NAME: ソースバケットの名前。

エージェント主導の転送

次の事前定義ロールは、サービス エージェントにソースバケットに対する必要なアクセス権を付与します。

  • Storage レガシー バケット読み取り(roles/storage.legacyBucketReader)
  • Storage オブジェクト作成者(roles/storage.objectCreator)

次のロールは、転送エージェント アカウントに転送元バケットに対する必要なアクセス権を付与します。

  • ソース オブジェクトを保持する場合はStorage オブジェクト閲覧者(roles/storage.objectViewer)、転送後にソース オブジェクトを削除する場合はStorage オブジェクト ユーザー(roles/storage.objectUser)。

これらのロールをソースバケットに付与します。

コンソール

  1. Google Cloud コンソールで Cloud Storage の [バケット] ページに移動します。

    [バケット] に移動

  2. ソースバケットのバケット オーバーフロー メニュー()をクリックし、[編集権限] を選択します。
  3. [+ プリンシパルを追加] をクリックします。
  4. [新しいプリンシパル] に、サービス エージェントのメールアドレスを入力します。
  5. [ロールの選択] プルダウン メニューから Storage Legacy Bucket Reader と Storage Object Creator を選択します。
  6. もう一度 [+ プリンシパルを追加] をクリックします。
  7. 転送エージェント アカウントのメールアドレスを入力します。これは、転送エージェントのインストール時に使用されるユーザー アカウントまたはサービス アカウントです。たとえば、my-agent-sa@PROJECT_ID. や user@example.com です。
  8. 転送元オブジェクトを保持する場合は Storage Object Viewer を選択し、転送後に転送元オブジェクトを削除する場合は Storage Object User を選択します。
  9. [保存] をクリックします。

gcloud

  1. サービス エージェントに、バケット メタデータの読み取りロールと転送ログの書き込みロールを付与します。

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/storage.legacyBucketReader
    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/storage.objectCreator
  2. 転送エージェント アカウントにオブジェクト アクセスロールを付与します。

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member=serviceAccount_OR_user:TRANSFER_AGENT_ACCOUNT --role=roles/storage.OBJECT_ROLE

    次のように置き換えます。

    • BUCKET_NAME: ソースバケットの名前。
    • SERVICE_AGENT_EMAIL: サービス エージェントのメールアドレス。
    • serviceAccount_OR_user: 転送エージェント アカウントがサービス アカウントの場合は serviceAccount を指定します。エージェントがユーザー アカウントでインストールされている場合は user を指定します。
    • TRANSFER_AGENT_ACCOUNT: 転送エージェントをインストールしたアカウントのメールアドレス。例: my-agent-sa@PROJECT_ID.、user@example.com
    • OBJECT_ROLE: ソース オブジェクトを保持する場合は objectViewer を指定し、転送後にソース オブジェクトを削除する場合は objectUser を指定します。

REST API

  1. リクエストを認証するためのアクセス トークンを生成します。gcloud CLI を使用している場合は、次のコマンドを実行します。

    gcloud auth print-access-token
  2. 既存のバケット IAM ポリシー(GET https://storage./storage/v1/b/<var>BUCKET_NAME</var>/iam)を取得し、次のバインディングを bindings 配列に追加して、統合されたポリシーを agent_source_policy.json として保存します。

    {
      "bindings": [
        {
          "role": "roles/storage.legacyBucketReader",
          "members": ["serviceAccount:SERVICE_AGENT_EMAIL"]
        },
        {
          "role": "roles/storage.objectCreator",
          "members": ["serviceAccount:SERVICE_AGENT_EMAIL"]
        },
        {
          "role": "roles/storage.OBJECT_ROLE",
          "members": ["serviceAccount_OR_user:TRANSFER_AGENT_ACCOUNT"]
        }
      ]
    }

    次のように置き換えます。

    • SERVICE_AGENT_EMAIL: サービス エージェントのメールアドレス。
    • serviceAccount_OR_user: 転送エージェント アカウントがサービス アカウントの場合は serviceAccount を指定します。エージェントがユーザー アカウントでインストールされている場合は user を指定します。
    • TRANSFER_AGENT_ACCOUNT: 転送エージェントをインストールしたアカウントのメールアドレス。例: my-agent-sa@PROJECT_ID.、user@example.com
    • OBJECT_ROLE: ソース オブジェクトを保持する場合は objectViewer を指定し、転送後にソース オブジェクトを削除する場合は objectUser を指定します。
  3. curl を使用してバケット ポリシーを更新します。

    curl -X PUT --data-binary @agent_source_policy.json \
        -H "Authorization: Bearer OAUTH2_TOKEN" \
        -H "Content-Type: application/json" \
        "https://storage./storage/v1/b/BUCKET_NAME/iam"

    次のように置き換えます。

    • OAUTH2_TOKEN: ステップ 1 で生成された OAuth 2.0 アクセス トークン。
    • BUCKET_NAME: ソースバケットの名前。

プロジェクト間の Cloud Storage 転送

異なる Google Cloud プロジェクトの Cloud Storage バケット間でオブジェクトを転送するには、転送元バケットと転送先バケットの両方で、転送を作成するプロジェクトのサービス エージェントに権限を付与する必要があります。

転送を作成するユーザー アカウントまたはユーザー管理のサービス アカウントには、転送ジョブが作成されるプロジェクトに対する権限のみが必要です。

プロジェクト間の転送にロールを付与するには:

  1. 転送を実行するプロジェクトのサービス エージェントのメールアドレスを取得します。サービス エージェントのメールアドレスを確認するをご覧ください。
  2. 転送元バケットで、そのサービス エージェントに次のロールを付与します。
    • Storage レガシー バケット読み取り(roles/storage.legacyBucketReader)
    • さらに、次のいずれかのオブジェクト ロール:
      • Storage オブジェクト閲覧者(roles/storage.objectViewer)。ソース オブジェクトを保持する場合。
      • Storage オブジェクト ユーザー(roles/storage.objectUser)。転送後にソース オブジェクトを削除する場合(deleteObjectsFromSourceAfterTransfer)。
      • ストレージ オブジェクト管理者(roles/storage.objectAdmin): オブジェクト ACL(ACL_PRESERVE)を保持する場合。転送後のソース オブジェクトの削除もサポートします。
  3. 転送先バケットで、同じサービス エージェントに次のロールを付与します。
    • Storage レガシー バケット読み取り(roles/storage.legacyBucketReader)
    • Storage オブジェクト ユーザー(roles/storage.objectUser)。オブジェクト ACL(ACL_PRESERVE)を保持する場合は Storage オブジェクト管理者(roles/storage.objectAdmin)。

宛先バケットへのアクセス権を付与する手順ガイドについては、シンクへのアクセスを構成する: Cloud Storage をご覧ください。

組織内アクセス制限

組織に組織のポリシーの制約が適用されている場合は、プロジェクト間のサービス エージェント アクセスが許可されていることを確認します。

  • ドメイン制限付き共有(constraints/iam.allowedPolicyMemberDomains): バケットをホストするプロジェクトのポリシーで、サービス エージェントを含むメンバー ドメインを許可する必要があります。ドメインの制限をご覧ください。
  • プロジェクト間サービス アカウントの使用の無効化(constraints/iam.disableCrossProjectServiceAccountUsage): この制約によってプロジェクト間サービス アカウントへのアクセスがブロックされないようにします。サービス アカウントの制限をご覧ください。
  • VPC Service Controls: バケットが異なるサービス境界に属している場合は、転送通信を許可する上り(内向き)ルールと下り(外向き)ルールを構成します。クラウド オブジェクト ストレージ転送用に VPC Service Controls を構成するをご覧ください。

きめ細かい権限のリファレンス

転送タイプを選択して、必要なロールと権限を確認します。

エージェントレス転送

エージェントレス転送の場合、Storage Transfer Service サービス エージェントに権限を付与する必要があります。

権限 説明
storage.buckets.get サービス エージェントにバケット ロケーションの取得を許可します。
storage.objects.list サービス エージェントにバケット内のオブジェクトの一覧表示を許可します。
storage.objects.get サービス エージェントにバケット内のオブジェクトの読み取りを許可します。
storage.objects.delete サービス エージェントにバケット内のオブジェクトの削除を許可します。deleteObjectsFromSourceAfterTransfer が true の場合は必須です。
storage.objects.getIamPolicy ソース オブジェクトの ACL の読み取りを許可します。オブジェクト ACL の保持(ACL_PRESERVE)が有効になっている場合は必須。
storage.folders.list
storage.folders.get
フォルダの一覧表示と読み取りを許可します。階層型名前空間が有効になっているバケットから転送する場合に必要です。

エージェント主導の転送

Cloud Storage ソースからのエージェント ドリブン転送の場合、権限は次の 2 つのプリンシパルに分割されます。

  • サービス エージェント: バケットのメタデータとロケーションを解決するためのバケットレベルの読み取りアクセス権と、エージェント転送ログを書き込むためのオブジェクト作成アクセス権が必要です。

  • 転送エージェント アカウント: 転送エージェントの作成に使用されるサービス アカウントまたはユーザー アカウント。

サービス エージェントの権限

権限 説明
storage.buckets.get サービス エージェントにバケットのメタデータとロケーションの検査を許可します。
storage.objects.create Cloud Storage からファイル システムに転送するときに、サービス エージェントがエージェント転送ログをソースバケットに書き込めるようにします。

転送エージェント アカウントの権限

権限 説明
storage.objects.list エージェントがソースバケット内のオブジェクトを一覧表示できるようにします。
storage.objects.get エージェントがソースバケットからオブジェクトを読み取れるようにします。
storage.objects.delete deleteObjectsFromSourceAfterTransfer が有効になっている場合、エージェントがソース オブジェクトを削除できるようにします。
storage.folders.list
storage.folders.get
階層型名前空間が有効になっているバケットから転送するときに、エージェントがフォルダを一覧表示して読み取れるようにします。

次のステップ

宛先へのアクセスを構成する必要があります。