全部產品
Search
文件中心

Object Storage Service:同帳號跨地區複製

更新時間:Apr 08, 2024

同帳號跨地區複製是指將某個帳號某個地區下源儲存空間(Bucket)的檔案(Object)的建立、更新和刪除等操作自動、非同步(近即時)地複製到相同帳號下另一個地區下的目標Bucket。本文介紹如何進行同帳號跨地區複製。

前提條件

  • 已在某個帳號下的某個地區建立Bucket A作為跨地區複製的源Bucket,並記錄帳號的UID、Bucket A的名稱及所在地區。

  • 已在相同帳號下的另一個地區建立Bucket B作為跨地區複製的目標Bucket,並記錄Bucket B的名稱及所在地區。

角色類型

執行同帳號跨地區複製時,需要指定用於源Bucket與目標Bucket之間執行複製操作的角色。您可以選擇以下任意角色完成同帳號跨地區複製任務。

重要

您可以選擇通過RAM使用者建立角色,RAM使用者必須擁有以下許可權:ram:CreateRoleram:GetRoleram:ListPoliciesForRoleram:AttachPolicyToRole。但是考慮到授予RAM使用者ram:CreateRoleram:GetRole等角色相關的許可權風險較大,您可以通過RAM使用者關聯的阿里雲帳號建立RAM角色並為相應的RAM角色完成授權。授權完成後,RAM使用者可以直接複用阿里雲帳號建立的RAM角色。

(推薦)建立角色

建立同帳號跨地區複製規則時,支援選擇建立角色來完成複製任務。選擇建立角色後,後台將自動建立格式為oss-replication-{uuid} 的角色,並根據是否選擇複製KMS加密對象授予不同權限原則。

  • 選擇複製KMS加密對象

    建立角色後,您需要按照頁面指引完成角色授權操作。授權完成後,該角色擁有源Bucket同步到目標Bucket精準權限原則以及AliyunKMSFulleAccess(管理Key Management Service的許可權)。

  • 選擇不複製KMS加密對象

    建立角色後,您需要按照頁面指引完成角色授權操作。授權完成後,該角色擁有源Bucket同步到目標Bucket精準權限原則。

AliyunOSSRole

建立同帳號跨地區複製規則時,支援選擇AliyunOSSRole角色來完成複製任務。選擇該角色後,後台會根據是否選擇複製KMS加密對象授予不同權限原則。

  • 選擇複製KMS加密對象

    選擇AliyunOSSRole角色後,後台將自動為AliyunOSSRole角色授予以下權限原則:AliyunOSSFullAccess(管理Object Storage Service的許可權)以及AliyunKMSFullAccess(管理Key Management Service的許可權)。

    警告

    該角色擁有當前帳號下所有Bucket以及KMS的所有操作許可權,許可權範圍較大,請謹慎使用。

  • 選擇不複製KMS加密對象

    選擇AliyunOSSRole角色後,後台將自動為AliyunOSSRole角色授予AliyunOSSFullAccess(管理Object Storage Service的許可權)。

    警告

    該角色擁有當前帳號下所有Bucket所有操作許可權,許可權範圍較大,請謹慎使用。

自訂角色

建立同帳號跨地區複製規則時,支援使用自訂角色來完成複製任務。您需要通過RAM控制台建立自訂角色,並為角色賦予相關許可權。

  1. 建立普通服務角色。

    建立角色過程中,需選擇可信實體類型為阿里雲服務,角色類型選擇普通服務角色,受信服務選擇Object Storage Service。具體步驟,請參見建立普通服務角色

  2. 為角色授權。

    您可以選擇以下任意方式為角色授權。

    為RAM角色授予系統策略

    警告

    您可以選擇為RAM角色授予系統策略AliyunOSSFullAccessAliyunOSSFullAccess預設擁有當前帳號下所有Bucket的所有操作許可權,請謹慎使用。

    如果您希望將KMS加密的Object複製到目標Bucket,您還需要為角色授予AliyunKMSFullAccess系統策略。

    具體步驟,請參見為RAM角色授權

    為RAM角色授予自訂策略

    通過RAM Policy為RAM角色授予源Bucket(src-bucket)和目標Bucket(dest-bucket)複製所需的最小許可權。

    說明

    實際使用時,請相應替換源Bucket和目標Bucket名稱。

    {
       "Version":"1",
       "Statement":[
          {
             "Effect":"Allow",
             "Action":[
                "oss:ReplicateList",
              	"oss:ReplicateGet"
             ],
             "Resource":[
              	"acs:oss:*:*:src-bucket",
                "acs:oss:*:*:src-bucket/*"
             ]
          },
          {
             "Effect":"Allow",
             "Action":[
              	"oss:ReplicateList",
                "oss:ReplicateGet",
                "oss:ReplicatePut",
                "oss:ReplicateDelete"
             ],
             "Resource":[
              	"acs:oss:*:*:dest-bucket",
                "acs:oss:*:*:dest-bucket/*"
             ]
          }
       ]
    }

    具體步驟,請參見為RAM角色授權

    說明

    如果您希望將KMS加密的Object複製到目標Bucket,您還需要為角色授予AliyunKMSFullAccess系統策略。

操作步驟

使用OSS控制台

  1. 登入OSS管理主控台

  2. 單擊Bucket 列表,然後單擊源Bucket名稱。

  3. 在左側導覽列,選擇資料管理 > 跨區域復制

  4. 跨區域復制頁簽,單擊跨區域復制

  5. 跨區域復制對話方塊,按以下說明配置各項參數。

    地區

    參數

    說明

    設定目標Bucket

    源Bucket

    顯示源Bucket所在地區及名稱。

    目標Bucket

    選中在此帳號下選擇一個Bucket,然後下拉選擇目標Bucket所在地區以及目標Bucket名稱。

    設定複製策略

    數據複製對象

    選擇需要複製的來源資料。

    • 全部檔案進行同步:將該Bucket內所有的Object複製到目標儲存空間。

    • 指定檔案名稱首碼進行同步:將該Bucket內指定首碼的Object複製到目標Bucket。最多可以添加10個首碼。

    數據複製策略

    選擇資料複製的方式。

    • 增/改 同步:將該Bucket內Object新增和更新操作複製到目標Bucket。

    • 增/刪/改 同步:將該Bucket內Object的新增、更新、刪除操作複製到目標Bucket。

    如果某個Object是通過分區上傳的方式上傳至源Bucket,則每個分區的上傳操作都會複製至目標Bucket。最終,對所有分區執行CompleteMultipartUpload後產生的Object,也會被複製到目標Bucket。

    有關跨地區複製結合版本控制的複製行為說明,請參見資料複製結合版本控制

    複製歷史數據

    選擇是否複製跨地區複製規則生效前源Bucket中已有的歷史資料。

    • 複製:將歷史資料複製至目標Bucket。

      重要

      複製歷史資料時,從源Bucket複製的Object可能會覆蓋目標Bucket中同名的Object。為避免這部分檔案丟失,建議您對源Bucket和目標Bucket開啟版本控制。

    • 不複製:僅複製跨地區複製規則生效後上傳或更新的Object。

    KMS 加密目標對象複製

    選擇是否將KMS加密的Object複製到目標Bucket。

    • 複製:在源Object或者目標Bucket使用了KMS託管祕密金鑰加密方式(即SSE-KMS,指定CMK ID)的情況下,要將Object複製到目標Bucket。

      說明

      您可以通過HeadObjectGetBucketEncryption分別查詢源Object和目標Bucket的加密狀態。

    • 不複製:不複製KMS加密的Object到目標Bucket。

    使用的 KMS 密鑰

    為目標Object指定加密的KMS密鑰。

    您需要提前在KMS平台建立一個與目標Bucket相同地區的KMS密鑰。具體操作,請參見建立密鑰

    授權角色

    推薦選擇建立角色。下拉選擇建立角色後,您需要按照頁面指引完成角色授權操作。

    您還可以選擇AliyunOSSRole或者自訂角色。關於這三種類型角色的更多資訊,請參見角色類型

    設定複製加速

    加速類型

    加速類型僅支援傳輸加速。傳輸加速用於提升在中國內地與非中國內地之間跨地區複製時的傳輸速度。開啟傳輸加速功能,OSS還會額外收取傳輸加速費用。計費方式,請參見傳輸加速費用

    資料複製時間控制(RTC)

    說明

    僅支援華東1(杭州)、華東2(上海)、華北1(青島)、華北2(北京)、華北 3(張家口)、華南1(深圳)各地區之間的跨地區複製任務開啟RTC。

    僅支援美國(矽谷)、美國(維吉尼亞)地區之間的跨地區複製任務開啟RTC。

    開啟RTC後,OSS會在幾秒內複製您上傳到OSS的大多數Object,並在10分鐘內複製99.99%的Object。開啟RTC,將收取額外費用。更多資訊,請參見跨地區複製RTC費用

    關於RTC支援的地區以及功能介紹的更多資訊,請參見使用資料複製時間控制(RTC)

  6. 單擊確定,然後在彈出的對話方塊,單擊確認開啟

    • 當跨地區複製規則建立完成後,不允許對此規則進行編輯或刪除。

    • 複製任務會在跨地區複製規則配置完成的3~5分鐘後啟動。您可以在源Bucket的跨區域復制頁簽,查看複製進度。

    • 由於Bucket間的跨地區複製採用非同步(近即時)複製,資料複製到目標Bucket需要的時間取決於資料的大小,通常幾分鐘到幾小時不等。

使用阿里雲SDK

僅Java、Python以及Go SDK支援同帳號跨地區複製。

Java

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.AddBucketReplicationRequest;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 強烈建議不要把訪問憑證儲存到工程代碼裡,否則可能導致訪問憑證泄露,威脅您帳號下所有資源的安全。本程式碼範例以從環境變數中擷取訪問憑證為例。運行本程式碼範例之前,請先配置環境變數。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填寫源Bucket名稱。
        String bucketName = "src-bucket";
        // 指定資料要複製到的目標Bucket。目標Bucket與源Bucket必須屬於相同帳號。
        String targetBucketName = "dest-bucket";
        // 指定目標Bucket所在地區。目標Bucket與源Bucket必須處於不同地區。
        String targetBucketLocation = "oss-cn-shanghai";

        // 建立OSSClient執行個體。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            AddBucketReplicationRequest request = new AddBucketReplicationRequest(bucketName);
            request.setTargetBucketName(targetBucketName);
            request.setTargetBucketLocation(targetBucketLocation);
            // 預設複製歷史資料。此處設定為false,表示禁止複製歷史資料。
            request.setEnableHistoricalObjectReplication(false);
            // 指定授權OSS進行資料複製的角色名稱,且該角色必須已被授予源Bucket執行跨地區複製以及目標Bucket接收複製對象的許可權。
            request.setSyncRole("yourRole");
            // 指定OSS是否複製通過SSE-KMS加密建立的對象。
            //request.setSseKmsEncryptedObjectsStatus("Enabled");
            // 指定SSE-KMS密鑰ID。如果指定Status為Enabled,則必須指定該元素。
            //request.setReplicaKmsKeyID("3542abdd-5821-4fb5-a425-90adca***");
            //List prefixes = new ArrayList();
            //prefixes.add("image/");
            //prefixes.add("video");
            //prefixes.add("a");
            //prefixes.add("A");
            // 指定待覆制Object的首碼Prefix。指定Prefix後,只有匹配該Prefix的Object才會複製到目標Bucket。
            //request.setObjectPrefixList(prefixes);
            //List actions = new ArrayList();
            //actions.add(AddBucketReplicationRequest.ReplicationAction.ALL);
            // 指定可以被複製到目標Bucket的操作。預設值為ALL,表示源Bucket的所有操作都會複製到目標Bucket。
            //request.setReplicationActionList(actions);
            ossClient.addBucketReplication(request);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}        

Python

# -*- 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.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫源Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# 填寫源Bucket名稱,例如src-bucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'src-bucket')
replica_config = ReplicationRule(
    # 指定資料要複製到的目標Bucket。目標Bucket與源Bucket必須屬於不同帳號。
    target_bucket_name='dest-bucket',
    # 指定目標Bucket所在地區。目標Bucket與源Bucket必須處於不同地區。
    target_bucket_location='oss-cn-shanghai',
    # 指定授權OSS進行資料複製的角色名稱,且該角色必須已被授予源Bucket執行跨地區複製以及目標Bucket接收複製對象的許可權。
    sync_role_name='roleNameTest',
)

# 指定待覆制Object的首碼Prefix。指定Prefix後,只有匹配該Prefix的Object才會複製到目標Bucket。
# prefix_list = ['prefix1', 'prefix2']
# 設定資料複製規則。
# replica_config = ReplicationRule(
     # prefix_list=prefix_list,
     # 指定可以被複製到目標Bucket的操作。預設值為ALL,表示源Bucket的所有操作都會複製到目標Bucket。
     # action_list=[ReplicationRule.ALL],
     # 指定資料要複製到的目標Bucket。目標Bucket與源Bucket必須屬於不同帳號。
     # target_bucket_name='dest-bucket',
     # 指定目標Bucket所在地區。目標Bucket與源Bucket必須處於不同地區。
     # target_bucket_location='yourTargetBucketLocation',
     # 預設複製歷史資料。此處設定為False,表示禁止複製歷史資料。
     # is_enable_historical_object_replication=False,
     # 指定資料複製時使用的資料轉送鏈路。
     # target_transfer_type='oss_acc',    
  #)

# 開啟資料複製。
bucket.put_bucket_replication(replica_config)

Go

package main

import (
	"encoding/xml"
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"os"
)

func HandleError(err error) {
	fmt.Println("Error:", err)
	os.Exit(-1)
}

// 開啟資料複製。
func main() {
	// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 建立OSSClient執行個體。
	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 指定源Bucket名稱。
	srcbucketName := "yourSrcBucket"
	// 指定資料要複製到的目標Bucket。
	destBucketName := "yourDestBucket"
	// 指定待覆制Object的首碼prefix_1和prefix_2。指定Prefix後,只有匹配該Prefix的Object才會複製到目標Bucket。
	// 如果您需要將源Bucket中的所有Object複製到目標Bucket,則無需設定Prefix。
	prefix1 := "prefix_1"
	prefix2 := "prefix_2"
	// 指定SSE-KMS密鑰ID。如果指定Status為Enabled,則必須指定該元素。
	keyId := "c4d49f85-ee30-426b-a5ed-95e9xxxx"
	// 指定OSS是否複製通過SSE-KMS加密建立的對象。
	source := "Enabled"
	prefixSet := oss.ReplicationRulePrefix{Prefix: []*string{&prefix1, &prefix2}}
	// 在配置跨地區複製規則時,開啟資料複製時間控制(RTC)功能。
	enabled := "enabled"
	reqReplication := oss.PutBucketReplication{
		Rule: []oss.ReplicationRule{
			{
				PrefixSet: &prefixSet,
				//指定可以被複製到目標Bucket的操作。預設值為ALL,表示源Bucket的所有操作都會複製到目標Bucket。
				Action: "ALL",
				RTC:    &enabled,
				Destination: &oss.ReplicationRuleDestination{
					Bucket: destBucketName,
					// 指定目標Bucket所在地區。源Bucket與目標Bucket必須處於不同的地區。
					Location: "oss-cn-shanghai",
					// 指定資料複製時使用的資料轉送鏈路。此處設定為oss_acc,表示使用了傳輸加速鏈路。
					TransferType: "oss_acc",
				},
				// 預設複製歷史資料。此處設定為disabled,表示禁止複製歷史資料。
				HistoricalObjectReplication: "disabled",
				// 指定授權OSS進行資料複製的角色名稱,且該角色必須已被授予源Bucket執行跨地區複製以及目標Bucket接收複製對象的許可權。
				SyncRole:                "yourRole",
				EncryptionConfiguration: &keyId,
				SourceSelectionCriteria: &source,
			},
		},
	}

	xmlBody, err := xml.Marshal(reqReplication)
	if err != nil {
		HandleError(err)
	}
	err = client.PutBucketReplication(srcbucketName, string(xmlBody))

	if err != nil {
		HandleError(err)
	}

	fmt.Println("Put Bucket Replication Success!")
}

使用命令列工具ossutil

關於使用ossutil開啟跨地區複製的具體步驟,請參見replication(資料複製)

使用REST API

如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見PutBucketReplication

相關文檔