保持ポリシーとバケットロックの使用

このページでは、保持ポリシーやバケットロックなど、バケットロック機能の使用方法について説明します。この機能の詳細については、保持ポリシーとバケットロックをご覧ください。

前提条件

Cloud Storage でこの機能を使用する前に、以下の準備が必要です。

  1. Cloud Storage のバケットを表示および更新するための十分な権限が必要です。

    • バケットを含むプロジェクトを所有している場合は、必要な権限があると考えられます。

    • IAM を使用する場合は、関連するバケットに対する storage.buckets.update 権限と storage.buckets.get 権限が必要です。これらの権限が含まれる roles/storage.admin などの役割を取得する方法については、IAM 権限の使用をご覧ください。

    • ACL を使用する場合は、関連するバケットに対する OWNER 権限が必要です。設定方法については、ACL の設定をご覧ください。

  2. バケットでオブジェクトのバージョニングが無効になっている必要があります。

バケットに保持ポリシーを設定する

バケットに保持ポリシーを設定するには、次の操作を行います。

Console

  1. Google Cloud Console で Cloud Storage ブラウザを開きます。
    Cloud Storage ブラウザを開く
  2. バケットのリストで、保持ポリシーを追加するバケットの名前をクリックします。

  3. ページの上部にある [バケットロック] タブを選択します。

  4. [保持ポリシー] エントリで、[ポリシーを追加] リンクをクリックします。

    [保持ポリシーの設定] ダイアログ ボックスが表示されます。

  5. プルダウンから保持期間の単位を選択します。

    コンソールで別の時間単位に変換する方法については、保持期間をご覧ください。

  6. [値] ボックスに保持期間の長さを入力します。

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

gsutil

gsutil retention set コマンドを使用します。

gsutil retention set [TIME_DURATION] gs://[BUCKET_NAME]

ここで

  • [TIME_DURATION] は、バケット内のオブジェクトを保持する必要がある時間です。たとえば、2678400s です。gsutil で別の時間単位に変換する方法については、保持期間をご覧ください。
  • [BUCKET_NAME] は、該当するバケットの名前です。たとえば、my-bucket です。

成功した場合、レスポンスは次のようになります。

Setting retention policy on 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::chrono::seconds period) {
      StatusOr<gcs::BucketMetadata> original =
          client.GetBucketMetadata(bucket_name);

      if (!original) {
        throw std::runtime_error(original.status().message());
      }

      StatusOr<gcs::BucketMetadata> patched_metadata = client.PatchBucket(
          bucket_name,
          gcs::BucketMetadataPatchBuilder().SetRetentionPolicy(period),
          gcs::IfMetagenerationMatch(original->metageneration()));

      if (!patched_metadata) {
        throw std::runtime_error(patched_metadata.status().message());
      }

      if (!patched_metadata->has_retention_policy()) {
        std::cout << "The bucket " << patched_metadata->name()
                  << " does not have a retention policy set.\n";
        return;
      }

      std::cout << "The bucket " << patched_metadata->name()
                << " retention policy is set to "
                << patched_metadata->retention_policy() << "\n";
    }

C#

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

        private void SetBucketRetentionPolicy(string bucketName,
                long retentionPeriod)
            {
                var storage = StorageClient.Create();
                var bucket = storage.GetBucket(bucketName);
                bucket.RetentionPolicy = new Bucket.RetentionPolicyData();
                bucket.RetentionPolicy.RetentionPeriod = retentionPeriod;
                bucket = storage.UpdateBucket(bucket, new UpdateBucketOptions()
                {
                    IfMetagenerationMatch = bucket.Metageneration
                });

                Console.WriteLine($"Retention policy for {bucketName} was set to {retentionPeriod}");
            }

Go

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

ctx := context.Background()

    bucket := c.Bucket(bucketName)
    bucketAttrsToUpdate := storage.BucketAttrsToUpdate{
    	RetentionPolicy: &storage.RetentionPolicy{
    		RetentionPeriod: retentionPeriod,
    	},
    }
    ctx, cancel := context.WithTimeout(ctx, time.Second*10)
    defer cancel()
    if _, err := bucket.Update(ctx, bucketAttrsToUpdate); err != nil {
    	return err
    }

Java

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

// Instantiate a Google Cloud Storage client
    Storage storage = StorageOptions.getDefaultInstance().getService();

    // The name of a bucket, e.g. "my-bucket"
    // String bucketName = "my-bucket";

    // The retention period for objects in bucket
    // Long retentionPeriod = 3600L; // 1 hour in seconds

    Bucket bucketWithRetentionPolicy =
        storage.update(
            BucketInfo.newBuilder(bucketName).setRetentionPeriod(retentionPeriod).build());

    System.out.println(
        "Retention period for "
            + bucketName
            + " is now "
            + bucketWithRetentionPolicy.getRetentionPeriod());

Node.js

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


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

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

    async function setRetentionPolicy() {
      const [metadata] = await storage
        .bucket(bucketName)
        .setRetentionPeriod(retentionPeriod);
      console.log(
        `Bucket ${bucketName} retention period set for ${metadata.retentionPolicy.retentionPeriod} seconds.`
      );
    }

    setRetentionPolicy().catch(console.error);

PHP

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

use Google\Cloud\Storage\StorageClient;

    /**
     * Sets a bucket's retention policy.
     *
     * @param string $bucketName the name of your Cloud Storage bucket.
     * @param string $retentionPeriod the number of seconds for your retention period.
     */
    function set_retention_policy($bucketName, $retentionPeriod)
    {
        $storage = new StorageClient();
        $bucket = $storage->bucket($bucketName);
        $bucket->update([
            'retentionPolicy' => [
                'retentionPeriod' => $retentionPeriod
            ]]);
        printf('Bucket %s retention period set for %s seconds' . PHP_EOL, $bucketName,
            $retentionPeriod);
    }

Python

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

from google.cloud import storage

    def set_retention_policy(bucket_name, retention_period):
        """Defines a retention policy on a given bucket"""
        # bucket_name = "my-bucket"
        # retention_period = 10

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

        bucket.retention_period = retention_period
        bucket.patch()

        print(
            "Bucket {} retention period set for {} seconds".format(
                bucket.name, bucket.retention_period
            )
        )

    

Ruby

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

# project_id       = "Your Google Cloud project ID"
    # bucket_name      = "Name of your Google Cloud Storage bucket"
    # retention_period = "Object retention period defined in seconds"

    require "google/cloud/storage"

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

    bucket.retention_period = retention_period

    puts "Retention period for #{bucket_name} is now #{bucket.retention_period} seconds."

REST API

JSON API

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

    {
          "retentionPolicy": {
            "retentionPeriod": "[TIME_IN_SECONDS]"
          }
        }

    ここで、[TIME_IN_SECONDS] は、バケット内のオブジェクトを保持する時間(秒単位)です。たとえば、2678400 です。さまざまな時間単位を秒を使用して測定する方法については、保持期間をご覧ください。

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

    curl -X PATCH --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]?fields=retentionPolicy"

    ここで

    • [JSON_FILE_NAME] は、手順 2 で作成したファイルの名前です。
    • [OAUTH2_TOKEN] は、手順 1 で生成したアクセス トークンです。
    • [BUCKET_NAME] は、該当するバケットの名前です。たとえば、my-bucket です。

XML API

XML API を使用して既存のバケットに保持ポリシーを設定することはできません。これは、新しいバケットに保持ポリシーを追加する場合にのみ使用できます。

バケットから保持ポリシーを削除する

バケットから保持ポリシーを削除するには、次の操作を行います。

Console

  1. Google Cloud Console で Cloud Storage ブラウザを開きます。
    Cloud Storage ブラウザを開く
  2. バケットのリストで、保持ポリシーを削除するバケットの名前をクリックします。

  3. ページの上部にある [バケットロック] タブを選択します。

  4. [保持ポリシー] エントリで、ゴミ箱のアイコンをクリックします。

    [保持ポリシーを削除しますか?] ダイアログ ボックスが表示されます。

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

gsutil

gsutil retention clear コマンドを使用します。

gsutil retention clear gs://[BUCKET_NAME]

[BUCKET_NAME] は、該当するバケットの名前です。たとえば、my-bucket です。

成功した場合、レスポンスは次のようになります。

Clearing retention policy on gs://[BUCKET_NAME]/...

コードサンプル

C++

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

namespace gcs = google::cloud::storage;
    using ::google::cloud::StatusOr;
    [](gcs::Client client, std::string bucket_name) {
      StatusOr<gcs::BucketMetadata> original =
          client.GetBucketMetadata(bucket_name);

      if (!original) {
        throw std::runtime_error(original.status().message());
      }

      StatusOr<gcs::BucketMetadata> patched_metadata = client.PatchBucket(
          bucket_name, gcs::BucketMetadataPatchBuilder().ResetRetentionPolicy(),
          gcs::IfMetagenerationMatch(original->metageneration()));

      if (!patched_metadata) {
        throw std::runtime_error(patched_metadata.status().message());
      }

      if (!patched_metadata->has_retention_policy()) {
        std::cout << "The bucket " << patched_metadata->name()
                  << " does not have a retention policy set.\n";
        return;
      }

      std::cout << "The bucket " << patched_metadata->name()
                << " retention policy is set to "
                << patched_metadata->retention_policy()
                << ". This is unexpected, maybe a concurrent change by another"
                << " application?\n";
    }

C#

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

        private void RemoveBucketRetentionPolicy(string bucketName)
            {
                var storage = StorageClient.Create();
                var bucket = storage.GetBucket(bucketName);
                if (bucket.RetentionPolicy != null)
                {
                    bool? isLockedOrNull = bucket?.RetentionPolicy.IsLocked;
                    bool isLocked =
                        isLockedOrNull.HasValue ? isLockedOrNull.Value : false;
                    if (isLocked)
                    {
                        throw new Exception("Retention Policy is locked.");
                    }

                    bucket.RetentionPolicy.RetentionPeriod = null;
                    bucket = storage.UpdateBucket(bucket, new UpdateBucketOptions()
                    {
                        IfMetagenerationMatch = bucket.Metageneration
                    });

                    Console.WriteLine($"Retention period for {bucketName} has been removed.");
                }
            }

Go

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

ctx := context.Background()
    bucket := c.Bucket(bucketName)

    attrs, err := c.Bucket(bucketName).Attrs(ctx)
    if err != nil {
    	return err
    }
    if attrs.RetentionPolicy.IsLocked {
    	return errors.New("retention policy is locked")
    }

    bucketAttrsToUpdate := storage.BucketAttrsToUpdate{
    	RetentionPolicy: &storage.RetentionPolicy{},
    }
    ctx, cancel := context.WithTimeout(ctx, time.Second*10)
    defer cancel()
    if _, err := bucket.Update(ctx, bucketAttrsToUpdate); err != nil {
    	return err
    }

Java

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

// Instantiate a Google Cloud Storage client
    Storage storage = StorageOptions.getDefaultInstance().getService();

    // The name of a bucket, e.g. "my-bucket"
    // String bucketName = "my-bucket";

    Bucket bucket = storage.get(bucketName, BucketGetOption.fields(BucketField.RETENTION_POLICY));
    if (bucket.retentionPolicyIsLocked() != null && bucket.retentionPolicyIsLocked()) {
      throw new IllegalArgumentException(
          "Unable to remove retention period as retention policy is locked.");
    }

    Bucket bucketWithoutRetentionPolicy =
        bucket.toBuilder().setRetentionPeriod(null).build().update();

    System.out.println("Retention period for " + bucketName + " has been removed");

Node.js

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

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

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

    async function removeRetentionPolicy() {
      const [metadata] = await storage.bucket(bucketName).getMetadata();
      if (metadata.retentionPolicy && metadata.retentionPolicy.isLocked) {
        console.log(
          'Unable to remove retention period as retention policy is locked.'
        );
        return null;
      } else {
        const results = await storage.bucket(bucketName).removeRetentionPeriod();
        console.log(`Removed bucket ${bucketName} retention policy.`);
        return results;
      }
    }

    removeRetentionPolicy().catch(console.error);

PHP

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

use Google\Cloud\Storage\StorageClient;

    /**
     * Removes a bucket's retention policy.
     *
     * @param string $bucketName the name of your Cloud Storage bucket.
     */
    function remove_retention_policy($bucketName)
    {
        $storage = new StorageClient();
        $bucket = $storage->bucket($bucketName);
        $bucket->reload();

        if (array_key_exists('isLocked', $bucket->info()['retentionPolicy']) &&
            $bucket->info()['retentionPolicy']['isLocked']) {
            printf('Unable to remove retention period as retention policy is locked.' . PHP_EOL);
            return;
        }

        $bucket->update([
            'retentionPolicy' => []
        ]);
        printf('Removed bucket %s retention policy' . PHP_EOL, $bucketName);
    }

Python

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

from google.cloud import storage

    def remove_retention_policy(bucket_name):
        """Removes the retention policy on a given bucket"""
        # bucket_name = "my-bucket"

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

        if bucket.retention_policy_locked:
            print(
                "Unable to remove retention period as retention policy is locked."
            )
            return

        bucket.retention_period = None
        bucket.patch()

        print("Removed bucket {} retention policy".format(bucket.name))

    

Ruby

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

# project_id  = "Your Google Cloud project ID"
    # bucket_name = "Name of your Google Cloud Storage bucket"

    require "google/cloud/storage"

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

    if !bucket.retention_policy_locked?
      bucket.retention_period = nil
      puts "Retention policy for #{bucket_name} has been removed."
    else
      puts "Policy is locked and retention policy can't be removed."
    end

REST API

JSON API

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

    {
          "retentionPolicy": null
        }
  3. cURL を使用して PATCH Bucket リクエストで JSON API を呼び出します。

    curl -X PATCH --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]?fields=retentionPolicy"

    ここで

    • [JSON_FILE_NAME] は、手順 2 で作成したファイルの名前です。
    • [OAUTH2_TOKEN] は、手順 1 で生成したアクセス トークンです。
    • [BUCKET_NAME] は、該当するバケットの名前です。たとえば、my-bucket です。

XML API

XML API を使用して、バケットから保持ポリシーを削除することはできません。gsutil など、他の Cloud Storage ツールを使用してください。

バケットをロックする

バケットをロックしてバケットの保持ポリシーを編集できなくするには、次の操作を行います。

Console

  1. Google Cloud Console で Cloud Storage ブラウザを開きます。
    Cloud Storage ブラウザを開く
  2. バケットのリストで、保持ポリシーをロックするバケットの名前をクリックします。

  3. ページの上部にある [バケットロック] タブを選択します。

  4. ロックされたエントリで、鍵アイコンをクリックします。

    [このバケットの保持ポリシーをロックしますか?] ダイアログ ボックスが表示されます。

  5. ロックした場合の注意事項を確認します。

  6. [バケット名] テキスト ボックスにバケットの名前を入力します。

  7. [ポリシーをロック] をクリックします。

gsutil

  1. gsutil retention lock コマンドを使用します。

    gsutil retention lock gs://[BUCKET_NAME]

    [BUCKET_NAME] は、該当するバケットの名前です。たとえば、my-bucket です。

  2. 続行するように求められたら、「y」と入力します。

成功した場合、レスポンスは次のようになります。

Locking retention policy on gs://[BUCKET_NAME]/...

コードサンプル

C++

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

namespace gcs = google::cloud::storage;
    using ::google::cloud::StatusOr;
    [](gcs::Client client, std::string bucket_name) {
      StatusOr<gcs::BucketMetadata> original =
          client.GetBucketMetadata(bucket_name);

      if (!original) {
        throw std::runtime_error(original.status().message());
      }

      StatusOr<gcs::BucketMetadata> updated_metadata =
          client.LockBucketRetentionPolicy(bucket_name,
                                           original->metageneration());

      if (!updated_metadata) {
        throw std::runtime_error(updated_metadata.status().message());
      }

      if (!updated_metadata->has_retention_policy()) {
        std::cerr << "The bucket " << updated_metadata->name()
                  << " does not have a retention policy, even though the"
                  << " operation to set it was successful.\n"
                  << "This is unexpected, and may indicate that another"
                  << " application has modified the bucket concurrently.\n";
        return;
      }

      std::cout << "Retention policy successfully locked for bucket "
                << updated_metadata->name() << "\nNew retention policy is: "
                << updated_metadata->retention_policy()
                << "\nFull metadata: " << *updated_metadata << "\n";
    }

C#

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

private void LockBucketRetentionPolicy(string bucketName)
    {
        var storage = StorageClient.Create();
        var bucket = storage.GetBucket(bucketName);
        storage.LockBucketRetentionPolicy(bucketName,
            bucket.Metageneration.Value);
        bucket = storage.GetBucket(bucketName);
        Console.WriteLine($"Retention policy for {bucketName} is now locked");
        Console.WriteLine($"Retention policy effective as of {bucket.RetentionPolicy.EffectiveTime}");
    }

Go

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

ctx := context.Background()
    bucket := c.Bucket(bucketName)

    ctx, cancel := context.WithTimeout(ctx, time.Second*50)
    defer cancel()
    attrs, err := c.Bucket(bucketName).Attrs(ctx)
    if err != nil {
    	return err
    }

    conditions := storage.BucketConditions{
    	MetagenerationMatch: attrs.MetaGeneration,
    }
    if err := bucket.If(conditions).LockRetentionPolicy(ctx); err != nil {
    	return err
    }

    lockedAttrs, err := c.Bucket(bucketName).Attrs(ctx)
    if err != nil {
    	return err
    }
    log.Printf("Retention policy for %v is now locked\n", bucketName)
    log.Printf("Retention policy effective as of %v\n",
    	lockedAttrs.RetentionPolicy.EffectiveTime)

Java

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

// Instantiate a Google Cloud Storage client
    Storage storage = StorageOptions.getDefaultInstance().getService();

    // The name of a bucket, e.g. "my-bucket"
    // String bucketName = "my-bucket";

    Bucket bucket =
        storage.get(bucketName, Storage.BucketGetOption.fields(BucketField.METAGENERATION));
    Bucket lockedBucket =
        bucket.lockRetentionPolicy(Storage.BucketTargetOption.metagenerationMatch());

    System.out.println("Retention period for " + bucketName + " is now locked");
    System.out.println(
        "Retention policy effective as of " + new Date(lockedBucket.getRetentionEffectiveTime()));

Node.js

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


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

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

    async function lockRetentionPolicy() {
      // get_bucket gets the current metageneration value for the bucket,
      // required by lock_retention_policy.
      const [unlockedMetadata] = await storage.bucket(bucketName).getMetadata();
      // Warning: Once a retention policy is locked it cannot be unlocked
      // and retention period can only be increased.
      const [lockedMetadata] = await storage
        .bucket(bucketName)
        .lock(unlockedMetadata.metageneration);
      console.log(`Retention policy for ${bucketName} is now locked.`);
      console.log(
        `Retention policy effective as of ${lockedMetadata.retentionPolicy.effectiveTime}`
      );

      return lockedMetadata;
    }

    lockRetentionPolicy().catch(console.error);

PHP

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

use Google\Cloud\Storage\StorageClient;

    /**
     * Locks a bucket's retention policy.
     *
     * @param string $bucketName the name of your Cloud Storage bucket.
     */
    function lock_retention_policy($bucketName)
    {
        $storage = new StorageClient();
        $bucket = $storage->bucket($bucketName);
        $bucket->reload();
        $bucket->lockRetentionPolicy();
        printf('Bucket %s retention policy locked' . PHP_EOL, $bucketName);
    }

Python

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

from google.cloud import storage

    def lock_retention_policy(bucket_name):
        """Locks the retention policy on a given bucket"""
        # bucket_name = "my-bucket"

        storage_client = storage.Client()
        # get_bucket gets the current metageneration value for the bucket,
        # required by lock_retention_policy.
        bucket = storage_client.get_bucket(bucket_name)

        # Warning: Once a retention policy is locked it cannot be unlocked
        # and retention period can only be increased.
        bucket.lock_retention_policy()

        print("Retention policy for {} is now locked".format(bucket_name))
        print(
            "Retention policy effective as of {}".format(
                bucket.retention_policy_effective_time
            )
        )

    

Ruby

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

# project_id  = "Your Google Cloud project ID"
    # bucket_name = "Name of your Google Cloud Storage bucket"

    require "google/cloud/storage"

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

    # Warning: Once a retention policy is locked it cannot be unlocked
    # and retention period can only be increased.
    # Uses Bucket#metageneration as a precondition.
    bucket.lock_retention_policy!

    puts "Retention policy for #{bucket_name} is now locked."
    puts "Retention policy effective as of #{bucket.retention_effective_at}."

REST API

JSON API

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

    curl -X POST \
        -H "Authorization: Bearer [OAUTH2_TOKEN]" \
        "https://storage.googleapis.com/storage/v1/b/[BUCKET_NAME]/lockRetentionPolicy?ifMetagenerationMatch=[BUCKET_METAGENERATION_NUMBER]"

    ここで

    • [OAUTH2_TOKEN] は、手順 1 で生成したアクセス トークンの名前です。
    • [BUCKET_NAME] は、該当するバケットの名前です。たとえば、my-bucket です。
    • [BUCKET_METAGENERATION_NUMBER] はバケットの metageneration 値です。たとえば、8 です。バケットの metageneration 値を確認するには、GET Bucket リクエストで JSON API を呼び出します。

XML API

XML API を使用してバケットをロックすることはできません。 gsutil など、他の Cloud Storage ツールを使用してください。

バケットの保持ポリシーとロック状態を確認する

バケットに設定されている保持ポリシーとロック状態を確認するには、次の操作を行います。

Console

  1. Google Cloud Console で Cloud Storage ブラウザを開きます。
    Cloud Storage ブラウザを開く
  2. [列表示オプション] メニュー(列オプション アイコン。)で、[保持ポリシー] がオンになっていることを確認します。

  3. バケットのリストで、各バケットの保持期間が [保持ポリシー] 列に表示されます。保持ポリシーがロックされている場合、保持期間のすぐ左側に鍵のイメージが表示されます。

gsutil

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

gsutil retention get gs://[BUCKET_NAME]

[BUCKET_NAME] は、該当するバケットの名前です。たとえば、my-bucket です。

成功した場合、レスポンスは次のようになります。

gs://[BUCKET_NAME]/ has no retention policy.

または

gs://retention-test/:
        Retention policy [LOCK_STATUS]:
        Duration: [TIME_LENGTH]
        Effective Time: [SET_DATE]

コードサンプル

C++

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

namespace gcs = google::cloud::storage;
    using ::google::cloud::StatusOr;
    [](gcs::Client client, std::string bucket_name) {
      StatusOr<gcs::BucketMetadata> bucket_metadata =
          client.GetBucketMetadata(bucket_name);

      if (!bucket_metadata) {
        throw std::runtime_error(bucket_metadata.status().message());
      }

      if (!bucket_metadata->has_retention_policy()) {
        std::cout << "The bucket " << bucket_metadata->name()
                  << " does not have a retention policy set.\n";
        return;
      }

      std::cout << "The bucket " << bucket_metadata->name()
                << " retention policy is set to "
                << bucket_metadata->retention_policy() << "\n";
    }

C#

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

        private void GetBucketRetentionPolicy(string bucketName)
            {
                var storage = StorageClient.Create();
                var bucket = storage.GetBucket(bucketName);

                if (bucket.RetentionPolicy != null)
                {
                    Console.WriteLine("Retention policy:");
                    Console.WriteLine($"period: {bucket.RetentionPolicy.RetentionPeriod}");
                    Console.WriteLine($"effective time: {bucket.RetentionPolicy.EffectiveTime}");
                    bool? isLockedOrNull = bucket?.RetentionPolicy.IsLocked;
                    bool isLocked =
                        isLockedOrNull.HasValue ? isLockedOrNull.Value : false;
                    Console.WriteLine("policy locked: {0}", isLocked);
                }
            }

Go

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

ctx := context.Background()

    ctx, cancel := context.WithTimeout(ctx, time.Second*10)
    defer cancel()
    attrs, err := c.Bucket(bucketName).Attrs(ctx)
    if err != nil {
    	return nil, err
    }
    if attrs.RetentionPolicy != nil {
    	log.Print("Retention Policy\n")
    	log.Printf("period: %v\n", attrs.RetentionPolicy.RetentionPeriod)
    	log.Printf("effective time: %v\n", attrs.RetentionPolicy.EffectiveTime)
    	log.Printf("policy locked: %v\n", attrs.RetentionPolicy.IsLocked)
    }

Java

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

// Instantiate a Google Cloud Storage client
    Storage storage = StorageOptions.getDefaultInstance().getService();

    // The name of a bucket, e.g. "my-bucket"
    // String bucketName = "my-bucket";

    Bucket bucket = storage.get(bucketName, BucketGetOption.fields(BucketField.RETENTION_POLICY));

    System.out.println("Retention Policy for " + bucketName);
    System.out.println("Retention Period: " + bucket.getRetentionPeriod());
    if (bucket.retentionPolicyIsLocked() != null && bucket.retentionPolicyIsLocked()) {
      System.out.println("Retention Policy is locked");
    }
    if (bucket.getRetentionEffectiveTime() != null) {
      System.out.println("Effective Time: " + new Date(bucket.getRetentionEffectiveTime()));
    }

Node.js

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


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

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

    async function getRetentionPolicy() {
      const [metadata] = await storage.bucket(bucketName).getMetadata();
      if (metadata.retentionPolicy) {
        const retentionPolicy = metadata.retentionPolicy;
        console.log('A retention policy exists!');
        console.log(`Period: ${retentionPolicy.retentionPeriod}`);
        console.log(`Effective time: ${retentionPolicy.effectiveTime}`);
        if (retentionPolicy.isLocked) {
          console.log('Policy is locked');
        } else {
          console.log('Policy is unlocked');
        }
      }
    }

    getRetentionPolicy().catch(console.error);

PHP

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

use Google\Cloud\Storage\StorageClient;

    /**
     * Gets a bucket's retention policy.
     *
     * @param string $bucketName the name of your Cloud Storage bucket.
     */
    function get_retention_policy($bucketName)
    {
        $storage = new StorageClient();
        $bucket = $storage->bucket($bucketName);
        $bucket->reload();

        printf('Retention Policy for ' . $bucketName . PHP_EOL);
        printf('Retention Period: ' . $bucket->info()['retentionPolicy']['retentionPeriod'] . PHP_EOL);
        if (array_key_exists('isLocked', $bucket->info()['retentionPolicy']) &&
            $bucket->info()['retentionPolicy']['isLocked']) {
            printf('Retention Policy is locked' . PHP_EOL);
        }
        if ($bucket->info()['retentionPolicy']['effectiveTime']) {
            printf('Effective Time: ' . $bucket->info()['retentionPolicy']['effectiveTime'] . PHP_EOL);
        }
    }

Python

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

from google.cloud import storage

    def get_retention_policy(bucket_name):
        """Gets the retention policy on a given bucket"""
        # bucket_name = "my-bucket"

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

        print("Retention Policy for {}".format(bucket_name))
        print("Retention Period: {}".format(bucket.retention_period))
        if bucket.retention_policy_locked:
            print("Retention Policy is locked")

        if bucket.retention_policy_effective_time:
            print(
                "Effective Time: {}".format(bucket.retention_policy_effective_time)
            )

    

Ruby

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

# project_id  = "Your Google Cloud project ID"
    # bucket_name = "Name of your Google Cloud Storage bucket"

    require "google/cloud/storage"

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

    puts "Retention policy:"
    puts "period: #{bucket.retention_period}"
    puts "effective time: #{bucket.retention_effective_at}"
    puts "policy locked: #{bucket.retention_policy_locked?}"

REST API

JSON API

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

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

    ここで

    • [OAUTH2_TOKEN] は、手順 1 で生成したアクセス トークンの名前です。
    • [BUCKET_NAME] は、該当するバケットの名前です。たとえば、my-bucket です。

    バケットに保持ポリシーが設定されている場合、レスポンスは次のようになります。

    {
          "retentionPolicy": {
              "retentionPeriod": "[TIME_IN_SECONDS]",
              "effectiveTime": "[DATETIME]",
              "isLocked": "[BOOLEAN]"
           },
        }

XML API

XML API を使用して、バケットの保持ポリシーを確認することはできません。gsutil など、他の Cloud Storage ツールを使用してください。

次のステップ