Mengonfigurasi akses ke sumber: Cloud Storage

Storage Transfer Service menggunakan akun layanan yang dikelola Google, yang dikenal sebagai agen layanan, untuk memindahkan data dari bucket sumber Cloud Storage. Agen layanan ini dibuat saat pertama kali Anda memanggil googleServiceAccounts.get.

Bucket sumber tidak harus menjadi milik project yang sama dengan agen layanan. Langkahnya sama, terlepas dari project tempat bucket berada.

Izin pengguna

Untuk memberikan izin yang diperlukan kepada agen layanan, Anda harus memiliki izin yang relevan di bucket sumber:

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

Peran Storage Legacy Bucket Owner (roles/storage.legacyBucketOwner) atau peran Storage Admin (roles/storage.admin) memberikan izin yang diperlukan.

Pemberian izin otomatis di konsol Google Cloud

Jika Anda menggunakan Konsol Google Cloud untuk membuat transfer, dan memiliki izin yang tercantum di Izin pengguna, agen layanan akan otomatis diberi izin yang diperlukan di bucket sumber Anda.

Anda dapat melewati langkah-langkah di halaman ini dan langsung membuat transfer.

Izin yang diperlukan

Agen layanan harus memiliki izin berikut untuk bucket sumber:

Izin Deskripsi
storage.buckets.get Mengizinkan agen layanan untuk mendapatkan lokasi bucket.
storage.objects.list Mengizinkan agen layanan untuk membuat daftar objek di dalam bucket.
storage.objects.get Mengizinkan agen layanan untuk membaca objek dalam bucket.
storage.objects.create

Mengizinkan agen layanan untuk membuat objek di dalam bucket. Diperlukan jika transfernya ke sistem file.

Storage Transfer Service membuat dan mengisi dua folder di bucket sumber: cloud-ingest/ berisi informasi sistem file, dan storage-transfer/ berisi log transfer.

storage.objects.delete Mengizinkan agen layanan menghapus objek dalam bucket. Wajib ada jika Anda menetapkan deleteObjectsFromSourceAfterTransfer ke true.

Peran yang telah ditetapkan berikut secara bersama-sama memberikan izin yang diperlukan:

  • Salah satu dari:
    • Storage Object Viewer (roles/storage.objectViewer) jika transfer ditujukan ke bucket Cloud Storage lain.
    • Storage Object Creator (roles/storage.objectCreator) jika transfernya ke sistem file.
  • Plus salah satu dari:
    • Storage Legacy Bucket Writer (roles/storage.legacyBucketWriter) jika izin penghapusan objek diperlukan.
    • Storage Legacy Bucket Reader (roles/storage.legacyBucketReader) jika izin penghapusan objek tidak diperlukan.

Setiap peran Cloud Storage yang ditandai sebagai peran legacy hanya dapat diberikan di level bucket.

Untuk mengetahui daftar lengkap peran Cloud Storage dan izin yang dimilikinya, lihat Peran IAM.

Untuk objek ACL saat ACL_PRESERVE ditetapkan, peran ACL_PRESERVE (roles/storage.legacyObjectOwner) juga diperlukan untuk objek sumber. Untuk ACL_PRESERVE, tambahkan akun layanan secara manual agar memiliki peran Storage Legacy Object Owner untuk memberikan izin objek sumber storage.objects.getIamPolicy.

Memberikan izin yang diperlukan

Untuk memberikan izin yang diperlukan kepada agen layanan, ikuti langkah-langkah di bawah.

Menemukan email agen layanan

  1. Buka halaman referensi googleServiceAccounts.get.

    Panel interaktif akan terbuka, yang berjudul Coba metode ini.

  2. Di panel, di bagian Parameter permintaan, masukkan project ID. Project yang Anda tentukan di sini harus merupakan project yang Anda gunakan untuk mengelola Storage Transfer Service, yang mungkin berbeda dari project bucket sumber.

  3. Klik Jalankan.

    Email agen layanan Anda ditampilkan sebagai nilai accountEmail. Salin nilai ini.

    Email agen layanan menggunakan format project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com.

Menambahkan agen layanan ke kebijakan level bucket

Konsol

  1. Di Konsol Google Cloud, buka halaman Bucket Cloud Storage.

    Buka Buckets

  2. Klik menu Bucket overflow () yang terkait dengan bucket yang ingin Anda berikan peran ke akun utama.

  3. Pilih Edit akses.

  4. Klik tombol + Add principal.

  5. Di kolom New principals, masukkan email akun agen layanan Anda.

  6. Pilih Storage Object Viewer atau Storage Object Creator dari menu drop-down Pilih peran.

  7. Klik Add another role.

  8. Pilih Storage Legacy Bucket Writer atau Storage Legacy Bucket Reader.

  9. Klik Save.

gsutil

Gunakan perintah gsutil iam ch:

gsutil iam ch \
serviceAccount:YOUR_AGENT_EMAIL:objectViewer,legacyBucketReader \
gs://BUCKET_NAME

Dengan keterangan:

  • YOUR_AGENT_EMAIL adalah email akun agen yang Anda salin dalam Temukan email agen layanan.
  • BUCKET_NAME adalah nama bucket yang aksesnya Anda berikan ke akun utama. Contoh, my-bucket.

Contoh kode

C++

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Storage, lihat library klien Cloud Storage. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API C++ Cloud Storage.

Untuk melakukan autentikasi ke Cloud Storage, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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 " << bucket_name
            << ". The new policy is " << *updated << "\n";
}

C#

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Storage, lihat library klien Cloud Storage. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API C# Cloud Storage.

Untuk melakukan autentikasi ke Cloud Storage, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.


using Google.Apis.Storage.v1.Data;
using Google.Cloud.Storage.V1;
using System;
using System.Collections.Generic;

public class AddBucketIamMemberSample
{
    public Policy AddBucketIamMember(
        string bucketName = "your-unique-bucket-name",
        string role = "roles/storage.objectViewer",
        string member = "serviceAccount:dev@iam.gserviceaccount.com")
    {
        var storage = StorageClient.Create();
        var policy = storage.GetBucketIamPolicy(bucketName, new GetBucketIamPolicyOptions
        {
            RequestedPolicyVersion = 3
        });
        // Set the policy schema version. For more information, please refer to https://cloud.google.com/iam/docs/policies#versions.
        policy.Version = 3;

        Policy.BindingsData bindingToAdd = new Policy.BindingsData
        {
            Role = role,
            Members = new List<string> { member }
        };

        policy.Bindings.Add(bindingToAdd);
        var bucketIamPolicy = storage.SetBucketIamPolicy(bucketName, policy);
        Console.WriteLine($"Added {member} with role {role} " + $"to {bucketName}");
        return bucketIamPolicy;
    }
}

Go

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Storage, lihat library klien Cloud Storage. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Go Cloud Storage.

Untuk melakukan autentikasi ke Cloud Storage, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

import (
	"context"
	"fmt"
	"io"
	"time"

	"cloud.google.com/go/iam"
	"cloud.google.com/go/storage"
)

// addBucketIAMMember adds the bucket IAM member to permission role.
func addBucketIAMMember(w io.Writer, bucketName string) error {
	// bucketName := "bucket-name"
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("storage.NewClient: %w", err)
	}
	defer client.Close()

	ctx, cancel := context.WithTimeout(ctx, time.Second*10)
	defer cancel()

	bucket := client.Bucket(bucketName)
	policy, err := bucket.IAM().Policy(ctx)
	if err != nil {
		return fmt.Errorf("Bucket(%q).IAM().Policy: %w", bucketName, err)
	}
	// Other valid prefixes are "serviceAccount:", "user:"
	// See the documentation for more values.
	// https://cloud.google.com/storage/docs/access-control/iam
	identity := "group:cloud-logs@google.com"
	var role iam.RoleName = "roles/storage.objectViewer"

	policy.Add(identity, role)
	if err := bucket.IAM().SetPolicy(ctx, policy); err != nil {
		return fmt.Errorf("Bucket(%q).IAM().SetPolicy: %w", bucketName, err)
	}
	// NOTE: It may be necessary to retry this operation if IAM policies are
	// being modified concurrently. SetPolicy will return an error if the policy
	// was modified since it was retrieved.
	fmt.Fprintf(w, "Added %v with role %v to %v\n", identity, role, bucketName)
	return nil
}

Java

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Storage, lihat library klien Cloud Storage. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Java Cloud Storage.

Untuk melakukan autentikasi ke Cloud Storage, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.


import com.google.cloud.Binding;
import com.google.cloud.Policy;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class AddBucketIamMember {
  /** Example of adding a member to the Bucket-level IAM */
  public static void addBucketIamMember(String projectId, String bucketName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // For more information please read:
    // https://cloud.google.com/storage/docs/access-control/iam
    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();

    Policy originalPolicy =
        storage.getIamPolicy(bucketName, Storage.BucketSourceOption.requestedPolicyVersion(3));

    String role = "roles/storage.objectViewer";
    String member = "group:example@google.com";

    // getBindingsList() returns an ImmutableList and copying over to an ArrayList so it's mutable.
    List<Binding> bindings = new ArrayList(originalPolicy.getBindingsList());

    // Create a new binding using role and member
    Binding.Builder newMemberBindingBuilder = Binding.newBuilder();
    newMemberBindingBuilder.setRole(role).setMembers(Arrays.asList(member));
    bindings.add(newMemberBindingBuilder.build());

    // Update policy to add member
    Policy.Builder updatedPolicyBuilder = originalPolicy.toBuilder();
    updatedPolicyBuilder.setBindings(bindings).setVersion(3);
    Policy updatedPolicy = storage.setIamPolicy(bucketName, updatedPolicyBuilder.build());

    System.out.printf("Added %s with role %s to %s\n", member, role, bucketName);
  }
}

Node.js

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Storage, lihat library klien Cloud Storage. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Node.js Cloud Storage.

Untuk melakukan autentikasi ke Cloud Storage, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of your GCS bucket
// const bucketName = 'your-unique-bucket-name';

// The role to grant
// const roleName = 'roles/storage.objectViewer';

// The members to grant the new role to
// const members = [
//   'user:jdoe@example.com',
//   'group:admins@example.com',
// ];

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function addBucketIamMember() {
  // Get a reference to a Google Cloud Storage bucket
  const bucket = storage.bucket(bucketName);

  // For more information please read:
  // https://cloud.google.com/storage/docs/access-control/iam
  const [policy] = await bucket.iam.getPolicy({requestedPolicyVersion: 3});

  // Adds the new roles to the bucket's IAM policy
  policy.bindings.push({
    role: roleName,
    members: members,
  });

  // Updates the bucket's IAM policy
  await bucket.iam.setPolicy(policy);

  console.log(
    `Added the following member(s) with role ${roleName} to ${bucketName}:`
  );

  members.forEach(member => {
    console.log(`  ${member}`);
  });
}

addBucketIamMember().catch(console.error);

PHP

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Storage, lihat library klien Cloud Storage. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API PHP Cloud Storage.

Untuk melakukan autentikasi ke Cloud Storage, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

use Google\Cloud\Storage\StorageClient;

/**
 * Adds a new member / role IAM pair to a given Cloud Storage bucket.
 *
 * @param string $bucketName The name of your Cloud Storage bucket.
 *        (e.g. 'my-bucket')
 * @param string $role The role to which the given member should be added.
 *        (e.g. 'roles/storage.objectViewer')
 * @param string[] $members The member(s) to be added to the role.
 *        (e.g. ['group:example@google.com'])
 */
function add_bucket_iam_member(string $bucketName, string $role, array $members): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);

    $policy = $bucket->iam()->policy(['requestedPolicyVersion' => 3]);
    $policy['version'] = 3;

    $policy['bindings'][] = [
        'role' => $role,
        'members' => $members
    ];

    $bucket->iam()->setPolicy($policy);

    printf('Added the following member(s) to role %s for bucket %s' . PHP_EOL, $role, $bucketName);
    foreach ($members as $member) {
        printf('    %s' . PHP_EOL, $member);
    }
}

Python

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Storage, lihat library klien Cloud Storage. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Cloud Storage.

Untuk melakukan autentikasi ke Cloud Storage, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.cloud import storage

def add_bucket_iam_member(bucket_name, role, member):
    """Add a new member to an IAM Policy"""
    # bucket_name = "your-bucket-name"
    # role = "IAM role, e.g., roles/storage.objectViewer"
    # member = "IAM identity, e.g., user: name@example.com"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)

    policy = bucket.get_iam_policy(requested_policy_version=3)

    policy.bindings.append({"role": role, "members": {member}})

    bucket.set_iam_policy(policy)

    print(f"Added {member} with role {role} to {bucket_name}.")

Ruby

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Storage, lihat library klien Cloud Storage. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Ruby Cloud Storage.

Untuk melakukan autentikasi ke Cloud Storage, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

def add_bucket_iam_member bucket_name:
  # The ID of your GCS bucket
  # bucket_name = "your-unique-bucket-name"

  require "google/cloud/storage"

  storage = Google::Cloud::Storage.new
  bucket = storage.bucket bucket_name

  role   = "roles/storage.objectViewer"
  member = "group:example@google.com"

  bucket.policy requested_policy_version: 3 do |policy|
    policy.bindings.insert role: role, members: [member]
  end

  puts "Added #{member} with role #{role} to #{bucket_name}"
end

JSON

  1. Telah menginstal dan melakukan inisialisasigcloud CLI, agar dapat membuat token akses untuk header Authorization.

    Atau, Anda dapat membuat token akses menggunakan OAuth 2.0 Playground dan menyertakannya di header Authorization.

  2. Buat file JSON yang berisi informasi berikut:

    {
    "bindings":[
      {
        "role": "roles/storage.objectViewer",
        "members":[
          "YOUR_AGENT_EMAIL"
        ]
      },
      {
        "role": "roles/storage.legacyBucketReader",
        "members":[
          "YOUR_AGENT_EMAIL"
        ]
      }
    ]
    }

    Dengan keterangan:

  3. Gunakan cURL untuk memanggil JSON API dengan permintaan PUT setIamPolicy:

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

    Dengan keterangan:

    • JSON_FILE_NAME adalah jalur untuk file yang Anda buat di Langkah 2.
    • OAUTH2_TOKEN adalah token akses yang Anda buat pada Langkah 1.
    • BUCKET_NAME adalah nama bucket yang ingin Anda beri akses utama. Contoh, my-bucket.