更改 Google 云存储中(现有)对象的存储 class

Change storage class of (existing) objects in Google Cloud Storage

我最近了解到 Google 云存储 platform/service 上宣布的新存储层和降价。

所以我想将我的一个存储桶的默认存储 class 从 Durable Reduced Availability 更改为 Coldline,因为这适合我在该存储桶中归档的文件。

不过我收到了这张便条:

Changing the default storage class only affects objects you add to this bucket going forward. It does not change the storage class of objects that are already in your bucket.

关于如何更改存储桶中所有现有对象的 class 的任何 advice/tips(使用 Google Cloud Console 或 gsutil)?

将对象同步移动到同一存储桶中的不同存储 class 的最简单方法是使用 rewrite。例如,要使用 gsutil 执行此操作,您可以 运行:

gsutil -m rewrite -s coldline gs://your-bucket/**

注意:确保 gsutil 是最新的(版本 4.22 及更高版本支持带有 rewrite-s 标志)。

或者,您可以使用 Lifecycle Management 功能的新 SetStorageClass 操作来异步(通常需要大约 1 天)修改就地对象的存储 classes(例如通过使用 CreatedBefore 条件设置为更改存储桶的默认存储 class 后的某个时间)。

您现在可以使用 "Data Transfer" 通过将存储桶对象移动到新存储桶来更改存储 class。

从存储的左侧面板访问它。

如果您无法访问 gsutil 控制台,如在 Google Cloud Functions 环境中,因为 Cloud Functions 服务器实例未安装 gsutil。 Gsutil 在您的本地计算机上运行,​​因为您已在本地计算机上安装和配置了它。对于所有这些情况,我建议您评估 python 中的 update_storage_class() blob 方法。当您检索单个 blob 时,可以调用此方法(换句话说,它指的是存储桶中的特定对象)。举个例子:

from google.cloud import storage

storage_client = storage.Client()

blobs = storage_client.list_blobs(bucket_name)

for blob in blobs:
    print(blob.name)
    print(blob.storage_class)

all_classes = ['NEARLINE_STORAGE_CLASS', 'COLDLINE_STORAGE_CLASS', 'ARCHIVE_STORAGE_CLASS', 'STANDARD_STORAGE_CLASS', 'MULTI_REGIONAL_LEGACY_STORAGE_CLASS', 'REGIONAL_LEGACY_STORAGE_CLASS']

new_class = all_classes[my_index]
update_storage_class(new_class)

参考文献:

要将存储 class 从 NEARLINE 更改为 COLDLINE,请创建一个包含以下内容的 JSON 文件:

{
  "lifecycle": {
    "rule": [
      {
        "action": {
          "type": "SetStorageClass",
          "storageClass": "COLDLINE"
        },
        "condition": {
          "matchesStorageClass": [
            "NEARLINE"
          ]
        }
      }
    ]
  }
}

将其命名为 lifecycle.json 或其他名称,然后 运行 在您的 shell:

$ gsutil lifecycle set lifecycle.json gs://my-cool-bucket

更改最多可能需要 24 小时才能完成。据我所知,这个改动不会额外收费。

我这样做了:

gsutil -m rewrite -r -s <storage-class> gs://my-bucket-name/

(-r 表示递归,因为我希望存储桶中的所有对象都受到影响)。