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

Storage Transfer Service は、サービス エージェントを使用して Cloud Storage ソースバケットからデータを移動します。このサービス エージェントは、初めて googleServiceAccounts.get を呼び出すときに作成されます。

ソースバケットは、サービス エージェントと同じプロジェクトに属している必要はありません。バケットがどのプロジェクトにあっても手順は同じです。

ユーザー権限

サービス エージェントに必要な権限を付与するには、ソースバケットに関連する権限が必要です。

  • storage.buckets.getIamPolicy
  • storage.buckets.setIamPolicy

必要な権限は、ストレージのレガシー バケット オーナーロール(roles/storage.legacyBucketOwner)またはストレージ管理者ロール(roles/storage.admin)に含まれています。

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

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

その場合は、このページの手順をスキップして転送の作成に進んでください。

必要な権限

サービス エージェントには、ソースバケットに対する次の権限が必要です。

権限 説明
storage.buckets.get サービス エージェントにバケット ロケーションの取得を許可します。
storage.objects.list サービス エージェントにバケット内のオブジェクトの一覧表示を許可します。
storage.objects.get サービス エージェントにバケット内のオブジェクトの読み取りを許可します。
storage.objects.create

サービス エージェントにバケット内のオブジェクトの作成を許可します。ファイル システムに転送される場合は必須です。

Storage Transfer Service は、ソースバケット内に 2 つのフォルダを作成してデータを挿入します。cloud-ingest/ にはファイル システム情報が含まれ、storage-transfer/ には転送ログが含まれます。

storage.objects.delete サービス エージェントにバケット内のオブジェクトの削除を許可します。deleteObjectsFromSourceAfterTransfertrue に設定する場合は必須です。
storage.objects.getIamPolicy サービス エージェントにソース オブジェクトの ACL の読み取りを許可します。オブジェクト ACL の保持(ACL_PRESERVE)が有効になっている場合は必須。

次の事前定義ロールを使用すると、必要な権限を付与できます。

  • 次のいずれか:
    • Storage オブジェクト閲覧者roles/storage.objectViewer)。別の Cloud Storage バケットに転送される場合。
    • Storage オブジェクト作成者roles/storage.objectCreator): ファイル システムに転送される場合。
  • さらに、次のいずれか:
    • ストレージのレガシー バケット書き込みroles/storage.legacyBucketWriter): オブジェクト削除権限が必要な場合。
    • Storage レガシー バケット読み取りroles/storage.legacyBucketReader): オブジェクト削除権限が必要ない場合。
  • また、ACL_PRESERVE を使用してオブジェクトの ACL を保持する場合:
    • ストレージ レガシー オブジェクト オーナーroles/storage.legacyObjectOwner

legacy ロールとしてマークされた Cloud Storage のロールは、バケットレベルでのみ付与できます。

Cloud Storage のロールと権限の一覧については、IAM ロールをご覧ください。

必要な権限を付与する

サービス エージェントに必要な権限を付与するには、次の手順を行います。

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

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

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

  2. パネルの [Request parameters] にプロジェクト ID を入力します。ここで指定するプロジェクトは Storage Transfer Service の管理に使用しているプロジェクトで、これは、ソースバケットのプロジェクトとは異なる場合があります。

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

    サービス エージェントのメールアドレスが accountEmail の値として返されます。この値をコピーします。

    サービス エージェントのメールアドレスは project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com の形式です。

バケットレベルのポリシーにサービス エージェントを追加する

コンソール

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

    [バケット] に移動

  2. プリンシパルにロールを付与するバケットと関連付けられている [バケット オーバーフロー] メニュー()をクリックします。

  3. [アクセス権を編集] を選択します。

  4. [+ プリンシパルを追加] ボタンをクリックします。

  5. [新しいプリンシパル] フィールドに、サービス エージェント アカウントのメールアドレスを入力します。

  6. [ロールの選択] プルダウン メニューから Storage Object Viewer または Storage Object Creator を選択します。

  7. [別のロールを追加] をクリックします。

  8. Storage Legacy Bucket Writer または Storage Legacy Bucket Reader を選択します。

  9. [保存] をクリックします。

gcloud

gcloud storage buckets add-iam-policy-binding コマンドを使用します。

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

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

コードサンプル

C++

Cloud Storage 用のクライアント ライブラリをインストールして使用する方法については、Cloud Storage のクライアント ライブラリをご覧ください。 詳細については、Cloud Storage C++ API のリファレンス ドキュメントをご覧ください。

Cloud Storage に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& role, std::string const& member) {
  auto policy = client.GetNativeBucketIamPolicy(
      bucket_name, gcs::RequestedPolicyVersion(3));

  if (!policy) throw std::move(policy).status();

  policy->set_version(3);
  for (auto& binding : policy->bindings()) {
    if (binding.role() != role || binding.has_condition()) {
      continue;
    }
    auto& members = binding.members();
    if (std::find(members.begin(), members.end(), member) == members.end()) {
      members.emplace_back(member);
    }
  }

  auto updated = client.SetNativeBucketIamPolicy(bucket_name, *policy);
  if (!updated) throw std::move(updated).status();

  std::cout << "Updated IAM policy bucket "