复制对象
复制功能可让您定义规则,以便自动、异步地将对象从源存储桶复制到 同一账户 中的目标存储桶。 此外,你还可以在 不同的账户 中将对象从一个桶复制到另一个桶。
什么是复制?
复制功能可将新创建的对象和对象更新从源数据桶复制到目标数据桶。
- 只有新对象或现有对象的新版本(在复制规则添加到存储桶后创建)才会复制到目标存储桶。 现有对象可以 通过复制到自身来 复制,从而创建一个新的复制版本。
- 源对象的元数据会应用到复制的对象中。
- 两个存储桶之间的双向复制要求两个存储桶上的规则都处于活动状态。
- 过滤器(由前缀和/或标记组成)可用于限定复制规则的范围,使其仅适用于部分对象。 单个策略中可定义多个规则,这些规则可指定不同的目的地。 通过这种方式,同一数据桶中的不同对象可以复制到不同的目的地。
为什么要使用复制?
- 在不同地理位置的数据桶中保存一份数据副本。
- 通过定义复制规则,仅在允许的位置存储副本,满足数据主权的合规性规定。
- 保持生产数据和测试数据同步,因为复制会保留对象元数据,如最后修改时间、版本 ID 等。
- 通过为目标存储桶定义不同的存储类别和/或生命周期规则,为复制对象管理独立于源的存储类别和生命周期策略。 同样,你也可以在单独的服务实例甚至 IBM Cloud 账户中将副本存储在一个桶中,并独立控制对副本的访问。
开始复制
要开始工作,必须满足以下一些先决条件:
- 在源数据桶上设置
Writer或Manager平台角色,或指定具有相应复制操作(如cloud-object-storage.bucket.put_replication)的自定义角色。 - 您不需要有访问目标存储桶的权限,但需要有足够的平台角色来创建允许源存储桶写入目标存储桶的 新 IAM 策略。
- 目标桶必须未启用传统桶防火墙,但可以使用 基于上下文的限制。
- 使用 SSE-C 加密的对象不能复制,但 Key Protect 等托管加密(SSE-KMS) 与复制完全兼容。
- 无法复制处于存档状态的对象。
- 如果源存储桶和目标存储桶在不同的 IBM 账户中,请确保在每个账户中创建存储桶。
- 在源存储桶和目标存储桶上启用 版本控制。
由于版本管理是复制的必要条件,因此不可能在使用 不可变 Object Storage 策略 配置的存储桶中复制对象。
使用一个 IBM 账户
要在同一 IBM 账户中的存储桶之间复制对象,请执行以下操作:
- 导航到所选源桶后,单击“配置”选项卡。
- 查找“Bucket 复制”,然后单击“设置复制”按钮。
- 选择复制源,然后单击 “下一步”。
- 从下拉菜单中选择实例和水桶。 或者,将单选按钮切换为“否”,然后粘贴目标邮筒的 CRN。
- 单击“检查权限”按钮。
现在,您需要在目标桶上授予源桶 Writer 权限。 有几种方法可以做到这一点,但最简单的是使用 IBM Cloud Shell 和 IBM Cloud CLI。
- 在新窗口或选项卡中打开 IBM Cloud Shell。
- 复制对象存储控制台中显示的 IBM Cloud CLI 命令,并将其粘贴到新的 shell 中。
- 返回水桶配置窗口或选项卡,再次单击“检查权限”按钮。
现在,您将创建一条复制规则。
- 确保规则状态单选按钮设置为已启用。
- 为规则指定名称和优先级,以及限制复制规则对象的前缀或标记过滤器。
- 单击完成。
使用不同的 IBM 账户
要在不同 IBM 账户的存储桶之间复制对象,请执行以下操作:
- 在目的地 IBM 账户上设置 IAM 策略。 有关创建 IAM 策略的信息,请参阅 什么是 IAM 策略以及谁可以分配这些 策略。
- 在“Bucket 配置”页面上找到 CRN 格式的账户 ID 和服务实例 ID。
- 使用目标账户的 IBM Cloud UI,单击“管理”>“访问**(IAM)**”。
- 单击左侧面板中的身份验证。
- 单击 “创建”以创建新的 IAM 策略。
- 授予服务授权页面配置。 这是创建新 IAM 策略后的页面。
- 选择另一个账户,并提供源账户的账户 ID。
- 提供以下服务 Cloud Object Storage.
- 在访问范围中,选择特定资源。
- 选择源服务实例,然后输入源桶的服务实例 ID。
- 在目标下,选择 Cloud Object Storage 作为源桶访问。
- 对于目标范围,选择**特定资源>*服务实例。
- 从下拉菜单中选择目标账户的服务实例 ID。
- 根据需要选择“对象写入器”或 “写入器”角色。
对象写入器角色足以启用复制。
术语
源数据桶:为其配置复制策略的桶。 它是复制对象的来源。
目标存储桶:在源数据桶复制策略中被定义为目标的数据桶。 它是复制对象的目标。 也称为“目的地”水桶。
复制:因向源桶发出请求而在目标桶中创建的新对象。
复制了什么?
通过 CopyObject、PutObject 或 CompleteMultipartUpload 创建的新对象将从源数据桶复制到目标数据桶。 复制对象将继承源对象的以下元数据字段:Etag, Last Modified Time, Version ID, user-attributes,和 Tags。
如果复制策略进行了配置,删除标记将被复制。
版本标签的更新将从源数据桶复制到目标数据桶。
下列内容没有复制:
- 生命周期事件引发的行动
- 直接写入档案的对象
- 从存档层恢复的对象
- 通过 SSE-C 加密的对象
- 对象 ACL
利用复制实现业务连续性和灾难恢复
复制可用于在服务中断时提供连续性:
- 确保源存储桶和目标存储桶位于不同位置。
- 验证两个存储库中对象的最新版本是否同步。 工具,如
Rclone(rclone check命令)之类的工具可以从命令行检查同步性。 - 如果发生故障,应用程序的流量可以重定向到目标数据桶。
一致性和数据完整性
虽然 IBM Cloud Object Storage 为所有数据 IO 操作提供了强大的一致性,但数据桶配置最终是一致的。 首次在存储桶上启用复制规则后,可能需要一些时间才能将配置传播到整个系统,并开始复制新对象。
错误处理
复制失败可能由多种原因导致,包括(但不限于)存储桶配置错误、服务中断、用户与目标存储桶的交互等。
COS 具备内置的容错能力,可处理复制故障。 当发生故障时,COS 可在最多 30 天内进行重试。 重试频率会根据故障的性质而有所不同。 例如,由罕见的 I/O 错误导致的失败可能在数小时内重试,而由用户存储桶配置错误导致的失败则可能每天重试一次。 如果故障在 30 天内未得到解决,系统将不再自动重试。 所有长期故障均可通过 ListBucketReplicationFailures。
如果您希望重试持续超过 30 天的“过期”失败,可以使用 PutBucketReplicationFailureReattempt。
故障原因
在 ListBucketReplicationFailures API 的响应中,每个 failure 元素都会提供 SyncFailureCause,其中列出了已知的最后一次失败原因。 下表列出了可能的原因:
| 原因 | 说明 |
|---|---|
| 目标存储桶已禁用版本控制 | 目标存储桶未启用版本控制。 用户很可能是在配置好复制功能后暂停了版本控制。 |
| 目标存储桶不允许执行复制操作 | COS 服务无权代表用户修改目标存储桶。 请检查 IAM 中源存储桶和目标存储桶资源之间是否仍存在服务间授权。 |
| 未找到远程存储桶 | 无法找到目标桶。 用户可能已删除了目标存储桶。 检查目标存储桶是否仍然存在。 |
| 源/远程存储桶未找到或已被禁用 | 未找到该桶,或者该桶处于不可用状态。 检查存储桶是否仍然存在。 如果出现这种情况,请联系客户支持。 |
| 未找到目标对象 | 尝试复制元数据更改(例如标签/对象锁定),但目标对象不存在。 用户很可能在更改被复制之前,就已经在目标存储桶中删除了该对象。 |
| 未找到本地对象 | 尝试复制时未找到源对象。 用户很可能在写入或修改源对象后不久就将其删除了。 |
| 目标存储桶未启用对象锁定功能 | 尝试将“对象锁定”设置复制到某个对象上,但目标存储桶未启用“对象锁定”功能。 |
| 该加密密钥要么处于非活动状态,要么已被删除 | COS 尝试从 Key Protect 检索加密密钥(源存储桶已配置 SSE-KP/SSE-HPCS),但该密钥已被删除。 |
| 缺少 KMS 实例的端点信息 | 无法检索到读取加密密钥所需的密钥管理服务端点。 如果错误仍然存在,请联系客户支持。 |
| 权限不足,无法查询 KMS 端点信息 | 源存储桶资源无权查询读取加密密钥所需的密钥管理服务(KMS)端点。 检查您的 IAM 服务间授权策略。 |
| 内部错误。 | 各种内部问题导致复制无法进行。 请联系客户支持。 |
IAM 行动
有新的 IAM 操作与复制相关。
| IAM 操作 | 角色 |
|---|---|
cloud-object-storage.bucket.get_replication |
管理者、写入者和读取者 |
cloud-object-storage.bucket.put_replication |
管理者和写入者 |
cloud-object-storage.bucket.delete_replication |
管理者和写入者 |
cloud-object-storage.bucket.get_replication_failures |
管理者、写入者和读取者 |
cloud-object-storage.bucket.put_replication_reattempt |
管理者和写入者 |
Activity Tracker 事件
复制会生成其他事件。
| 事件操作 | 生成于 | 描述 |
|---|---|---|
| cloud-object-storage.bucket-replication.create | 源存储区 | 当用户发起 PutBucketReplication API 请求时 |
| cloud-object-storage.bucket-replication.read | 源存储区 | 当用户发起 GetBucketReplication API 请求时 |
| cloud-object-storage.bucket-replication.delete | 源存储区 | 当用户发起 DeleteBucketReplication API 请求时 |
| cloud-object-storage.bucket-replication-failures.list | 源存储区 | 当用户发起 ListBucketReplicationFailures API 请求时 |
| cloud-object-storage.bucket-replication-failures.update | 源存储区 | 当用户发起 PutReplicationFailureReattempt API 请求时 |
| cloud-object-storage.object-replication.sync | 源存储区 | 当 COS 从源存储桶复制一个对象时 |
| cloud-object-storage.object-replication.create | 目标存储区 | 当 COS 在目标存储桶上创建新的副本版本时 |
| cloud-object-storage.object-replication.update | 目标存储区 | 当 COS 在目标存储桶的现有副本上复制元数据更新时 |
| cloud-object-storage.object-replication.delete | 目标存储区 | 当 COS 复制目标存储桶中的删除标记时 |
对于 cloud-object-storage.bucket-replication.create 事件,以下字段提供额外的信息:
| 字段 | 描述 |
|---|---|
requestData.replication.num_sync_remote_buckets |
在存储区复制规则中指定的目标存储区数。 |
requestData.replication.failed_remote_sync |
复制检查失败的存储区的 CRN。 |
当复制处于活动状态时,对对象执行的操作可能会生成以下额外信息:
| 字段 | 描述 |
|---|---|
requestData.replication.replication_throttled |
指示对象的复制是否由于调速机制而在源上延迟。 |
requestData.replication.destination_bucket_id |
目标存储区的 CRN。 |
requestData.replication.sync_type |
同步操作的类型。 - content 表示已将对象数据_和_任何元数据写入目标。- tag 表示已复制对象标记。- retention 表示已复制对象锁保留设置。- legal_hold 表示已复制对象锁合法保留设置。- delete 表示已将删除标记写入目标。 |
responseData.replication.source_bucket_id |
源存储区的 CRN。 |
responseData.replication.result |
值可以是 success,failure (指示服务器错误),user (指示用户错误)。 |
responseData.replication.message |
HTTP 响应信息(如 OK )。 |
您可以从将对象写入源时开始跟踪该对象,直到在目标上写入该对象为止。 搜索与对象写相关联的请求标识,应显示三个事件:
- 原始
PUT。 - 来自源的同步请求。
- 目标上的
PUT请求。
这三个缺失值中的任何一个表示发生故障。
使用情况和会计
所有副本都是对象本身,并且 添加用法 与任何其他数据一样。 成功复制会导致计费 PUT,GET 和 HEAD 请求,但不会对复制过程中使用的任何带宽进行计费。
复制会生成更多指标,供 IBM Cloud Monitoring 使用:
ibm_cos_bucket_replication_sync_requests_issuedibm_cos_bucket_replication_sync_requests_received
交互
版本控制
必须进行版本控制才能启用复制。 在源存储区和目标存储区上 启用版本控制 并在源存储区上配置复制后,可能会迂到以下问题:
- 如果尝试在源存储区上禁用版本控制,那么 Object Storage 将返回错误。 必须先除去复制配置,然后才能在源存储区上禁用版本控制。
- 如果在目标存储区上禁用版本控制,那么复制将失败。
对象锁定
启用了复制功能的存储桶可以启用对象锁定。 当源对象在启用“对象锁定”(保留和/或法律保留)的情况下创建,或者对现有对象的“对象锁定”进行了更新时,相关设置将被复制到目标位置。
只有在目标存储桶上启用了“对象锁定”功能时,才能对“对象锁定”进行复制。 因此,如果源存储桶已启用“对象锁定”功能,建议您在目标存储桶上也启用该功能。
下表概述了当源存储桶和目标存储桶的对象锁配置不同时的情况:
| 源对象锁定 | 目标对象锁定 | 行为 |
|---|---|---|
| 已启用 | 已启用 | 源端的所有对象锁定状态都将复制到目标端。 如果源对象是在未启用对象锁的情况下创建的,则目标存储桶的默认保留策略可能会应用于该副本。 对象锁复制遵循所有 S3 对象锁限制。 例如,如果用户已在目标位置独立进行了更改,则该功能绝不会缩短_合规_模式下副本的保留期限。 |
| 已禁用 | 已启用 | 源对象不能具有“对象锁定”属性,因此“对象锁定”状态绝不会从源传播到目标。 如果目标存储桶已设置默认保留策略,则该策略将应用于新创建的副本。 |
| 已启用 | 已禁用 | 使用“对象锁定”创建的源对象将无法被复制。 COS 会 重试 这些失败的操作,并且在目标存储桶上启用对象锁后,这些操作可以被复制一次。 此外,在目标端启用“对象锁定”之前,对现有对象进行的任何“对象锁定”保留/法律保留更新也无法进行复制。 未启用“对象锁定”功能创建的源对象仍可进行复制。 |
Key Protect 加密
源对象将 使用源存储区的根密钥进行加密,副本将使用目标存储区的根密钥进行加密。
生命周期配置
如果在目标存储区上启用了 生命周期策略,那么生命周期操作将基于源对象的原始创建时间,而不是基于副本在目标存储区中变为可用的时间。
不可变对象存储器
在启用了 版本控制 的存储区上不可能使用保留策略,并且由于版本控制是复制的需求,因此无法在启用了不可变 Object Storage 的存储区中复制对象。
旧存储区防火墙
使用 旧防火墙来限制基于 IP 地址的访问 的存储区无法使用复制,因为复制对象的后台服务没有固定 IP 地址,并且无法通过防火墙。
建议改为 使用基于上下文的限制 来根据网络信息控制访问。
Cloud Functions 和 Code Engine
此时配置复制不会提供 Cloud Functions 的触发器 或 Code Engine 事件,但对象写入和删除将为源存储区和目标存储区创建 Object:Write 和 Object:Delete 通知。 这些事件使用 notifications.replication_type 字段进行注释,该字段指示事件是触发了同步,还是由同步触发。
复制现有对象
复制规则只能对 在 配置规则并将其应用于存储区之后写入的对象执行操作。 如果存储区中存在应复制的现有对象,那么需要使复制过程了解这些对象是否存在。 通过使用 PUT copy 操作将对象复制到自身,可以轻松完成此操作。
此过程将重置一些对象元数据,包括创建时间戳记。 这将影响生命周期策略以及使用创建或修改时间戳记 (例如内容交付网络) 的任何其他服务。 确保适当处理重置对象元数据可能引起的任何中断。
这一进程涉及:
- 创建存储区中应遵循复制规则的所有对象的列表,
- 对该列表进行迭代,对每个对象执行
PUT copy操作,其中源与请求的目标相同。
此示例将仅复制由 PUT copy 请求创建的对象的新版本。 为了复制对象的所有版本,还需要复制每个单独的版本。
以下示例使用 Python编写,但可以在任何编程语言或上下文中应用该算法。
import os
import sys
import ibm_boto3
from ibm_botocore.config import Config
# Create client connection
cos = ibm_boto3.client("s3",
ibm_api_key_id=os.environ.get('IBMCLOUD_API_KEY'),
ibm_service_instance_id=os.environ['SERVICE_INSTANCE_ID'],
config=Config(signature_version="oauth"),
endpoint_url=os.environ['US_GEO']
)
# Define the bucket with existing objects for replication
bucket = os.environ['BUCKET']
def copy_in_place(BUCKET_NAME):
print("Priming existing objects in " + bucket + " for replication...")
paginator = cos.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket=bucket)
for page in pages:
for obj in page['Contents']:
key = obj['Key']
print(" * Copying " + key + " in place...")
try:
headers = cos.head_object(
Bucket=bucket,
Key=key
)
md = headers["Metadata"]
cos.copy_object(
CopySource={
'Bucket': bucket,
'Key': key
},
Bucket=bucket,
Key=key,
TaggingDirective='COPY',
MetadataDirective='REPLACE',
Metadata=md
)
print(" Success!")
except Exception as e:
print(" Unable to copy object: {0}".format(e))
print("Existing objects in " + bucket + " are now subject to replication rules.")
copy_in_place(bucket)
REST API 示例
使用 cURL 显示了以下示例以方便使用。 环境变量用于表示特定于用户的元素,例如 $BUCKET,$TOKEN 和 $REGION。 请注意,$REGION 还将包含任何网络类型规范,因此使用专用网络向 us-south 中的存储区发送请求将需要将变量设置为 private.us-south。
在存储区上启用复制
复制配置在请求主体中以 XML 形式提供。 新请求将覆盖存储区上存在的任何现有复制规则。
复制配置必须至少包含一个规则,并且最多可以包含 1,000 个规则。 每个规则通过过滤源存储区中的对象来标识要复制的对象子集。 要选择要复制的其他对象子集,请为每个子集添加规则。
要指定源存储区中要应用复制规则的对象的子集,请添加 Filter 元素作为 Rule 元素的子代。 您可以根据对象键前缀和/或一个或多个对象标记来过滤对象。 在配置中添加 Filter 元素时,还必须添加以下元素: DeleteMarkerReplication,Status 和 Priority。
可选标头
| 头 | 类型 | 描述 |
|---|---|---|
Content-MD5 |
字符串 | base64 对有效载荷进行了 128 位 MD5 哈希编码,该哈希值用作完整性校验,以确保有效载荷在传输过程中未被篡改。 |
x-amz-checksum-crc32 |
字符串 | 该标头是对象的 Base64 编码、32 位 CRC32 校验和。 |
x-amz-checksum-crc32c |
字符串 | 该标头是对象的 Base64 编码、32 位 CRC32C 校验和。 |
x-amz-checksum-crc64nvme |
字符串 | 该标头是对象的 Base64 编码、64 位 CRC64NVME 校验和。 CRC64NVME 校验和始终是全对象校验和。 |
x-amz-checksum-sha1 |
字符串 | 该标头是对象的 Base64 编码、160 位 SHA1 摘要。 |
x-amz-checksum-sha256 |
字符串 | 该标头是对象的 Base64 编码、256 位 SHA256 摘要。 |
需要 Content-MD5 标头或 checksum 标头(包括 x-amz-checksum-crc32, x-amz-checksum-crc32c, x-amz-checksum-crc64nvme, x-amz-checksum-sha1 或 x-amz-checksum-sha256 )作为有效载荷的完整性检查。 请求主体必须包含具有以下模式的 XML 块:
| 元素 | 类型 | 子代 | 祖代 | 约束 |
|---|---|---|---|---|
ReplicationConfiguration |
容器 | Rule |
无 | 限制为 1。 |
Rule |
容器 | ID, Status, Filter, DeleteMarkerReplication, Destination, Priority |
ReplicationConfiguration |
限制为 1000。 |
ID |
字符串 | 无 | Rule |
必须包含(a-z,A-Z0-9 )以及以下符号:! _ . * ' ( ) - |
Destination |
容器 | Bucket |
Rule |
限制为 1。 |
Bucket |
字符串 | 无 | Destination |
目标存储区的 CRN。 |
Priority |
Integer | 无 | Rule |
优先级与每个规则相关联。 可能存在多个规则可能适用于上载的对象的情况。 在这些情况下,对象存储器将在复制该对象时应用具有较高优先级的适用规则。 因此,只能将单个复制规则应用于任何对象,而不管复制策略中有多少规则可能与该对象匹配。 请注意,数字越大,优先级越高。 |
Status |
字符串 | 无 | Rule |
指定该规则是否已启用。 有效值为 Enabled 或 Disabled。 |
DeleteMarkerReplication |
容器 | Status |
Rule |
限制为 1。 |
Status |
字符串 | 无 | DeleteMarkerReplication |
指定对象存储器是否复制删除标记。 有效值为 Enabled 或 Disabled。 |
Filter |
字符串 | Prefix, Tag, AND |
Rule |
用于标识复制规则所应用于的对象子集的过滤器。 Filter 必须正好指定一个 Prefix,Tag 或 And 子元素。 |
Prefix |
字符串 | 无 | Filter |
对象键名称前缀,用于标识应用规则的对象子集。 |
Tag |
字符串 | 无 | Filter |
用于指定标记键和值的容器。 此规则仅适用于在其标记集中具有该标记的对象。 |
And |
字符串 | 无 | Filter |
用于指定规则过滤器的容器。 过滤器确定应用规则的对象子集。 仅当指定了多个过滤器时,此元素才是必需的。 |
Key |
字符串 | 无 | Tag |
标记键。 |
Value |
字符串 | 无 | Tag |
标记值。 |
此示例将复制任何新对象,但不会复制删除标记。
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN' \
-H 'Content-MD5: exuBoz2kFBykNwqu64JZuA==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Rule>
<ID>SimpleReplication</ID>
<Priority>1</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Disabled</Status>
</DeleteMarkerReplication>
<Filter/>
<Destination>
<Bucket>$DESTINATION_CRN</Bucket>
</Destination>
</Rule>
</ReplicationConfiguration>'
此示例将具有以 project_a/ 开头的键 (名称) 的任何对象复制到以 $DESTINATION_CRN_A 标识的存储区,具有以 project_b/ 开头的键 (名称) 的任何对象复制到以 $DESTINATION_CRN_B 标识的存储区,具有具有键 Client 和值 ACME 的对象标记的任何对象复制到以
$DESTINATION_CRN_C 标识的第三个存储区,并且将在所有情况下复制删除标记。
假定将以下四个对象添加到源存储区。 它们将复制到目标存储区,如下所述:
project_a/foo.mp4project_a/bar.mp4project_b/baz.pdfproject_b/acme.pdf。此第四个对象还具有键为Client且值为ACME的对象标记。
由于以下规则,对象 1 和 2 将复制到 $DESTINATION_CRN_A。 对象 3 将复制到 $DESTINATION_CRN_B。 对象 4 将仅复制到 $DESTINATION_CRN_C,因为标识为 AcmeCorp 的规则具有比标识为 ProjectB 的规则更高的优先级值,并且当它满足这两个规则的需求时,将仅受前者的约束。
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN' \
-H 'Content-MD5: exuBoz2kFBykNwqu64JZuA==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Rule>
<ID>ProjectA</ID>
<Priority>10</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Enabled</Status>
</DeleteMarkerReplication>
<Filter>
<Prefix>project_a/</prefix>
</Filter>
<Destination>
<Bucket>$DESTINATION_CRN_A</Bucket>
</Destination>
</Rule>
<Rule>
<ID>ProjectB</ID>
<Priority>5</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Enabled</Status>
</DeleteMarkerReplication>
<Filter>
<Prefix>project_b/</prefix>
</Filter>
<Destination>
<Bucket>$DESTINATION_CRN_B</Bucket>
</Destination>
</Rule>
<Rule>
<ID>AcmeCorp</ID>
<Priority>20</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Enabled</Status>
</DeleteMarkerReplication>
<Filter>
<Tag>
<Key>Client</Key>
<Value>ACME</Value>
</Tag>
</Filter>
<Destination>
<Bucket>$DESTINATION_CRN_C</Bucket>
</Destination>
</Rule>
</ReplicationConfiguration>'
成功的请求返回 200 响应。
查看存储区的复制配置
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN'
这将返回具有相应模式的 XML 响应主体:
<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Rule>
<ID>SimpleReplication</ID>
<Status>ENABLED</Status>
<DeleteMarkerReplication>
<Status>DISABLED</Status>
</DeleteMarkerReplication>
<Destination>
<Bucket>crn:v1:bluemix:public:cloud-object-storage:global:a/9978e07eXXXXXXXX66c89c428028654:ef1c725e-XXXX-4967-bcc1-734c03a2b846:bucket:replication-destination</Bucket>
</Destination>
<Priority>1</Priority>
<Filter/>
</Rule>
</ReplicationConfiguration>
删除存储桶的复制配置
curl -X "DELETE" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN'
成功的请求返回 204 响应。
列出某个存储桶的复制失败情况
使用 curl
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?ibm-replication-failures" \
-H 'Authorization: bearer $TOKEN'
可选查询参数
| 名称 | 类型 | 描述 |
|---|---|---|
| 编码类型 | 字符串 | 如果对象名称中使用了 XML 不支持的 Unicode 字符,可将此参数设置为 url,以便对响应进行正确编码。 |
| max-keys | 字符串 | 限制响应中显示的失败次数。 缺省值和最大值均为 1,000。 |
| 首次同步尝试时间 | 字符串 | 指定列表应从哪个时间戳开始显示,按时间倒序排列。 该时间对应于复制最初被触发时(
|
| 延续标记 | 字符串 | 指定列表应从哪个故障开始显示,按时间倒序排列。 如果上次列表请求返回的条目之后还有更多条目,则此功能用于分页。 |
示例响应
<ListReplicationFailureResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>example</Name>
<FirstSyncAttemptedBefore>2025-12-15T00:00:00.000Z</FirstSyncAttemptedBefore>
<MaxKeys>10</MaxKeys>
<IsTruncated>false</IsTruncated>
<EncodingType>false</EncodingType>
<KeyCount>2</KeyCount>
<Contents>
<Key>test-obj+*1765434016787</Key>
<VersionId>00000000-0000-0000-0000-019b0c114413</VersionId>
<SyncType>Content</SyncType>
<FirstSyncAttempted>2025-12-11T06:20:16.787Z</FirstSyncAttempted>
<LastSyncAttempted>2025-12-11T06:20:16.787Z</LastSyncAttempted>
<SyncFailureCause>Versioning disabled on destination bucket</SyncFailureCause>
</Contents>
<Contents>
<Key>test-obj+*1765434016786</Key>
<VersionId>00000000-0000-0000-0000-019b0c114412</VersionId>
<SyncType>Content</SyncType>
<FirstSyncAttempted>2025-12-11T06:20:16.786Z</FirstSyncAttempted>
<LastSyncAttempted>2025-12-11T06:20:16.786Z</LastSyncAttempted>
<SyncFailureCause>Replication operation not authorized on target bucket</SyncFailureCause>
</Contents>
</ListReplicationFailureResult>
响应元素
| 名称 | 类型 | 描述 |
|---|---|---|
ListReplicationFailureResult |
容器 | 根级标签 |
Name |
字符串 | 正在列出的存储桶的名称。 |
FirstSyncAttemptedBefore |
字符串 | ISO-8601 请求的日期-时间戳 ?first-sync-attempted-before |
MaxKeys |
编号 | 该房源收到的钥匙申请数量上限。 |
IsTruncated |
布尔值 | 当前列表是否被截断(即在该列表返回的最后一个元素之后还有更多失败记录)。 如果 true,则始终提供 NextContinuationToken。 |
EncodingType |
字符串 | 该商品页面上要求的编码类型。 |
KeyCount |
编号 | 此列表中返回的故障元件数量。 |
ContinuationToken |
字符串 | 为该列表指定的续接标记。 |
NextContinuationToken |
字符串 | 如果当前列表被截断,则用于分页的下一个续页标记。 |
安排对存储桶中过期的复制失败进行重试
此操作将安排对所有复制失败进行重试,包括那些发生超过 30 天、已不再符合系统自动重试条件的“过期”失败。 长期复制失败将在24小时周期内进行处理。 发出此请求后,系统将在下一个格林尼治标准时间午夜开始的周期内,对过期的失败请求安排重试。 例如,如果请求的请求时间为 2026-01-01T01:00:00Z,那么这些故障最早会在 2026-01-02T00:00:00Z 时被处理。 请求成功时,该时间戳也会包含在响应头 x-ibm-replication-reattempt-scheduled-time 中。 在格林尼治标准时间(GMT)下,同一天内收到的多个请求(即导致计划时间相同的请求)是幂等的。
每次过期的失败操作都将以“尽力而为”的方式重新尝试一次——这些操作将会被执行,但不保证其执行时间。
使用 curl
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?ibm-replication-reattempt" \
-H 'Authorization: bearer $TOKEN'
示例响应
HTTP/1.1 204 No Content
Connection: close
...
x-ibm-replication-reattempt-scheduled-time: Fri, 12 Dec 2025 00:00:00 GMT
SDK 示例
以下示例使用 IBM COS SDK for Python 和 Node.js,尽管对象版本控制的实现应该与允许设置定制端点的任何 S3-compatible 库或工具完全兼容。 使用第三方工具需要 HMAC 凭证来计算 AWS V4 签名。 有关 HMAC 凭证的更多信息,请参阅 文档。
Python
可以使用 低级客户机 语法来启用使用 IBM COS SDK for Python 的版本控制。
使用客户机:
#!/usr/bin/env python3
import ibm_boto3
from ibm_botocore.config import Config
from ibm_botocore.exceptions import ClientError
# Define constants
API_KEY = os.environ.get('IBMCLOUD_API_KEY')
SERVICE_INSTANCE = os.environ.get('SERVICE_INSTANCE_ID')
ENDPOINT = os.environ.get('ENDPOINT')
BUCKET = "my-replication-bucket" # The bucket that will enable replication.
# Create resource client with configuration info pulled from environment variables.
cosClient = ibm_boto3.client("s3",
ibm_api_key_id=API_KEY,
ibm_service_instance_id=SERVICE_INSTANCE,
config=Config(signature_version="oauth"),
endpoint_url=ENDPOINT
)
response = cosClient.put_bucket_versioning(
Bucket=BUCKET,
ReplicationConfiguration={
'Rules': [
{
'ID': 'string',
'Priority': 123,
'Filter': {
'Prefix': 'string',
'Tag': {
'Key': 'string',
'Value': 'string'
},
'And': {
'Prefix': 'string',
'Tags': [
{
'Key': 'string',
'Value': 'string'
},
]
}
},
'Status': 'Enabled'|'Disabled',
'Destination': {
'Bucket': 'string',
},
'DeleteMarkerReplication': {
'Status': 'Enabled'|'Disabled'
}
},
]
}
)
使用同一客户机列出对象的版本:
resp = cosClient.list_object_versions(Prefix='some-prefix', Bucket=BUCKET)
请注意,Python API 非常灵活,并且有许多不同的方法来完成同一任务。
Node.js
使用 IBM COS SDK for Node.js 启用版本控制:
const IBM = require('ibm-cos-sdk');
var config = {
endpoint: '<endpoint>',
apiKeyId: '<api-key>',
serviceInstanceId: '<resource-instance-id>',
};
var cos = new IBM.S3(config);
var params = {
Bucket: 'STRING_VALUE', /* required */
ReplicationConfiguration: { /* required */
Role: 'STRING_VALUE', /* required */
Rules: [ /* required */
{
Destination: { /* required */
Bucket: 'STRING_VALUE', /* required */
},
Status: Enabled | Disabled, /* required */
Filter: {
And: {
Prefix: 'STRING_VALUE',
Tags: [
{
Key: 'STRING_VALUE', /* required */
Value: 'STRING_VALUE' /* required */
},
/* more items */
]
},
Prefix: 'STRING_VALUE',
Tag: {
Key: 'STRING_VALUE', /* required */
Value: 'STRING_VALUE' /* required */
}
},
ID: 'STRING_VALUE',
Prefix: 'STRING_VALUE',
Priority: 'NUMBER_VALUE',
}
}
]
},
ContentMD5: 'STRING_VALUE',
};
cos.putBucketReplication(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});