全部产品
Search
文档中心

对象存储 OSS:Python数据复制

更新时间:Nov 08, 2024

数据复制是以异步(近实时)方式将源Bucket中的文件(Object)以及对Object的创建、更新和删除等操作自动复制到目标Bucket。OSS支持跨区域复制(Cross-Region Replication)和同区域复制(Same-Region Replication)。

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见OSS地域和访问域名

  • 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证

  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见初始化

  • 要开启数据复制,您必须有oss:PutBucketReplication权限;要查看数据复制规则,您必须有oss:GetBucketReplication权限;要查看可复制的目标地域,您必须有oss:GetBucketReplicationLocation权限;要查看数据复制进度,您必须有oss:GetBucketReplicationProgress权限;要关闭数据复制,您必须有oss:DeleteBucketReplication权限。具体操作,请参见为RAM用户授权自定义的权限策略

开启数据复制

重要

开启数据复制前,请确保源存储空间与目标存储空间同时处于非版本化或已启用版本控制状态。

以下代码用于开启数据复制,将华东1(杭州)地域下的srcexamplebucket中的数据复制到相同或不同地域下的destexamplebucket。

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import ReplicationRule
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
region = "cn-hangzhou"

# examplebucket填写存储空间名称。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)

replica_config = ReplicationRule(
    # 指定数据要复制到的目标Bucket。
    target_bucket_name='destexamplebucket',
    # 指定目标Bucket所在地域。
    # 如果您希望开启跨区域复制,则源Bucket与目标Bucket必须处于不同的地域。如果您希望开启同地域复制,则源Bucket与目标Bucket必须处于相同的地域。
    target_bucket_location='yourTargetBucketLocation'
)

# 指定待复制Object的前缀Prefix。指定Prefix后,只有匹配该Prefix的Object才会复制到目标Bucket。
# prefix_list = ['prefix1', 'prefix2']
# 设置数据复制规则。
# replica_config = ReplicationRule(
     # prefix_list=prefix_list,
     # 将源bucket内object的新增、更新操作复制到目标bucket。
     # action_list=[ReplicationRule.PUT],
     # 指定数据要复制到的目标Bucket。
     # target_bucket_name='destexamplebucket1',
     # 指定目标Bucket所在地域。
     # target_bucket_location='yourTargetBucketLocation',
     # 默认复制历史数据。此处设置为False,表示禁止复制历史数据。
     # is_enable_historical_object_replication=False,
     # 指定数据复制时使用的数据传输链路。
     # target_transfer_type='oss_acc',
     # 授权OSS使用哪个角色来进行数据复制。如果指定使用SSE-KMS加密目标对象,则必须指定该元素。
     # sync_role_name='roleNameTest',
     # 复制通过SSE-KMS加密创建的对象。
     # sse_kms_encrypted_objects_status=ReplicationRule.ENABLED
     # 指定SSE-KMS密钥ID。如果指定复制通过SSE-KMS加密创建的对象,则必须指定该元素。
     # replica_kms_keyid='9468da86-3509-4f8d-a61e-6eab1eac****',
  #)

# 开启数据复制。
bucket.put_bucket_replication(replica_config)

查看数据复制规则

以下代码用于查看examplebucket的数据复制规则。

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import ReplicationRule

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
region = "cn-hangzhou"

# examplebucket填写存储空间名称。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)

# 查看数据复制规则。
result = bucket.get_bucket_replication()
# 打印返回的信息。
for rule in result.rule_list:
    print(rule.rule_id)
    print(rule.target_bucket_name)
    print(rule.target_bucket_location)

查看可复制的目标地域

以下代码用于查看examplebucket的数据可复制的目标地域列表。

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import ReplicationRule

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
region = "cn-hangzhou"

# examplebucket填写存储空间名称。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)

# 查看可复制的目标地域。
result = bucket.get_bucket_replication_location()
for location in result.location_list:
    print(location)

查看数据复制进度

数据复制进度分为历史数据复制进度和新写入数据复制进度。

  • 历史数据复制进度用百分比表示,仅对开启了历史数据复制的存储空间有效。

  • 新写入数据复制进度用新写入数据的时间点表示,代表这个时间点之前的数据已复制完成。

以下代码用于查看examplebucket中规则ID为test_replication_1的数据复制进度。

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import ReplicationRule

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
region = "cn-hangzhou"

# examplebucket填写存储空间名称。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)

# 查看数据复制进度。
# 填写复制规则ID,例如test_replication_1。
result = bucket.get_bucket_replication_progress('test_replication_1')
print(result.progress.rule_id)
# 是否开启了历史数据复制。
print(result.progress.is_enable_historical_object_replication)
# 历史数据复制进度。
print(result.progress.historical_object_progress)
# 实时数据复制进度。
print(result.progress.new_object_progress)            

关闭数据复制

通过删除存储空间的复制规则,您可以关闭源存储空间到目标存储空间的数据复制关系。

以下代码用于删除examplebucket中规则ID为test_replication_1的复制规则。

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import ReplicationRule

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
region = "cn-hangzhou"

# examplebucket填写存储空间名称。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)

# 关闭数据复制。关闭后,已复制到目标Bucket内的文件依然存在,但是不再将源Bucket内文件的所有改动复制到目标Bucket。
# 填写复制规则ID,例如test_replication_1。
result = bucket.delete_bucket_replication('test_replication_1')

相关文档