IBM Cloud Docs
跟踪复制事件

跟踪复制事件

复制允许您定义规则,以自动异步将对象从源存储区复制到 同一帐户 中的目标存储区。 此外,您可以将对象从一个存储区复制到 不同帐户 中的另一个存储区。

什么是复制?

复制将新创建的对象和对象更新从源存储区复制到目标存储区。

  • 仅将新对象或现有对象的新版本 (在将复制规则添加到存储区之后创建) 复制到目标存储区。 可以 通过将现有对象复制到它们自己 来复制这些对象,从而创建复制的新版本。
  • 源对象的元数据将应用于复制的对象。
  • 两个存储区之间的双向复制要求规则在两个存储区上都处于活动状态。
  • 过滤器 (由前缀和/或标记组成) 可用于将复制规则的作用域限定为仅应用于对象子集。 可以在单个策略中定义多个规则,并且这些规则可以指定不同的目标。 通过这种方式,可以将同一存储区中的不同对象复制到不同的目标。

为何使用复制?

  • 将数据副本保存在不同地理位置的存储区中。
  • 通过定义仅在允许的位置中存储副本的复制规则,满足数据主权合规性法规。
  • 使生产和测试数据保持同步,因为复制会保留对象元数据,例如上次修改时间,版本标识等。
  • 通过为目标存储区定义不同的存储类和/或生命周期规则,管理独立于源的复制对象的存储类和生命周期策略。 同样,您可以将副本存储在独立服务实例或甚至 IBM Cloud 帐户中的存储区中,还可以独立控制对副本的访问。

复制入门

要开始使用,必须满足以下一些先决条件:

  • 在源存储区上设置 WriterManager 平台角色,或者在分配了相应复制操作 (例如 cloud-object-storage.bucket.put_replication) 的情况下设置定制角色。
  • 您不需要具有对目标存储区的访问权,但需要具有足够的平台角色来创建允许源存储区写入目标存储区的 新 IAM 策略
  • 目标存储区不得启用旧存储区防火墙,但可以使用 基于上下文的限制
  • 无法复制已加密的对象 使用 SSE-C,尽管 受管加密(SSE-KMS),例如 Key Protect 与复制完全兼容。
  • 无法复制处于已归档状态的对象。
  • 如果源存储区和目标存储区位于不同的 IBM 帐户中,请确保在每个帐户中创建存储区。
  • 在源存储区和目标存储区上都启用 版本控制

由于版本控制是复制的要求,因此无法复制使用 不可变 Object Storage 策略 配置的存储区中的对象。

使用一个 IBM 帐户

要在同一 IBM 帐户中的存储区之间复制对象,请执行以下操作:

  1. 浏览到所选源存储区后,单击 配置 选项卡。
  2. 查找 存储区复制,然后单击 设置复制 按钮。
  3. 选择 复制源,然后单击 下一步
  4. 从下拉菜单中选择实例和存储区。 或者,将单选按钮切换为 并粘贴到目标存储区的 CRN 中。
  5. 单击 检查许可权 按钮。

现在,您需要授予源存储区 Writer 对目标存储区的许可权。 有多种方法可以执行此操作,但最简单的方法是使用 IBM Cloud Shell 和 IBM Cloud CLI。

  1. 在新窗口或选项卡中打开 IBM Cloud Shell。
  2. 复制对象存储控制台中显示的 IBM Cloud CLI 命令,并将其粘贴到新 shell 中。
  3. 返回到存储区配置窗口或选项卡,然后再次单击 检查许可权 按钮。

现在,您将创建复制规则。

  1. 确保规则状态单选按钮设置为 已启用
  2. 为规则提供名称和优先级,以及将限制受复制规则约束的对象的任何前缀或标记过滤器。
  3. 单击完成

使用不同的 IBM 帐户

要在不同 IBM 帐户中的存储区之间复制对象,请执行以下操作:

  1. 在目标 IBM 帐户上设置 IAM 策略。 有关创建 IAM 策略的信息,请参阅 哪些是 IAM 策略以及谁可以分配这些策略
  2. 在“存储区配置”页面上查找 CRN 格式的帐户标识和服务实例标识。
  3. 使用目标帐户的 IBM Cloud UI,单击 管理>访问权 (IAM)
  4. 单击左侧面板中的 认证
  5. 单击 创建 以创建新的 IAM 策略。
  6. 授予服务授权页面配置。 这是您在创建新的 IAM 策略后将在其中使用的页面。
  7. 选择 其他帐户 并提供源帐户的帐户标识。
  8. Cloud Object Storage 身份提供服务访问权。
  9. 在“访问范围”中,选择 特定资源
  10. 选择 源服务实例,然后输入源存储区的服务实例标识。
  11. 在“目标”下,选择 Cloud Object Storage 以进行源存储区访问。
  12. 对于“目标作用域”,选择 特定资源> * *Service Instance。
  13. 从下拉菜单中选择目标帐户的服务实例标识。
  14. 根据需要选择角色 对象写程序写程序

对象写程序 角色足以启用复制。

术语

源存储区: 为其配置复制策略的存储区。 它是复制对象的源。

目标存储区: 定义为源存储区复制策略中的目标的存储区。 它是复制对象的目标。 也称为“目标”存储区。

副本: 由于向源存储区发出请求而在目标存储区中创建的新对象。

复制了哪些内容?

通过 CopyObjectPutObjectCompleteMultipartUpload 创建的新对象将从源存储区复制到目标存储区。 复制的对象将从源对象继承以下元数据字段: EtagLast Modified TimeVersion IDuser-attributesTags

如果由复制策略配置,那么将复制删除标记。

对版本标记的更新将从源存储区复制到目标存储区。

未复制以下内容:

  • 由生命周期事件启动的操作
  • 直接写入归档的对象
  • 从归档层复原的对象
  • 通过 SSE-C 加密的对象
  • 对象 ACL
  • 对象-锁定状态

使用复制实现业务连续性和灾难恢复

在发生中断时,可以使用复制来提供服务的连续性:

  • 确保源存储区和目标存储区位于不同的位置。
  • 验证两个存储区之间是否同步了最新版本的对象。 Rclone ( rclone check 命令) 之类的工具可用于从命令行检查同步性。
  • 发生中断时,可以将应用程序的流量重定向到目标存储区。

一致性和数据完整性

虽然 IBM Cloud Object Storage 为所有数据 IO 操作提供强大的一致性,但存储区配置最终是一致的。 首次在存储区上启用复制规则后,配置可能需要一些时间才能在系统和新对象之间进行传播以开始复制。

IAM 操作

存在与复制关联的新 IAM 操作。

IAM 操作 角色
cloud-object-storage.bucket.get_replication 管理者、写入者和读取者
cloud-object-storage.bucket.put_replication 管理者和写入者
cloud-object-storage.bucket.delete_replication 管理者和写入者

Activity Tracker 事件

复制会生成其他事件。

  • cloud-object-storage.bucket-replication.create
  • cloud-object-storage.bucket-replication.read
  • cloud-object-storage.bucket-replication.delete
  • cloud-object-storage.object-replication.sync (在源中生成)
  • cloud-object-storage.object-replication.create (在目标上生成)

对于 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 同步指示已将对象数据 任何元数据写入目标,metadata 同步指示仅将元数据写入目标,delete 同步指示仅将删除标记写入目标。
responseData.replication.source_bucket_id 源存储区的 CRN。
responseData.replication.result 值可以是 successfailure (指示服务器错误),user (指示用户错误)。
responseData.replication.message HTTP 响应消息 (例如 OK)。

您可以从将对象写入源时开始跟踪该对象,直到在目标上写入该对象为止。 搜索与对象写相关联的请求标识,应显示三个事件:

  • 原始 PUT
  • 来自源的同步请求。
  • 目标上的 PUT 请求。

这三个缺失值中的任何一个表示发生故障。

使用情况和会计

所有副本都是对象本身,并且 添加用法 与任何其他数据一样。 成功复制会导致计费 PUTGETHEAD 请求,但不会对复制过程中使用的任何带宽进行计费。

复制会生成用于 IBM Cloud Monitoring的其他度量值:

  • ibm_cos_bucket_replication_sync_requests_issued
  • ibm_cos_bucket_replication_sync_requests_received

交互

版本控制

必须进行版本控制才能启用复制。 在源存储区和目标存储区上 启用版本控制 并在源存储区上配置复制后,可能会迂到以下问题:

  • 如果尝试在源存储区上禁用版本控制,那么 Object Storage 将返回错误。 必须先除去复制配置,然后才能在源存储区上禁用版本控制。
  • 如果在目标存储区上禁用版本控制,那么复制将失败。

Key Protect 加密

源对象将 使用源存储区的根密钥进行加密,副本将使用目标存储区的根密钥进行加密。

生命周期配置

如果在目标存储区上启用了 生命周期策略,那么生命周期操作将基于源对象的原始创建时间,而不是基于副本在目标存储区中变为可用的时间。

不可变对象存储器

在启用了 版本控制 的存储区上不可能使用保留策略,并且由于版本控制是复制的需求,因此无法在启用了不可变 Object Storage 的存储区中复制对象。

旧存储区防火墙

使用 旧防火墙来限制基于 IP 地址的访问 的存储区无法使用复制,因为复制对象的后台服务没有固定 IP 地址,并且无法通过防火墙。

建议改为 使用基于上下文的限制 来根据网络信息控制访问。

Cloud Functions 和 Code Engine

此时配置复制不会提供 Cloud Functions 的触发器 或 Code Engine 事件,但对象写入和删除将为源存储区和目标存储区创建 Object:WriteObject:Delete 通知。 这些事件使用 notifications.replication_type 字段进行注释,该字段指示事件是触发了同步,还是由同步触发。

复制现有对象

复制规则只能对 配置规则并将其应用于存储区之后写入的对象执行操作。 如果存储区中存在应复制的现有对象,那么需要使复制过程了解这些对象是否存在。 通过使用 PUT copy 操作将对象复制到自身,可以轻松完成此操作。

此过程将重置一些对象元数据,包括创建时间戳记。 这将影响生命周期策略以及使用创建或修改时间戳记 (例如内容交付网络) 的任何其他服务。 确保适当处理重置对象元数据可能引起的任何中断。

这一进程涉及:

  1. 创建存储区中应遵循复制规则的所有对象的列表,
  2. 对该列表进行迭代,对每个对象执行 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 元素时,还必须添加以下元素: DeleteMarkerReplicationStatusPriority

类型 描述
Content-MD5 字符串 必需:有效内容的 Base64 编码的 128 位 MD5 散列,用作完整性检查,可确保有效内容在传输中未变更。

请求主体必须包含具有以下模式的 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 整数 Rule 优先级与每个规则相关联。 可能存在多个规则可能适用于上载的对象的情况。 在这些情况下,对象存储器将在复制该对象时应用具有较高优先级的适用规则。 因此,只能将单个复制规则应用于任何对象,而不管复制策略中有多少规则可能与该对象匹配。 请注意,数字越大,优先级越高。
Status 字符串 Rule 指定是否启用规则。 有效值为 EnabledDisabled
DeleteMarkerReplication 容器 Status Rule 限制为 1。
Status 字符串 DeleteMarkerReplication 指定对象存储器是否复制删除标记。 有效值为 EnabledDisabled
Filter 字符串 Prefix, Tag, AND Rule 用于标识复制规则所应用于的对象子集的过滤器。 Filter 必须正好指定一个 PrefixTagAnd 子元素。
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 标识的第三个存储区,并且将在所有情况下复制删除标记。

假定将以下四个对象添加到源存储区。 它们将复制到目标存储区,如下所述:

  1. project_a/foo.mp4
  2. project_a/bar.mp4
  3. project_b/baz.pdf
  4. project_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 响应。

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