TOS 支持跨区域复制,您可以将一个地域的对象复制到不同地域的存储桶中。开启跨区域复制规则后,当您在源存储桶中上传新文件时,TOS 会自动将文件同步至目的桶内。该功能用于满足异地容灾和数据复制的需求。
StorageClassType
和 StorageClassInheritDirectiveType
时,以 StorageClassType
的配置为准。StorageClassInheritDirectiveType
时,该配置值为 Storage_Class_ID_Source_Object
时与源对象一致, 该配置项值为 Storage_Class_ID_Destination_Bucket
时与目标桶一致。StorageClassType
和 StorageClassInheritDirectiveType
均未设置时,使用默认策略即与目标桶的存储类型保持一致。以下代码用于设置桶 bucket-test
的跨区域复制规则。
import os import tos from tos import StatusType, StorageClassInheritDirectiveType, StorageClassType from tos.models2 import ReplicationRule, Destination # 从环境变量获取 AK 和 SK 信息。 ak = os.getenv('TOS_ACCESS_KEY') sk = os.getenv('TOS_SECRET_KEY') # your endpoint 和 your region 填写Bucket 所在区域对应的Endpoint。# 以华北2(北京)为例,your endpoint 填写 tos-cn-beijing.volces.com,your region 填写 cn-beijing。 endpoint = "your endpoint" region = "your region" dest_region = "your crr dest region" bucket_name = "bucket-test" dest_bucket_name = "bucket-crr" try: # 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现 client = tos.TosClientV2(ak, sk, endpoint, region) # 设置跨区域公共规则 rule = ReplicationRule( # 规则ID id='1', # 指定是否开启跨区域复制规则 status=StatusType.Status_Enable, # 指定数据要复制到的目标 destination=Destination( # 指定数据要复制到的目标Bucket bucket=dest_bucket_name, # 指定目标Bucket所在的Region location=dest_region), historical_object_replication=StatusType.Status_Enable ) # 指定跨区域复制匹配对象的前缀, 只有匹配该前缀的对象才会被复制到目标bucket # prefix_set = ['prefix1', 'prefix2'] # 设置跨区域复制规则。 # replica_config = ReplicationRule( # # 规则ID # id='1', # # 指定开启Status_Enable或关闭Disabled跨区域复制规则 # status=StatusType.Status_Enable, # # 指定数据要复制到的目标 # destination=Destination( # # 指定数据要复制到的目标Bucket # bucket=dest_bucket_name, # # 指定目标Bucket所在的Region # location=dest_region, # # 指定存储类型 # storage_class=StorageClassType.Storage_Class_Ia, # # 指定复制对象的存储类型, 继承元对象Storage_Class_ID_Source_Object、继承目标桶 Storage_Class_ID_Destination_Bucket # storage_class_inherit_directive=StorageClassInheritDirectiveType.Storage_Class_ID_Source_Object # ), # # 指定匹配规则的对象前缀 # prefix_set=prefix_set, # # 指定是否开启历史对象的复制 # historical_object_replication=StatusType.Status_Enable, # ) # 设置跨区域复制规则 # 配置跨区域复制规则时您必须在访问配置中创建相应的角色,并授权TOS资源的访问权限 # 其中role_name为上述创建的角色名称 client.put_bucket_replication(bucket_name, 'your role', [rule]) except tos.exceptions.TosClientError as e: # 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常 print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause)) except tos.exceptions.TosServerError as e: # 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息 print('fail with server error, code: {}'.format(e.code)) # request id 可定位具体问题,强烈建议日志中保存 print('error with request id: {}'.format(e.request_id)) print('error with message: {}'.format(e.message)) print('error with http code: {}'.format(e.status_code)) print('error with ec: {}'.format(e.ec)) print('error with request url: {}'.format(e.request_url)) except Exception as e: print('fail with unknown error: {}'.format(e))
注意
要获取桶的跨区域复制规则,默认您必须为桶所有者。
以下代码用于获取桶 bucket-test
的跨区域复制规则。
import os import tos # 从环境变量获取 AK 和 SK 信息。 ak = os.getenv('TOS_ACCESS_KEY') sk = os.getenv('TOS_SECRET_KEY') # your endpoint 和 your region 填写Bucket 所在区域对应的Endpoint。# 以华北2(北京)为例,your endpoint 填写 tos-cn-beijing.volces.com,your region 填写 cn-beijing。 endpoint = "your endpoint" region = "your region" bucket_name = "bucket-test" try: # 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现 client = tos.TosClientV2(ak, sk, endpoint, region) # 不指定 rule_id返回所有对象的跨区域复制规则 out = client.get_bucket_replication(bucket_name) # 通过指定rule_id='your rule id' 查询指定id的复制规则 # out = client.get_bucket_replication(bucket_name, rule_id='your rule id') # 输出当前桶配置的所有跨区域复制规则 for rule in out.rules: # 输出当前rule id跨区域复制规则配置信息 print('rule id', rule.id) print('prefix set', rule.prefix_set) print('status', rule.status) print('historical object replication', rule.historical_object_replication) print('location', rule.destination.location) print('targe bucket', rule.destination.bucket) print('storage_class', rule.destination.storage_class) print('storage class inherit directive', rule.destination.storage_class_inherit_directive) except tos.exceptions.TosClientError as e: # 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常 print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause)) except tos.exceptions.TosServerError as e: # 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息 print('fail with server error, code: {}'.format(e.code)) # request id 可定位具体问题,强烈建议日志中保存 print('error with request id: {}'.format(e.request_id)) print('error with message: {}'.format(e.message)) print('error with http code: {}'.format(e.status_code)) print('error with ec: {}'.format(e.ec)) print('error with request url: {}'.format(e.request_url)) except Exception as e: print('fail with unknown error: {}'.format(e))
注意
以下代码用于获取桶 bucket-test
的跨区域复制进度。
import os import tos # 从环境变量获取 AK 和 SK 信息。 ak = os.getenv('TOS_ACCESS_KEY') sk = os.getenv('TOS_SECRET_KEY') # your endpoint 和 your region 填写Bucket 所在区域对应的Endpoint。# 以华北2(北京)为例,your endpoint 填写 tos-cn-beijing.volces.com,your region 填写 cn-beijing。 endpoint = "your endpoint" region = "your region" bucket_name = "bucket-test" try: # 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现 client = tos.TosClientV2(ak, sk, endpoint, region) # 不指定 rule_id 返回所有对象的跨区域复制任务进度 out = client.get_bucket_replication(bucket_name) # 通过指定rule_id='your rule id' 查询指定id的跨区域复制进度 # out = client.get_bucket_replication(bucket_name, rule_id='your rule id') # 输出当前桶配置的所有跨区域复制进度 for rule in out.rules: # 输出当前rule id的跨区域复制进度 print('rule id', rule.id) print('new object progress', rule.progress.new_object) print('historical object progress', rule.progress.historical_object) except tos.exceptions.TosClientError as e: # 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常 print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause)) except tos.exceptions.TosServerError as e: # 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息 print('fail with server error, code: {}'.format(e.code)) # request id 可定位具体问题,强烈建议日志中保存 print('error with request id: {}'.format(e.request_id)) print('error with message: {}'.format(e.message)) print('error with http code: {}'.format(e.status_code)) print('error with ec: {}'.format(e.ec)) print('error with request url: {}'.format(e.request_url)) except Exception as e: print('fail with unknown error: {}'.format(e))
注意
删除桶的跨区域复制规则,默认您必须为桶所有者。
以下代码用于删除桶 bucket-test
的跨区域复制规则。
import os import tos # 从环境变量获取 AK 和 SK 信息。 ak = os.getenv('TOS_ACCESS_KEY') sk = os.getenv('TOS_SECRET_KEY') # your endpoint 和 your region 填写Bucket 所在区域对应的Endpoint。# 以华北2(北京)为例,your endpoint 填写 tos-cn-beijing.volces.com,your region 填写 cn-beijing。 endpoint = "your endpoint" region = "your region" bucket_name = "bucket-test" try: # 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现 client = tos.TosClientV2(ak, sk, endpoint, region) # 删除跨区域复制规则 client.delete_bucket_replication(bucket_name) except tos.exceptions.TosClientError as e: # 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常 print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause)) except tos.exceptions.TosServerError as e: # 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息 print('fail with server error, code: {}'.format(e.code)) # request id 可定位具体问题,强烈建议日志中保存 print('error with request id: {}'.format(e.request_id)) print('error with message: {}'.format(e.message)) print('error with http code: {}'.format(e.status_code)) print('error with ec: {}'.format(e.ec)) print('error with request url: {}'.format(e.request_url)) except Exception as e: print('fail with unknown error: {}'.format(e))
关于设置跨区域复制规则的更多介绍,请参见跨区域复制规则。