全部產品
Search
文件中心

Object Storage Service:Python資料複製

更新時間:Nov 06, 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')

相關文檔