Cloud IAM 権限の使用

コンセプトに移動

このページでは、Cloud Identity and Access Management(Cloud IAM)権限を使用して、バケットとオブジェクトへのアクセスを制御する方法を説明します。Cloud IAM を使用すると、バケットとオブジェクトにアクセスできるユーザーを制御できます。

バケットとオブジェクトへのアクセスを制御するその他の方法については、アクセス制御の概要をご覧ください。バケット内のオブジェクトのアクセスを個別に制御する方法については、アクセス制御リストをご覧ください。

バケットで Cloud IAM を使用する

バケットで基本的な Cloud IAM タスクを行う方法について説明します。

バケットレベルのポリシーにメンバーを追加する

Cloud Storage に関連付けられているロールのリストについては、Cloud IAM ロールをご覧ください。Cloud IAM ロールを付与するエンティティの詳細については、メンバーのタイプをご覧ください。

Console

  1. Google Cloud Console で Cloud Storage ブラウザを開きます。
    Cloud Storage ブラウザを開く
  2. メンバーにロールを付与するバケットに関連付けられた [バケット オーバーフロー] メニュー()をクリックします。

  3. [バケットの権限を編集] を選択します。

  4. [メンバーを追加] フィールドに、バケットにアクセスが必要な ID を 1 つ以上入力します。

    メンバー追加ダイアログ

  5. [ロールを選択] プルダウン メニューからロールを選択します。選択したロールと付与する権限の簡単な説明がパネルに表示されます。

  6. [追加] をクリックします。

gsutil

gsutil iam ch コマンドを使用します。

gsutil iam ch [MEMBER_TYPE]:[MEMBER_NAME]:[IAM_ROLE] gs://[BUCKET_NAME]

ここで

  • [MEMBER_TYPE] はバケットのアクセス権を付与するメンバーのタイプです。例: user
  • [MEMBER_NAME] はバケットのアクセス権を付与するメンバーの名前です。例: jane@gmail.com
  • [IAM_ROLE] はメンバーに付与する IAM ロールです。例: roles/storage.objectCreator
  • [BUCKET_NAME] は、メンバーのアクセス権を付与するバケットの名前です。例: my-bucket

[MEMBER_TYPE]:[MEMBER_NAME]:[IAM_ROLE] のフォーマットに関するその他の例については、gsutil iam ch リファレンス ページをご覧ください。

コードサンプル

C++

詳細については、Cloud Storage C++ API のリファレンス ドキュメントをご覧ください。

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

  if (!policy) throw std::runtime_error(policy.status().message());

  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::runtime_error(updated.status().message());

  std::cout << "Updated IAM policy bucket " << bucket_name
            << ". The new policy is " << *updated << "\n";
}

C#

詳細については、Cloud Storage C# API のリファレンス ドキュメントをご覧ください。

        private void AddBucketIamMember(string bucketName,
            string role, string member)
        {
            var storage = StorageClient.Create();
            var policy = storage.GetBucketIamPolicy(bucketName, new GetBucketIamPolicyOptions()
            {
                RequestedPolicyVersion = 3
            });
            policy.Version = 3;

            Policy.BindingsData bindingToAdd = new Policy.BindingsData();
            bindingToAdd.Role = role;
            string[] members = { member };
            bindingToAdd.Members = members;
            policy.Bindings.Add(bindingToAdd);

            storage.SetBucketIamPolicy(bucketName, policy);
            Console.WriteLine($"Added {member} with role {role} "
                + $"to {bucketName}");
        }

Go

詳細については、Cloud Storage Go API のリファレンス ドキュメントをご覧ください。

ctx := context.Background()

ctx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel()
bucket := c.Bucket(bucketName)
policy, err := bucket.IAM().V3().Policy(ctx)
if err != nil {
	return err
}
// Other valid prefixes are "serviceAccount:", "user:"
// See the documentation for more values.
// https://cloud.google.com/storage/docs/access-control/iam
policy.Bindings = append(policy.Bindings, &iampb.Binding{
	Role:    "roles/storage.objectViewer",
	Members: []string{"group:cloud-logs@google.com"},
})
if err := bucket.IAM().V3().SetPolicy(ctx, policy); err != nil {
	return 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.

Java

詳細については、Cloud Storage Java API のリファレンス ドキュメントをご覧ください。

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 Node.js API のリファレンス ドキュメントをご覧ください。

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const roleName = 'Role to grant, e.g. roles/storage.objectViewer';
// const members = [
//   'user:jdoe@example.com',    // Example members to grant
//   'group:admins@example.com', // the new role to
// ];

// 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);

  // Gets and updates the bucket's IAM policy
  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 PHP API のリファレンス ドキュメントをご覧ください。

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.
 * @param string $role the role you want to add a given member to.
 * @param string[] $members the member(s) you want to give the new role for the Cloud
 * Storage bucket.
 *
 * @return void
 */
function add_bucket_iam_member($bucketName, $role, $members)
{
    $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 Python API のリファレンス ドキュメントをご覧ください。

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("Added {} with role {} to {}.".format(member, role, bucket_name))

Ruby

詳細については、Cloud Storage Ruby API のリファレンス ドキュメントをご覧ください。

# bucket_name = "Your Google Cloud Storage bucket name"
# role        = "Bucket-level IAM role"
# member      = "Bucket-level IAM member"

require "google/cloud/storage"

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

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}"

JSON

  1. OAuth 2.0 Playground から承認アクセス トークンを取得します。固有の OAuth 認証情報を使用するように Playground を構成します。
  2. 次の情報が含まれる .json ファイルを作成します。

    {
      "bindings":[
        {
          "role": "[IAM_ROLE]",
          "members":[
            "[MEMBER_NAME]"
          ]
        }
      ]
    }

    ここで

    • [IAM_ROLE] はメンバーに付与する IAM ロールです。例: roles/storage.objectCreator
    • [MEMBER_NAME] はバケットのアクセス権を付与するメンバーの名前です。例: jane@gmail.com

      [MEMBER_NAME] のフォーマットに関するその他の例については、こちらからメンバーのセクションをご覧ください。

  3. cURL を使用して、PUT setIamPolicy リクエストで JSON API を呼び出します。

    curl -X PUT --data-binary @[JSON_FILE_NAME].json \
      -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 IAM ポリシーを表示する

Console

  1. Google Cloud Console で Cloud Storage ブラウザを開きます。
    Cloud Storage ブラウザを開く
  2. ロールメンバーを表示するバケットに関連付けられた [バケット オーバーフロー] メニュー()をクリックします。

  3. [バケットの権限を編集] を選択します。

  4. 必要なロールを展開して、ロールに割り当てられているメンバーを表示します。

  5. (省略可)検索バーを使用して、ロールまたはメンバーで結果をフィルタリングします。

    メンバーで検索すると、メンバーが割り当てられているロールが表示されます。

gsutil

gsutil iam get コマンドを使用します。

gsutil iam get gs://[BUCKET_NAME]

ここで、[BUCKET_NAME] は Cloud IAM ポリシーを表示するバケットの名前です。例: my-bucket

コードサンプル

C++

詳細については、Cloud Storage C++ API のリファレンス ドキュメントをご覧ください。

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

  if (!policy) throw std::runtime_error(policy.status().message());
  std::cout << "The IAM policy for bucket " << bucket_name << " is "
            << *policy << "\n";
}

C#

詳細については、Cloud Storage C# API のリファレンス ドキュメントをご覧ください。

        private void ViewBucketIamMembers(string bucketName)
        {
            var storage = StorageClient.Create();
            var policy = storage.GetBucketIamPolicy(bucketName, new GetBucketIamPolicyOptions()
            {
                RequestedPolicyVersion = 3
            });

            foreach (var binding in policy.Bindings)
            {
                Console.WriteLine($"  Role: {binding.Role}");
                Console.WriteLine("  Members:");
                foreach (var member in binding.Members)
                {
                    Console.WriteLine($"    {member}");
                }
                if (binding.Condition != null)
                {
                    Console.WriteLine($"Condition Title: {binding.Condition.Title}");
                    Console.WriteLine($"Condition Description: {binding.Condition.Description}");
                    Console.WriteLine($"Condition Expression: {binding.Condition.Expression}");
                }
            }
        }

Go

詳細については、Cloud Storage Go API のリファレンス ドキュメントをご覧ください。

ctx := context.Background()

ctx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel()
policy, err := c.Bucket(bucketName).IAM().V3().Policy(ctx)
if err != nil {
	return nil, err
}
for _, binding := range policy.Bindings {
	log.Printf("%q: %q (condition: %v)", binding.Role, binding.Members, binding.Condition)
}

Java

詳細については、Cloud Storage Java API のリファレンス ドキュメントをご覧ください。

import com.google.cloud.Binding;
import com.google.cloud.Policy;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class ListBucketIamMembers {
  public static void listBucketIamMembers(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 policy =
        storage.getIamPolicy(bucketName, Storage.BucketSourceOption.requestedPolicyVersion(3));

    // Print binding information
    for (Binding binding : policy.getBindingsList()) {
      System.out.printf("Role: %s Members: %s\n", binding.getRole(), binding.getMembers());

      // Print condition if one is set
      boolean bindingIsConditional = binding.getCondition() != null;
      if (bindingIsConditional) {
        System.out.printf("Condition Title: %s\n", binding.getCondition().getTitle());
        System.out.printf("Condition Description: %s\n", binding.getCondition().getDescription());
        System.out.printf("Condition Expression: %s\n", binding.getCondition().getExpression());
      }
    }
  }
}

Node.js

詳細については、Cloud Storage Node.js API のリファレンス ドキュメントをご覧ください。

/**
 * TODO(developer): Uncomment the following line before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';

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

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

async function viewBucketIamMembers() {
  // Gets and displays the bucket's IAM policy
  // Gets and displays the bucket's IAM policy
  const results = await storage
    .bucket(bucketName)
    .iam.getPolicy({requestedPolicyVersion: 3});

  const bindings = results[0].bindings;

  // Displays the roles in the bucket's IAM policy
  console.log(`Bindings for bucket ${bucketName}:`);
  for (const binding of bindings) {
    console.log(`  Role: ${binding.role}`);
    console.log('  Members:');

    const members = binding.members;
    for (const member of members) {
      console.log(`    ${member}`);
    }

    const condition = binding.condition;
    if (condition) {
      console.log('  Condiiton:');
      console.log(`    Title: ${condition.title}`);
      console.log(`    Description: ${condition.description}`);
      console.log(`    Expression: ${condition.expression}`);
    }
  }
}

viewBucketIamMembers().catch(console.error);

PHP

詳細については、Cloud Storage PHP API のリファレンス ドキュメントをご覧ください。

use Google\Cloud\Storage\StorageClient;

/**
 * View Bucket IAM members for a given Cloud Storage bucket.
 *
 * @param string $bucketName the name of your Cloud Storage bucket.
 *
 * @return void
 */
function view_bucket_iam_members($bucketName)
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);

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

    printf('Printing Bucket IAM members for Bucket: %s' . PHP_EOL, $bucketName);
    printf(PHP_EOL);

    foreach ($policy['bindings'] as $binding) {
        printf('Role: %s' . PHP_EOL, $binding['role']);
        printf('Members:' . PHP_EOL);
        foreach ($binding['members'] as $member) {
            printf('  %s' . PHP_EOL, $member);
        }

        if (isset($binding['condition'])) {
            $condition = $binding['condition'];
            printf('  with condition:' . PHP_EOL);
            printf('    Title: %s' . PHP_EOL, $condition['title']);
            printf('    Description: %s' . PHP_EOL, $condition['description']);
            printf('    Expression: %s' . PHP_EOL, $condition['expression']);
        }
        printf(PHP_EOL);
    }
}

Python

詳細については、Cloud Storage Python API のリファレンス ドキュメントをご覧ください。

from google.cloud import storage

def view_bucket_iam_members(bucket_name):
    """View IAM Policy for a bucket"""
    # bucket_name = "your-bucket-name"

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

    policy = bucket.get_iam_policy(requested_policy_version=3)

    for binding in policy.bindings:
        print("Role: {}, Members: {}".format(binding["role"], binding["members"]))

Ruby

詳細については、Cloud Storage Ruby API のリファレンス ドキュメントをご覧ください。

# bucket_name = "Your Google Cloud Storage bucket name"

require "google/cloud/storage"

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

policy = bucket.policy requested_policy_version: 3
policy.bindings.each do |binding|
  puts "Role: #{binding.role}"
  puts "Members: #{binding.members}"

  # if a conditional binding exists print the condition.
  if binding.condition
    puts "Condition Title: #{binding.condition.title}"
    puts "Condition Description: #{binding.condition.description}"
    puts "Condition Expression: #{binding.condition.expression}"
  end
end

JSON

  1. OAuth 2.0 Playground から承認アクセス トークンを取得します。固有の OAuth 認証情報を使用するようにプレイグラウンドを構成します。
  2. cURL を使用して、GET getIamPolicy リクエストで JSON API を呼び出します。

    curl -X GET \
      -H "Authorization: Bearer [OAUTH2_TOKEN]" \
      "https://storage.googleapis.com/storage/v1/b/[BUCKET_NAME]/iam"

    ここで

    • [OAUTH2_TOKEN] は、手順 1 で生成したアクセス トークンです。
    • [BUCKET_NAME] は、Cloud IAM ポリシーを表示するバケットの名前です。例: my-bucket

バケットレベルのポリシーからメンバーを削除する

Console

  1. Google Cloud Console で Cloud Storage ブラウザを開きます。
    Cloud Storage ブラウザを開く
  2. メンバーのロールを削除するバケットに関連付けられた [バケット オーバーフロー] メニュー()をクリックします。

  3. [バケットの権限を編集] を選択します。

  4. 削除するメンバーが含まれているロールを展開します。

  5. メンバーにカーソルを合わせて、表示されたゴミ箱のアイコンをクリックします。

    プロジェクトからメンバーを削除する

  6. 上に重なったウィンドウで [削除] をクリックします。

gsutil

gsutil iam ch コマンドを使用して、-d フラグを指定します。

gsutil iam ch -d [MEMBER_TYPE]:[MEMBER_NAME] gs://[BUCKET_NAME]

ここで

  • [MEMBER_TYPE] は、ポリシーから削除するメンバーのタイプです。例: user
  • [MEMBER_NAME] は、ポリシーから削除するメンバーの名前です。例: jane@gmail.com
  • [BUCKET_NAME] はバケットの名前で、このバケットからメンバーのアクセス権を削除します。例: my-bucket

[MEMBER_TYPE]:[MEMBER_NAME] のフォーマットに関するその他の例については、gsutil iam ch リファレンス ページをご覧ください。

コードサンプル

C++

詳細については、Cloud Storage C++ API のリファレンス ドキュメントをご覧ください。

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string bucket_name, std::string role,
   std::string member) {
  auto policy = client.GetNativeBucketIamPolicy(
      bucket_name, gcs::RequestedPolicyVersion(3));
  if (!policy) throw std::runtime_error(policy.status().message());

  policy->set_version(3);
  std::vector<google::cloud::storage::NativeIamBinding> updated_bindings;
  for (auto& binding : policy->bindings()) {
    auto& members = binding.members();
    if (binding.role() == role && !binding.has_condition()) {
      members.erase(std::remove(members.begin(), members.end(), member),
                    members.end());
    }
    if (!members.empty()) {
      updated_bindings.emplace_back(std::move(binding));
    }
  }
  policy->bindings() = std::move(updated_bindings);

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

  std::cout << "Updated IAM policy bucket " << bucket_name
            << ". The new policy is " << *updated << "\n";
}

C#

詳細については、Cloud Storage C# API のリファレンス ドキュメントをご覧ください。

private void RemoveBucketIamMember(string bucketName,
    string role, string member)
{
    var storage = StorageClient.Create();
    var policy = storage.GetBucketIamPolicy(bucketName, new GetBucketIamPolicyOptions()
    {
        RequestedPolicyVersion = 3
    });
    policy.Version = 3;
    policy.Bindings.ToList().ForEach(binding =>
    {
        if (binding.Role == role && binding.Condition == null)
        {
            // Remove the role/member combo from the IAM policy.
            binding.Members = binding.Members
                .Where(memberInList => memberInList != member).ToList();
            // Remove role if it contains no members.
            if (binding.Members.Count == 0)
            {
                policy.Bindings.Remove(binding);
            }
        }
    });
    // Set the modified IAM policy to be the current IAM policy.
    storage.SetBucketIamPolicy(bucketName, policy);
    Console.WriteLine($"Removed {member} with role {role} "
        + $"to {bucketName}");
}

Go

詳細については、Cloud Storage Go API のリファレンス ドキュメントをご覧ください。

ctx := context.Background()

ctx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel()
bucket := c.Bucket(bucketName)
policy, err := bucket.IAM().V3().Policy(ctx)
if err != nil {
	return err
}
// Other valid prefixes are "serviceAccount:", "user:"
// See the documentation for more values.
// https://cloud.google.com/storage/docs/access-control/iam
for _, binding := range policy.Bindings {
	// Only remove unconditional bindings matching role
	if binding.Role == "roles/storage.objectViewer" && binding.Condition == nil {
		// Filter out member.
		i := -1
		for j, member := range binding.Members {
			if member == "group:cloud-logs@google.com" {
				i = j
			}
		}

		if i == -1 {
			return errors.New("No matching binding group found.")
		} else {
			binding.Members = append(binding.Members[:i], binding.Members[i+1:]...)
		}
	}
}
if err := bucket.IAM().V3().SetPolicy(ctx, policy); err != nil {
	return 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.

Java

詳細については、Cloud Storage Java API のリファレンス ドキュメントをご覧ください。

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.List;

public class RemoveBucketIamMember {
  public static void removeBucketIamMember(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());

    // Remove role-member binding without a condition.
    for (int index = 0; index < bindings.size(); index++) {
      Binding binding = bindings.get(index);
      boolean foundRole = binding.getRole().equals(role);
      boolean foundMember = binding.getMembers().contains(member);
      boolean bindingIsNotConditional = binding.getCondition() == null;

      if (foundRole && foundMember && bindingIsNotConditional) {
        bindings.set(index, binding.toBuilder().removeMembers(member).build());
        break;
      }
    }

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

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

Node.js

詳細については、Cloud Storage Node.js API のリファレンス ドキュメントをご覧ください。

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const roleName = 'Role to grant, e.g. roles/storage.objectViewer';
// const members = [
//   'user:jdoe@example.com',    // Example members to grant
//   'group:admins@example.com', // the new role to
// ];

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

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

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

  // Gets and updates the bucket's IAM policy
  const [policy] = await bucket.iam.getPolicy({requestedPolicyVersion: 3});

  // Finds and updates the appropriate role-member group, without a condition.
  const index = policy.bindings.findIndex(
    binding => binding.role === roleName && !binding.condition
  );

  const role = policy.bindings[index];
  if (role) {
    role.members = role.members.filter(
      member => members.indexOf(member) === -1
    );

    // Updates the policy object with the new (or empty) role-member group
    if (role.members.length === 0) {
      policy.bindings.splice(index, 1);
    } else {
      policy.bindings.index = role;
    }

    // Updates the bucket's IAM policy
    await bucket.iam.setPolicy(policy);
  } else {
    // No matching role-member group(s) were found
    throw new Error('No matching role-member group(s) found.');
  }

  console.log(
    `Removed the following member(s) with role ${roleName} from ${bucketName}:`
  );
  members.forEach(member => {
    console.log(`  ${member}`);
  });
}

removeBucketIamMember().catch(console.error);

PHP

詳細については、Cloud Storage PHP API のリファレンス ドキュメントをご覧ください。

use Google\Cloud\Storage\StorageClient;

/**
 * Removes a member / role IAM pair from a given Cloud Storage bucket.
 *
 * @param string $bucketName the name of your Cloud Storage bucket.
 * @param string $role the role you want to remove a given member from.
 * @param string $member the member you want to remove from the given role.
 *
 * @return void
 */
function remove_bucket_iam_member($bucketName, $role, $member)
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $iam = $bucket->iam();
    $policy = $iam->policy(['requestedPolicyVersion' => 3]);
    $policy['version'] = 3;

    foreach ($policy['bindings'] as $i => $binding) {
        // This example only removes member from bindings without a condition.
        if ($binding['role'] == $role && !isset($binding['condition'])) {
            $key = array_search($member, $binding['members']);
            if ($key !== false) {
                unset($binding['members'][$key]);

                // If the last member is removed from the binding, clean up the
                // binding.
                if (count($binding['members']) == 0) {
                    unset($policy['bindings'][$i]);
                    // Ensure array keys are sequential, otherwise JSON encodes
                    // the array as an object, which fails when calling the API.
                    $policy['bindings'] = array_values($policy['bindings']);
                } else {
                    // Ensure array keys are sequential, otherwise JSON encodes
                    // the array as an object, which fails when calling the API.
                    $binding['members'] = array_values($binding['members']);
                    $policy['bindings'][$i] = $binding;
                }

                $iam->setPolicy($policy);
                printf('User %s removed from role %s for bucket %s' . PHP_EOL, $member, $role, $bucketName);
                return;
            }
        }
    }

    throw new \RuntimeException('No matching role-member group(s) found.');
}

Python

詳細については、Cloud Storage Python API のリファレンス ドキュメントをご覧ください。

from google.cloud import storage

def remove_bucket_iam_member(bucket_name, role, member):
    """Remove member from bucket 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)

    for binding in policy.bindings:
        print(binding)
        if binding["role"] == role and binding.get("condition") is None:
            binding["members"].discard(member)

    bucket.set_iam_policy(policy)

    print("Removed {} with role {} from {}.".format(member, role, bucket_name))

Ruby

詳細については、Cloud Storage Ruby API のリファレンス ドキュメントをご覧ください。

# bucket_name = "Your Google Cloud Storage bucket name"
# role        = "Bucket-level IAM role"
# member      = "Bucket-level IAM member"

require "google/cloud/storage"

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

bucket.policy requested_policy_version: 3 do |policy|
  policy.bindings.each do |binding|
    if binding.role == role && binding.condition.nil?
      binding.members.delete member
    end
  end
end

puts "Removed #{member} with role #{role} from #{bucket_name}"

JSON

  1. OAuth 2.0 Playground から承認アクセス トークンを取得します。固有の OAuth 認証情報を使用するようにプレイグラウンドを構成します。
  2. プロジェクトに適用されている既存のポリシーを取得します。これを行うには、cURL を使用して、GET getIamPolicy リクエストで JSON API を呼び出します。

    curl -X GET \
      -H "Authorization: Bearer [OAUTH2_TOKEN]" \
      "https://storage.googleapis.com/storage/v1/b/[BUCKET_NAME]/iam"

    ここで

    • [OAUTH2_TOKEN] は、手順 1 で生成したアクセス トークンです。
    • [BUCKET_NAME] は、Cloud IAM ポリシーを表示するバケットの名前です。例: my-bucket
  3. 前の手順で取得したポリシーが含まれる .json ファイルを作成します。

  4. .json ファイルを編集し、ポリシーからメンバーを削除します。

  5. cURL を使用して、PUT setIamPolicy リクエストで JSON API を呼び出します。

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

    ここで

    • [JSON_FILE_NAME] は、手順 3 で作成したファイルの名前です。
    • [OAUTH2_TOKEN] は、ステップ 1 で生成したアクセス トークンです。
    • [BUCKET_NAME] はバケットの名前で、このバケットからメンバーのアクセス権を削除します。例: my-bucket

バケットでの Cloud IAM Conditions の使用

以下のセクションでは、バケットでの Cloud IAM Conditions の追加と削除の方法を説明します。バケットの Cloud IAM Conditions を表示するには、バケットに適用される Cloud IAM ポリシーを表示するをご覧ください。Cloud Storage での Cloud IAM Conditions の使用について詳しくは、Conditions をご覧ください。

条件を追加する前に、バケットに対する均一なバケットレベルのアクセスを有効にする必要があります。

バケットへの新しい条件の設定

Console

  1. Google Cloud Console で Cloud Storage ブラウザを開きます。
    Cloud Storage ブラウザを開く
  2. バケットに関連付けられた行の右端にある [バケット オーバーフロー] メニュー()をクリックします。

  3. [バケットの権限を編集] を選択します。

  4. [メンバーを追加] をクリックします。

  5. [新しいメンバー] に、バケットへのアクセスを許可するメンバーを入力します。

  6. 条件を適用するロールごとに:

    1. メンバーを付与するロールを選択します。

    2. [条件を追加] をクリックして [条件を編集] フォームを開きます。

    3. 条件の [タイトル] を入力します。[説明] 欄の入力は任意です。

    4. [条件ビルダー] を使用して条件を視覚的に構築するか、[条件エディタ] タブを使用して CEL 式を入力します。

    5. [保存] をクリックして、[メンバーを追加] に戻ります。複数のロールを追加するには、[別のロールを追加] をクリックします。

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

gsutil

  1. gsutil iam コマンドを使用してバケットの Cloud IAM ポリシーを一時 JSON ファイルに保存します。

    gsutil iam get gs://[BUCKET_NAME] > /tmp/policy.json

    ここで、[BUCKET_NAME] は、Cloud IAM ポリシーを取得するバケットの名前です。例: my-bucket

  2. テキスト エディタで /tmp/policy.json ファイルを編集して、Cloud IAM ポリシー内のバインディングに新しい条件を追加します。

    {
      "version": [VERSION],
      "bindings": [
        {
          "role": "[IAM_ROLE]",
          "members": [
            "[MEMBER_NAME]"
          ],
          "condition": {
            "title": "[TITLE]",
            "description": "[DESCRIPTION]",
            "expression": "[EXPRESSION]"
          }
      ],
      "etag": "[ETAG]"
    }

    ここで

    • [VERSION]Cloud IAM ポリシーのバージョンです。Cloud IAM Conditions を含むバケットの場合は 3 に設定する必要があります。
    • [IAM ROLE] は、条件が適用されるロールです。例: roles/storage.objectCreator
    • [MEMBER_NAME] は、条件が適用されるメンバーです。例: jane@gmail.com
    • [TITLE] は、条件のタイトルです。例: expires in 2019
    • [DESCRIPTION] は、条件の省略可能な説明です。例: Permission revoked on New Year's
    • [EXPRESSION] は、属性ベースの論理式です。例: request.time < timestamp(\"2019-01-01T00:00:00Z\")。他の式の例については、条件属性のリファレンスをご覧ください。Cloud Storage がサポートするのは、日時リソースタイプ、およびリソース名という属性のみであるので注意してください。

    [ETAG] は変更しないでください。

  3. gsutil iam を使用して、変更した Cloud IAM ポリシーをバケットに設定します。

    gsutil iam set /tmp/policy.json gs://[BUCKET_NAME]

コードサンプル

C++

詳細については、Cloud Storage C++ API のリファレンス ドキュメントをご覧ください。

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string bucket_name, std::string role,
   std::string member, std::string condition_title,
   std::string condition_description, std::string condition_expression) {
  auto policy = client.GetNativeBucketIamPolicy(
      bucket_name, gcs::RequestedPolicyVersion(3));
  if (!policy) throw std::runtime_error(policy.status().message());

  policy->set_version(3);
  policy->bindings().emplace_back(gcs::NativeIamBinding(
      role, {member},
      gcs::NativeExpression(condition_expression, condition_title,
                            condition_description)));

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

  std::cout << "Updated IAM policy bucket " << bucket_name
            << ". The new policy is " << *updated << "\n";

  std::cout << "Added member " << member << " with role " << role << " to "
            << bucket_name << ":\n";
  std::cout << "with condition:\n"
            << "\t Title: " << condition_title << "\n"
            << "\t Description: " << condition_description << "\n"
            << "\t Expression: " << condition_expression << "\n";
}

C#

詳細については、Cloud Storage C# API のリファレンス ドキュメントをご覧ください。

        private void AddBucketConditionalIamBinding(string bucketName,
            string role, string member, string title, string description, string expression)
        {
            var storage = StorageClient.Create();
            var policy = storage.GetBucketIamPolicy(bucketName, new GetBucketIamPolicyOptions()
            {
                RequestedPolicyVersion = 3
            });
            policy.Version = 3;

            Policy.BindingsData bindingToAdd = new Policy.BindingsData();
            bindingToAdd.Role = role;
            string[] members = { member };
            bindingToAdd.Members = members;
            bindingToAdd.Condition = new Expr()
            {
                Title = title,
                Description = description,
                Expression = expression
            };
            policy.Bindings.Add(bindingToAdd);

            storage.SetBucketIamPolicy(bucketName, policy);
            Console.WriteLine($"Added {member} with role {role} "
                + $"to {bucketName}");
        }

Go

詳細については、Cloud Storage Go API のリファレンス ドキュメントをご覧ください。

ctx := context.Background()

ctx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel()
bucket := c.Bucket(bucketName)
policy, err := bucket.IAM().V3().Policy(ctx)
if err != nil {
	return err
}

policy.Bindings = append(policy.Bindings, &iampb.Binding{
	Role:    role,
	Members: []string{member},
	Condition: &expr.Expr{
		Title:       title,
		Description: description,
		Expression:  expression,
	},
})

if err := bucket.IAM().V3().SetPolicy(ctx, policy); err != nil {
	return 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.

Java

詳細については、Cloud Storage Java API のリファレンス ドキュメントをご覧ください。

import com.google.cloud.Binding;
import com.google.cloud.Condition;
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 AddBucketIamConditionalBinding {
  /** Example of adding a conditional binding to the Bucket-level IAM */
  public static void addBucketIamConditionalBinding(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 condition
    String conditionTitle = "Title";
    String conditionDescription = "Description";
    String conditionExpression =
        "resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")";
    Condition.Builder conditionBuilder = Condition.newBuilder();
    conditionBuilder.setTitle(conditionTitle);
    conditionBuilder.setDescription(conditionDescription);
    conditionBuilder.setExpression(conditionExpression);

    // Add condition to a binding
    Binding.Builder newBindingBuilder =
        Binding.newBuilder()
            .setRole(role)
            .setMembers(Arrays.asList(member))
            .setCondition(conditionBuilder.build());
    bindings.add(newBindingBuilder.build());

    // Update policy with new conditional binding
    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 with condition %s %s %s\n",
        member, role, bucketName, conditionTitle, conditionDescription, conditionExpression);
  }
}

Node.js

詳細については、Cloud Storage Node.js API のリファレンス ドキュメントをご覧ください。

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const roleName = 'Role to grant, e.g. roles/storage.objectViewer';
// const members = [
//   'user:jdoe@example.com',    // Example members to grant
//   'group:admins@example.com', // the new role to
// ];
// const title = 'Condition title.';
// const description = 'Conditon description.';
// const expression = 'Condition expression.';

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

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

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

  // Gets and updates the bucket's IAM policy
  const [policy] = await bucket.iam.getPolicy({requestedPolicyVersion: 3});

  // Set the policy's version to 3 to use condition in bindings.
  policy.version = 3;

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

  // 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}`);
  });

  console.log('with condition:');
  console.log(`  Title: ${title}`);
  console.log(`  Description: ${description}`);
  console.log(`  Expression: ${expression}`);
}

addBucketConditionalBinding().catch(console.error);

PHP

詳細については、Cloud Storage PHP API のリファレンス ドキュメントをご覧ください。

use Google\Cloud\Storage\StorageClient;

/**
 * Adds a conditional IAM binding to a bucket's IAM policy.
 *
 * @param string $bucketName the name of your Cloud Storage bucket.
 * @param string $role the role that will be given to members in this binding.
 * @param string[] $members the member(s) that is associated to this binding.
 * @param string $title condition's title
 * @param string $description condition's description
 * @param string $expression the condition specified in CEL expression language.
 *
 * To see how to express a condition in CEL, visit:
 * @see https://cloud.google.com/storage/docs/access-control/iam#conditions.
 *
 * @return void
 */
function add_bucket_conditional_iam_binding($bucketName, $role, $members, $title, $description, $expression)
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);

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

    $policy['version'] = 3;

    $policy['bindings'][] = [
        'role' => $role,
        'members' => $members,
        'condition' => [
            'title' => $title,
            'description' => $description,
            'expression' => $expression,
        ],
    ];

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

    printf('Added the following member(s) with role %s to %s:' . PHP_EOL, $role, $bucketName);
    foreach ($members as $member) {
        printf('    %s' . PHP_EOL, $member);
    }
    printf('with condition:' . PHP_EOL);
    printf('    Title: %s' . PHP_EOL, $title);
    printf('    Description: %s' . PHP_EOL, $description);
    printf('    Expression: %s' . PHP_EOL, $expression);
}

Python

詳細については、Cloud Storage Python API のリファレンス ドキュメントをご覧ください。

from google.cloud import storage

def add_bucket_conditional_iam_binding(
    bucket_name, role, title, description, expression, members
):
    """Add a conditional IAM binding to a bucket's IAM policy."""
    # bucket_name = "your-bucket-name"
    # role = "IAM role, e.g. roles/storage.objectViewer"
    # members = {"IAM identity, e.g. user: name@example.com}"
    # title = "Condition title."
    # description = "Condition description."
    # expression = "Condition expression."

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

    policy = bucket.get_iam_policy(requested_policy_version=3)

    # Set the policy's version to 3 to use condition in bindings.
    policy.version = 3

    policy.bindings.append(
        {
            "role": role,
            "members": members,
            "condition": {
                "title": title,
                "description": description,
                "expression": expression,
            },
        }
    )

    bucket.set_iam_policy(policy)

    print("Added the following member(s) with role {} to {}:".format(role, bucket_name))

    for member in members:
        print("    {}".format(member))

    print("with condition:")
    print("    Title: {}".format(title))
    print("    Description: {}".format(description))
    print("    Expression: {}".format(expression))

Ruby

詳細については、Cloud Storage Ruby API のリファレンス ドキュメントをご覧ください。

# bucket_name = "Your Google Cloud Storage bucket name"
# role        = "Bucket-level IAM role"
# member      = "Bucket-level IAM member"
# title       = "Condition Title"
# description = "Condition Description"
# expression  = "Condition Expression"

require "google/cloud/storage"

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

bucket.policy requested_policy_version: 3 do |policy|
  policy.version = 3
  policy.bindings.insert(
    role:      role,
    members:   member,
    condition: {
      title:       title,
      description: description,
      expression:  expression
    }
  )
end

puts "Added #{member} with role #{role} to #{bucket_name} with condition #{title} #{description} #{expression}"

JSON

  1. OAuth 2.0 Playground から承認アクセス トークンを取得します。固有の OAuth 認証情報を使用するようにプレイグラウンドを構成します。
  2. GET getIamPolicy リクエストを使用して、バケットの Cloud IAM ポリシーを一時 JSON ファイルに保存します。

    curl \
    'https://storage.googleapis.com/storage/v1/b/[BUCKET_NAME]/iam' \
    --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' > /tmp/policy.json

    ここで

    • [YOUR_ACCESS_TOKEN] は、手順 1 で生成したアクセス トークンです。
  3. テキスト エディタで /tmp/policy.json ファイルを編集して、Cloud IAM ポリシー内のバインディングに新しい条件を追加します。

    {
          "version": [VERSION],
          "bindings": [
            {
              "role": "[IAM_ROLE]",
              "members": [
                "[MEMBER_NAME]"
              ],
              "condition": {
                "title": "[TITLE]",
                "description": "[DESCRIPTION]",
                "expression": "[EXPRESSION]"
              }
          ],
          "etag": "[ETAG]"
     }

    ここで

    • [VERSION]Cloud IAM ポリシーのバージョンです。Cloud IAM Conditions を含むバケットの場合は 3 に設定する必要があります。
    • [IAM_ROLE] は、条件が適用されるロールです。例: roles/storage.objectCreator
    • [MEMBER_NAME] は、条件が適用されるメンバーです。例: jane@gmail.com
    • [TITLE] は、条件のタイトルです。例: expires in 2019
    • [DESCRIPTION] は、条件の省略可能な説明です。例: Permission revoked on New Year's
    • [EXPRESSION] は、属性ベースの論理式です。例: request.time < timestamp(\"2019-01-01T00:00:00Z\")。他の式の例については、条件属性のリファレンスをご覧ください。 Cloud Storage がサポートするのは、日時リソースタイプ、およびリソース名という属性のみであるので注意してください。

      [ETAG] は変更しないでください。

  4. PUT setIamPolicy リクエストを使用して、変更された Cloud IAM ポリシーをバケットに設定します。

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

    ここで

    • [YOUR_ACCESS_TOKEN] は、手順 1 で生成したアクセス トークンです。

バケットから条件を削除する

Console

  1. Google Cloud Console で Cloud Storage ブラウザを開きます。
    Cloud Storage ブラウザを開く
  2. バケットに関連付けられた行の右端にある [バケット オーバーフロー] メニュー()をクリックします。

  3. [バケットの権限を編集] を選択します。

  4. 削除する条件を含むロールを展開します。

  5. 条件に関連付けられたメンバーの [編集] メニュー([編集] メニュー アイコン。)をクリックします。

  6. 表示された [権限を編集] オーバーレイで、削除する条件の名前をクリックします。

  7. 表示された [条件を編集] オーバーレイで、[削除] をクリックしてから、[確認] をクリックします。

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

gsutil

  1. gsutil iam コマンドを使用してバケットの Cloud IAM ポリシーを一時 JSON ファイルに保存します。

    gsutil iam get gs://[BUCKET_NAME] > /tmp/policy.json
  2. テキスト エディタで /tmp/policy.json ファイルを編集し、Cloud IAM ポリシーから条件を削除します。

  3. gsutil iam を使用して、変更した Cloud IAM ポリシーをバケットに設定します。

    gsutil iam set /tmp/policy.json gs://[BUCKET_NAME]

コードサンプル

C++

詳細については、Cloud Storage C++ API のリファレンス ドキュメントをご覧ください。

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string bucket_name, std::string role,
   std::string condition_title, std::string condition_description,
   std::string condition_expression) {
  auto policy = client.GetNativeBucketIamPolicy(
      bucket_name, gcs::RequestedPolicyVersion(3));
  if (!policy) throw std::runtime_error(policy.status().message());

  policy->set_version(3);
  auto& bindings = policy->bindings();
  auto e = std::remove_if(
      bindings.begin(), bindings.end(),
      [role, condition_title, condition_description,
       condition_expression](gcs::NativeIamBinding b) {
        return (b.role() == role && b.has_condition() &&
                b.condition().title() == condition_title &&
                b.condition().description() == condition_description &&
                b.condition().expression() == condition_expression);
      });
  if (e == bindings.end()) {
    std::cout << "No matching binding group found.\n";
    return;
  }
  bindings.erase(e);
  auto updated = client.SetNativeBucketIamPolicy(bucket_name, *policy);
  if (!updated) throw std::runtime_error(updated.status().message());

  std::cout << "Conditional binding was removed.\n";
}

C#

詳細については、Cloud Storage C# API のリファレンス ドキュメントをご覧ください。

private void RemoveBucketConditionalIamBinding(string bucketName,
    string role, string title, string description, string expression)
{
    var storage = StorageClient.Create();
    var policy = storage.GetBucketIamPolicy(bucketName, new GetBucketIamPolicyOptions()
    {
        RequestedPolicyVersion = 3
    });
    policy.Version = 3;
    if (policy.Bindings.ToList().RemoveAll(binding => binding.Role == role
        && binding.Condition != null
        && binding.Condition.Title == title
        && binding.Condition.Description == description
        && binding.Condition.Expression == expression) > 0)
    {
        // Set the modified IAM policy to be the current IAM policy.
        storage.SetBucketIamPolicy(bucketName, policy);
        Console.WriteLine("Conditional Binding was removed.");
    }
    else
    {
        Console.WriteLine("No matching conditional binding found.");
    }
}

Go

詳細については、Cloud Storage Go API のリファレンス ドキュメントをご覧ください。

ctx := context.Background()

ctx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel()
bucket := c.Bucket(bucketName)
policy, err := bucket.IAM().V3().Policy(ctx)
if err != nil {
	return err
}

// Find the index of the binding matching inputs
i := -1
for j, binding := range policy.Bindings {
	if binding.Role == role && binding.Condition != nil {
		condition := binding.Condition
		if condition.Title == title &&
			condition.Description == description &&
			condition.Expression == expression {
			i = j
		}
	}
}

if i == -1 {
	return errors.New("No matching binding group found.")
}

// Get a slice of the bindings, removing the binding at index i
policy.Bindings = append(policy.Bindings[:i], policy.Bindings[i+1:]...)

if err := bucket.IAM().V3().SetPolicy(ctx, policy); err != nil {
	return 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.

Java

詳細については、Cloud Storage Java API のリファレンス ドキュメントをご覧ください。

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

public class RemoveBucketIamConditionalBinding {
  /** Example of removing a conditional binding to the Bucket-level IAM */
  public static void removeBucketIamConditionalBinding(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";

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

    // Create a condition to compare against
    Condition.Builder conditionBuilder = Condition.newBuilder();
    conditionBuilder.setTitle("Title");
    conditionBuilder.setDescription("Description");
    conditionBuilder.setExpression(
        "resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")");

    Iterator iterator = bindings.iterator();
    while (iterator.hasNext()) {
      Binding binding = (Binding) iterator.next();
      boolean foundRole = binding.getRole().equals(role);
      boolean conditionsEqual = conditionBuilder.build().equals(binding.getCondition());

      // Remove condition when the role and condition are equal
      if (foundRole && conditionsEqual) {
        iterator.remove();
        break;
      }
    }

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

    System.out.println("Conditional Binding was removed.");
  }
}

Node.js

詳細については、Cloud Storage Node.js API のリファレンス ドキュメントをご覧ください。

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const roleName = 'Role to grant, e.g. roles/storage.objectViewer';
// const title = 'Condition title.';
// const description = 'Conditon description.';
// const expression = 'Condition expression.';

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

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

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

  // Gets and updates the bucket's IAM policy
  const [policy] = await bucket.iam.getPolicy({requestedPolicyVersion: 3});

  // Set the policy's version to 3 to use condition in bindings.
  policy.version = 3;

  // Finds and removes the appropriate role-member group with specific condition.
  const index = policy.bindings.findIndex(
    binding =>
      binding.role === roleName &&
      binding.condition &&
      binding.condition.title === title &&
      binding.condition.description === description &&
      binding.condition.expression === expression
  );

  const binding = policy.bindings[index];
  if (binding) {
    policy.bindings.splice(index, 1);

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

    console.log('Conditional Binding was removed.');
  } else {
    // No matching role-member group with specific condition were found
    throw new Error('No matching binding group found.');
  }
}

removeBucketConditionalBinding().catch(console.error);

PHP

詳細については、Cloud Storage PHP API のリファレンス ドキュメントをご覧ください。

use Google\Cloud\Storage\StorageClient;

/**
 * Removes a conditional IAM binding from a bucket's IAM policy.
 *
 * @param string $bucketName the name of your Cloud Storage bucket.
 * @param string $role the role that will be given to members in this binding.
 * @param string $title condition's title
 * @param string $description condition's description
 * @param string $expression the condition specified in CEL expression language.
 *
 * To see how to express a condition in CEL, visit:
 * @see https://cloud.google.com/storage/docs/access-control/iam#conditions.
 *
 * @return void
 */
function remove_bucket_conditional_iam_binding($bucketName, $role, $title, $description, $expression)
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);

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

    $policy['version'] = 3;

    $key_of_conditional_binding = null;
    foreach ($policy['bindings'] as $key => $binding) {
        if ($binding['role'] == $role && isset($binding['condition'])) {
            $condition = $binding['condition'];
            if ($condition['title'] == $title
                 && $condition['description'] == $description
                 && $condition['expression'] == $expression) {
                $key_of_conditional_binding = $key;
                break;
            }
        }
    }

    if ($key_of_conditional_binding != null) {
        unset($policy['bindings'][$key_of_conditional_binding]);
        // Ensure array keys are sequential, otherwise JSON encodes
        // the array as an object, which fails when calling the API.
        $policy['bindings'] = array_values($policy['bindings']);
        $bucket->iam()->setPolicy($policy);
        print('Conditional Binding was removed.' . PHP_EOL);
    } else {
        print('No matching conditional binding found.' . PHP_EOL);
    }
}

Python

詳細については、Cloud Storage Python API のリファレンス ドキュメントをご覧ください。

from google.cloud import storage

def remove_bucket_conditional_iam_binding(
    bucket_name, role, title, description, expression
):
    """Remove a conditional IAM binding from a bucket's IAM policy."""
    # bucket_name = "your-bucket-name"
    # role = "IAM role, e.g. roles/storage.objectViewer"
    # title = "Condition title."
    # description = "Condition description."
    # expression = "Condition expression."

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

    policy = bucket.get_iam_policy(requested_policy_version=3)

    # Set the policy's version to 3 to use condition in bindings.
    policy.version = 3

    condition = {
        "title": title,
        "description": description,
        "expression": expression,
    }
    policy.bindings = [
        binding
        for binding in policy.bindings
        if not (binding["role"] == role and binding.get("condition") == condition)
    ]

    bucket.set_iam_policy(policy)

    print("Conditional Binding was removed.")

Ruby

詳細については、Cloud Storage Ruby API のリファレンス ドキュメントをご覧ください。

# bucket_name = "Your Google Cloud Storage bucket name"
# role        = "Bucket-level IAM role"
# title       = "Condition Title"
# description = "Condition Description"
# expression  = "Condition Expression"

require "google/cloud/storage"

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

bucket.policy requested_policy_version: 3 do |policy|
  policy.version = 3

  binding_to_remove = nil
  policy.bindings.each do |b|
    condition = {
      title:       title,
      description: description,
      expression:  expression
    }
    if (b.role == role) && (b.condition &&
      b.condition.title == title &&
      b.condition.description == description &&
      b.condition.expression == expression)
      binding_to_remove = b
    end
  end
  if binding_to_remove
    policy.bindings.remove binding_to_remove
    puts "Conditional Binding was removed."
  else
    puts "No matching conditional binding found."
  end
end

JSON

  1. OAuth 2.0 Playground から承認アクセス トークンを取得します。固有の OAuth 認証情報を使用するようにプレイグラウンドを構成します。
  2. GET getIamPolicy リクエストを使用して、バケットの Cloud IAM ポリシーを一時 JSON ファイルに保存します。

    curl \
    'https://storage.googleapis.com/storage/v1/b/[BUCKET]/iam' \
    --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' > /tmp/policy.json

    ここで

    • [YOUR_ACCESS_TOKEN] は、手順 1 で生成したアクセス トークンです。
  3. テキスト エディタで /tmp/policy.json ファイルを編集し、Cloud IAM ポリシーから条件を削除します。

  4. PUT setIamPolicy リクエストを使用して、変更された Cloud IAM ポリシーをバケットに設定します。

    curl -X PUT --data-binary @/tmp/policy.json \
      -H "Authorization: Bearer [YOUR_ACCESS_TOKEN]" \
      -H "Content-Type: application/json" \
      "https://storage.googleapis.com/storage/v1/b/[BUCKET_NAME]/iam"

    ここで

    • [YOUR_ACCESS_TOKEN] は、手順 1 で生成したアクセス トークンです。
    • [BUCKET_NAME] は、IAM ポリシーを変更するバケットの名前です。例: my-bucket

プロジェクトで Cloud IAM を使用する

プロジェクトで基本的な Cloud IAM タスクを行う方法について説明します。これらのタスクでは、大半の Cloud Storage タスクとは別のコマンドライン コマンド gcloud と別のエンドポイント cloudresourcemanager.googleapis.com を使用します。

次のタスクを完了するには、resourcemanager.projects.getIamPolicyresourcemanager.projects.setIamPolicy の Cloud IAM 権限が必要です。

プロジェクト レベルのポリシーにメンバーを追加する

Cloud Storage に関連付けられているロールのリストについては、Cloud IAM ロールをご覧ください。Cloud IAM ロールを付与するエンティティの詳細については、メンバーのタイプをご覧ください。

Console

  1. Google Cloud Console で [IAM と管理] ブラウザを開きます。
    [IAM と管理] ブラウザを開く
  2. 上部のバーにある [プロジェクト] プルダウン メニューで、メンバーを追加するプロジェクトを選択します。

  3. [追加] をクリックします。[プロジェクトへのメンバー、ロールの追加] ダイアログが表示されます。

  4. [新しいメンバー] フィールドで、アクセス権を付与するエンティティの名前を指定します。

  5. [ロールを選択] プルダウンで、メンバーに適切なロールを付与します。

    Cloud Storage のバケットとオブジェクトに影響を及ぼすロールは、[プロジェクト] と [ストレージ] サブメニューに表示されます。

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

gsutil

プロジェクト レベルの Cloud IAM ポリシーは、gcloud コマンドで管理します。このコマンドは Google Cloud SDK に含まれています。プロジェクト レベルのポリシーを追加するには、gcloud beta projects add-iam-policy-binding を使用します。

JSON

  1. OAuth 2.0 Playground から承認アクセス トークンを取得します。固有の OAuth 認証情報を使用するように Playground を構成します。
  2. 次の情報が含まれる .json ファイルを作成します。

    {
      "policy": {
        "version": "0",
        "bindings": {
          "role": "[IAM_ROLE]",
          "members": "[MEMBER_NAME]"
        },
      }
    }

    ここで

    • [IAM_ROLE] はメンバーに付与する IAM ロールです。例: roles/storage.objectCreator
    • [MEMBER_NAME] はプロジェクトのアクセス権を付与するメンバーのタイプと名前です。例: user:jane@gmail.com
  3. cURL を使用して Resource Manager API を呼び出し、POST setIamPolicy リクエストを行います。

    curl -X POST --data-binary @[JSON_FILE_NAME].json \
      -H "Authorization: Bearer [OAUTH2_TOKEN]" \
      -H "Content-Type: application/json" \
      "https://cloudresourcemanager.googleapis.com/v1/projects/[PROJECT_ID]:setIamPolicy"

    ここで

    • [JSON_FILE_NAME] は、手順 2 で作成したファイルの名前です。
    • [OAUTH2_TOKEN] は、手順 1 で生成したアクセス トークンです。
    • [PROJECT_ID] はメンバーのアクセス権を付与するプロジェクトの ID です。例: my-project

プロジェクトに適用される Cloud IAM ポリシーを表示する

Console

  1. Google Cloud Console で [IAM と管理] ブラウザを開きます。
    [IAM と管理] ブラウザを開く
  2. 上部バーにある [プロジェクト] プルダウン メニューで、ポリシーを表示するプロジェクトを選択します。

  3. プロジェクトの権限を表示するには、次の 2 つの方法があります。

    • メンバー別の表示: 個々のメンバーに関連付けられた [ロール] 列を表示して、各メンバーのロールを確認します。
    • ロール別の表示: 個々のロールに関連付けられたプルダウンを使用して、ロールを持つメンバーを確認します。

gsutil

プロジェクト レベルの Cloud IAM ポリシーは、gcloud コマンドで管理します。このコマンドは Google Cloud SDK に含まれています。プロジェクトの Cloud IAM ポリシーを表示するには、gcloud beta projects get-iam-policy コマンドを使用します。

JSON

  1. OAuth 2.0 Playground から承認アクセス トークンを取得します。固有の OAuth 認証情報を使用するようにプレイグラウンドを構成します。
  2. cURL を使用して Resource Manager API を呼び出し、POST getIamPolicy リクエストを行います。

    curl -X POST \
      -H "Authorization: Bearer [OAUTH2_TOKEN]" \
      -H "Content-Length: 0" \
      "https://cloudresourcemanager.googleapis.com/v1/projects/[PROJECT_ID]:getIamPolicy"

    ここで

    • [OAUTH2_TOKEN] は、手順 1 で生成したアクセス トークンです。
    • [PROJECT_ID] はメンバーのアクセス権を付与するプロジェクトの ID です。例: my-project

プロジェクト レベルのポリシーからメンバーを削除する

Console

  1. Google Cloud Console で [IAM と管理] ブラウザを開きます。
    [IAM と管理] ブラウザを開く
  2. 上部のバーにある [プロジェクト] プルダウン メニューで、メンバーを削除するプロジェクトを選択します。

  3. 権限が [メンバー] 別に表示されていることを確認し、削除するメンバーを選択します。

  4. [削除] をクリックします。

  5. 表示されたオーバーレイ ウィンドウで、[確認] をクリックします。

gsutil

プロジェクト レベルの Cloud IAM ポリシーは、gcloud コマンドで管理します。このコマンドは Google Cloud SDK に含まれています。プロジェクト レベルのポリシーを削除するには、gcloud beta projects remove-iam-policy-binding を使用します。

JSON

  1. OAuth 2.0 Playground から承認アクセス トークンを取得します。固有の OAuth 認証情報を使用するようにプレイグラウンドを構成します。
  2. プロジェクトに適用されている既存のポリシーを取得します。これを行うには、cURL を使用して、POST getIamPolicy リクエストで Resource Manager API を呼び出します。

    curl -X POST \
      -H "Authorization: Bearer [OAUTH2_TOKEN]" \
      -H "Content-Length: 0" \
      "https://cloudresourcemanager.googleapis.com/v1/projects/[PROJECT_ID]:getIamPolicy"

    ここで

    • [OAUTH2_TOKEN] は、手順 1 で生成したアクセス トークンです。
    • [PROJECT_ID]は、メンバー アクセスを追加するプロジェクトの ID です。例: my-project
  3. 前の手順で取得したポリシーが含まれる .json ファイルを作成します。

  4. .json ファイルを編集し、ポリシーからメンバーを削除します。

  5. cURL を使用して Resource Manager API を呼び出し、POST setIamPolicy リクエストを行います。

    curl -X POST --data-binary @[JSON_FILE_NAME].json \
      -H "Authorization: Bearer [OAUTH2_TOKEN]" \
      -H "Content-Type: application/json" \
      "https://cloudresourcemanager.googleapis.com/v1/projects/[PROJECT_ID]:setIamPolicy"

    ここで

    • [JSON_FILE_NAME] は、手順 2 で作成したファイルの名前です。
    • [OAUTH2_TOKEN] は、手順 1 で生成したアクセス トークンです。
    • [PROJECT_ID]は、メンバー アクセスを付与するプロジェクトの ID です。例: my-project

次のステップ