シンクへのアクセスを構成する: Cloud Storage

Storage Transfer Service は、次の 2 種類の転送で Cloud Storage の宛先(シンク)バケットを使用できます。

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

  • エージェント駆動型の転送: 転送エージェントとエージェント プールを使用して、ファイル システム、HDFS、S3 互換ストレージから Cloud Storage に転送します。サービス エージェントと転送エージェント アカウントの両方に権限を付与する必要があります。

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.objectUser)。オブジェクト ACL(ACL_PRESERVE)を保持する場合は Storage オブジェクト管理者(roles/storage.objectAdmin)。

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

コンソール

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

    [バケット] に移動

  2. 宛先バケットの [バケット オーバーフロー] メニュー()をクリックします。
  3. [アクセス権を編集] を選択します。
  4. [+ プリンシパルを追加] をクリックします。
  5. [新しいプリンシパル] に、サービス エージェントのメールアドレスを入力します。
  6. [ロールの選択] プルダウン メニューから Storage Legacy Bucket Reader を選択します。
  7. [別のロールを追加] をクリックし、Storage Object User を選択します。オブジェクト ACL を保持する場合は、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.OBJECT_ROLE
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
--member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/storage.legacyBucketReader

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

  • BUCKET_NAME: 宛先バケットの名前。
  • SERVICE_AGENT_EMAIL: サービス エージェントのメールアドレス。
  • OBJECT_ROLE: デフォルトでは objectUser を指定します。オブジェクト ACL(ACL_PRESERVE)を保持する場合は objectAdmin を指定します。

REST API

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

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

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

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

  3. curl を使用して PUT リクエストを送信します。

    curl -X PUT --data-binary @sink_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.objectCreator)
  • Storage オブジェクト閲覧者(roles/storage.objectViewer)
  • Storage レガシー バケット読み取り(roles/storage.legacyBucketReader)

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

  • Storage オブジェクト ユーザー(roles/storage.objectUser)

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

コンソール

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

    [バケット] に移動

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

gcloud

  1. サービス エージェントにロギングと閲覧者のロールを付与します。

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/storage.objectCreator
    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/storage.objectViewer
    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/storage.legacyBucketReader
  2. 転送エージェント アカウントに書き込みロールと管理ロールを付与します。

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

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

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

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_sink_policy.json として保存します。

    {
      "bindings": [
        {
          "role": "roles/storage.objectCreator",
          "members": ["serviceAccount:SERVICE_AGENT_EMAIL"]
        },
        {
          "role": "roles/storage.objectViewer",
          "members": ["serviceAccount:SERVICE_AGENT_EMAIL"]
        },
        {
          "role": "roles/storage.legacyBucketReader",
          "members": ["serviceAccount:SERVICE_AGENT_EMAIL"]
        },
        {
          "role": "roles/storage.objectUser",
          "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
  3. curl を使用してバケット ポリシーを更新します。

    curl -X PUT --data-binary @agent_sink_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 Transfer Service サービス エージェントに権限を付与する必要があります。

権限 説明
storage.buckets.get サービス エージェントにバケットのメタデータとロケーションの検査を許可します。
storage.objects.create サービス エージェントに、転送されたオブジェクトを転送先バケットに書き込むことを許可します。
storage.objects.get 既存のオブジェクトとメタデータを表示できます。転送が、異なる場合またはなしの場合にシンク内のオブジェクトを上書きするように構成されている場合は必須です。
storage.objects.list 転送先バケット内のオブジェクトの一覧表示を許可します。オブジェクトがシンクにすでに存在するかどうかを確認する場合に必要です。
storage.objects.delete 転送先バケット内のオブジェクトの削除を許可します。上書きオプションまたは一意のオブジェクト削除オプションが有効になっている場合は必須です。
storage.objects.setIamPolicy 宛先バケットにオブジェクト ACL を設定できます。オブジェクト ACL の保持(ACL_PRESERVE)が有効になっている場合は必須。
storage.folders.create
storage.folders.get
フォルダの作成と読み取りを許可します。階層型名前空間が有効になっている転送先バケットに転送する場合に必要です。

エージェント主導の転送

Cloud Storage 宛先へのエージェント駆動型転送の場合、権限は次の 2 つのプリンシパルに分割されます。

  • サービス エージェント: 転送ログを書き込み、転送先バケットにオブジェクトが存在することを確認するための権限が必要です。

  • 転送エージェント アカウント: Cloud Storage にファイルを書き込む転送エージェントを実行するサービス アカウントまたはユーザー アカウント。

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

権限 説明
storage.buckets.get サービス エージェントにバケットのメタデータとロケーションの検査を許可します。
storage.objects.create バケットに転送ログを作成できるようにします。
storage.objects.get オブジェクトがすでに転送されているかどうかを確認できます。

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

権限 説明
storage.objects.create 転送中にエージェントが転送先バケットにオブジェクトを書き込めるようにします。
storage.objects.get エージェントが転送先バケット内のオブジェクト データとメタデータを読み取れるようにします。
storage.objects.list エージェントが転送先バケット内の既存のオブジェクトを一覧表示できるようにします。
storage.objects.delete シンク内のオブジェクトを上書きまたは削除するように転送が構成されている場合は必須です。
storage.multipartUploads.create
storage.multipartUploads.abort
storage.multipartUploads.listParts
storage.multipartUploads.list
エージェントが大きなファイルのマルチパート アップロードを実行できるようにします。roles/storage.objectUser に自動的に含まれます。
storage.folders.create
storage.folders.get
階層型名前空間が有効になっている転送先バケットに転送するときに、エージェントがフォルダを作成して読み取れるようにします。

次のステップ