싱크에 대한 액세스 구성: Cloud Storage

Cloud Storage는 서비스 에이전트라고 하는 Google 관리 서비스 계정을 사용하여 데이터를 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.create 서비스 계정이 객체를 버킷에 추가할 수 있게 합니다.
storage.objects.delete

서비스 계정이 버킷의 객체를 삭제할 수 있게 합니다. overwriteObjectsAlreadyExistingInSink 또는 deleteObjectsUniqueInSinktrue로 설정하는 경우에 필요합니다.

대상 버킷에 객체 버전 관리가 사용 설정되었으면 overwriteObjectsAlreadyExistingInSink 또는 deleteObjectsUniqueInSink 모두 객체를 영구적으로 삭제하지 않습니다. 대신 관련 실시간 객체 버전이 이전 버전이 됩니다.

storage.objects.list 서비스 계정이 버킷의 객체를 나열할 수 있게 합니다. overwriteObjectsAlreadyExistingInSinkfalse로 또는 deleteObjectsUniqueInSinktrue로 설정하는 경우에 필요합니다.

사전 정의된 다음 역할에서 필요한 권한을 부여합니다.

  • 스토리지 기존 버킷 작성자(roles/storage.legacyBucketWriter)

legacy 역할로 표시된 모든 Cloud Storage 역할은 버킷 수준에서만 부여될 수 있습니다.

Cloud Storage 역할과 이 역할에 포함된 권한의 전체 목록은 IAM 역할을 참조하세요.

필수 권한 부여

서비스 에이전트에 스토리지 기존 버킷 작성자 역할을 부여하려면 아래 단계를 수행합니다.

서비스 에이전트의 이메일 찾기

  1. googleServiceAccounts.get 참조 페이지로 이동하세요.

    이 메서드 사용해 보기라는 제목의 대화형 패널이 열립니다.

  2. 패널의 요청 매개변수프로젝트 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 Legacy Bucket Writer를 선택합니다.

  7. 저장을 클릭합니다.

gsutil

gsutil iam ch 명령어를 사용합니다.

gsutil iam ch \
serviceAccount:YOUR_AGENT_EMAIL:legacyBucketWriter \
gs://BUCKET_NAME

각 항목의 의미는 다음과 같습니다.

  • YOUR_AGENT_EMAIL서비스 에이전트 이메일 찾기에서 복사한 에이전트 계정 이메일입니다.
  • BUCKET_NAME은 주 구성원 액세스 권한을 부여할 버킷의 이름입니다. my-bucket).

코드 샘플

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

C#

Cloud Storage용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Storage 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Storage C# API 참고 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


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

Cloud Storage용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Storage 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Storage Go API 참고 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

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

Cloud Storage용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Storage 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Storage Java API 참고 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


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

Cloud Storage용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Storage 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Storage Node.js API 참고 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

/**
 * 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

Cloud Storage용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Storage 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Storage PHP API 참고 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

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

Cloud Storage용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Storage 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Storage Python API 참고 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

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

Cloud Storage용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Storage 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Storage Ruby API 참고 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

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. Authorization 헤더에 대한 액세스 토큰을 생성하려면 gcloud CLI가 설치 및 초기화되어 있어야 합니다.

    또는 OAuth 2.0 Playground를 사용하여 액세스 토큰을 만들어 Authorization 헤더에 포함할 수도 있습니다.

  2. 다음 정보를 포함하는 JSON 파일을 만듭니다.

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

    각 항목의 의미는 다음과 같습니다.

  3. cURL을 사용하여 PUT setIamPolicy 요청으로 JSON API를 호출합니다.

    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"

    각 항목의 의미는 다음과 같습니다.

    • JSON_FILE_NAME은 2단계에서 만든 파일의 경로입니다.
    • OAUTH2_TOKEN은 1단계에서 생성한 액세스 토큰입니다.
    • BUCKET_NAME은 주 구성원에게 액세스 권한을 부여할 버킷의 이름입니다. my-bucket).

Cloud Storage 리소스에 IAM 역할 할당에 대한 자세한 내용은 Cloud Storage IAM 문서를 참조하세요.