すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:同じアカウント内のCRR

最終更新日:Oct 16, 2024

同じアカウント内のクロスリージョンレプリケーション (CRR) を使用すると、同じAlibaba Cloudアカウント内のリージョン内のバケットから別のリージョン内の別のバケットへのObject Storage Service (OSS) オブジェクトの自動および非同期 (ほぼリアルタイム) レプリケーションが可能になります。 同じアカウント内のCRRは、オブジェクトの作成、上書き、削除などの操作をソースバケットから宛先バケットにレプリケートします。 このトピックでは、同じアカウント内でCRRを実行する方法について説明します。

前提条件

  • CRRタスクのソースバケットとして機能するバケットAは、Alibaba Cloudアカウント内のリージョンに作成されます。 Alibaba CloudアカウントのID、バケットAの名前、およびバケットAが配置されているリージョンが記録されます。

  • CRRタスクの宛先バケットとして機能するバケットBは、同じAlibaba Cloudアカウント内の別のリージョンに作成されます。 バケットBの名前とバケットBが配置されているリージョンが記録されます。

ロールタイプ

同じアカウント内でCRRを実行する場合、ソースバケットとターゲットバケット間でオブジェクトをレプリケートするために使用されるロールを指定する必要があります。 次のRAMロールのいずれかを選択して、同じアカウント内でCRRを実行できます。

重要

RAMユーザーを使用してRAMロールを作成できます。 RAMユーザーには、ram:CreateRoleram:GetRoleram:ListPoliciesForRole、およびram:AttachPolicyToRoleの権限が必要です。 ただし、RAMユーザーにram:CreateRoleram:GetRoleなどの権限を付与することは危険です。 RAMユーザーが関連付けられているAlibaba Cloudアカウントを使用して、RAMロールを作成し、RAMロールに必要な権限を付与できます。 これにより、RAMユーザーはAlibaba Cloudアカウントによって作成されたRAMロールを引き受けることができます。

(推奨) 新しいRAMロール

同じアカウント内でCRRを実行するルールを作成する場合、RAMロールを作成できます。 [RAMロール名] ドロップダウンリストから [新しいRAMロール] を選択すると、oss-replication-{uuid} 形式のRAMロールが自動的に作成され、KMSに基づいて暗号化されたオブジェクトの複製を [はい] に設定するかどうかに基づいて、ロールに異なるポリシーがアタッチされます。

  • KMSに基づいて暗号化されたオブジェクトの複製をはいに設定する

    RAMロールを作成したら、画面の指示に従って必要なポリシーをロールにアタッチします。 次に、ソースバケットからターゲットバケットにデータをレプリケートするポリシーと、Key Management Service (KMS) を管理するAliyunKMSFullAccessポリシーにRAMロールがアタッチされます。

  • KMSに基づいて暗号化されたレプリケートオブジェクトをNoに設定する

    RAMロールを作成したら、画面の指示に従って必要なポリシーをロールにアタッチします。 次に、RAMロールがポリシーにアタッチされ、ソースバケットから宛先バケットにデータがレプリケートされます。

AliyunOSSRole

同じアカウント内でCRRを実行するルールを作成する場合、AliyunOSSRoleロールを選択してデータ複製タスクを完了できます。 AliyunOSSRoleを選択すると、KMSに基づいて暗号化されたオブジェクトの複製をはいに設定するかどうかに基づいて、異なるポリシーがAliyunOSSRoleロールにアタッチされます。

  • KMSに基づいて暗号化されたオブジェクトの複製をはいに設定する

    AliyunOSSRoleを選択すると、AliyunOSSRoleロールに次のポリシーが自動的にアタッチされます。AliyunOSSFullAccess (OSSを管理するためのアクセス許可) およびAliyunKMSFullAccess (KMSを管理するためのアクセス許可) 。

    警告

    AliyunOSSRoleロールには、現在のAlibaba CloudアカウントおよびKMS内のすべてのバケットですべての操作を実行する権限があります。 このロールを使用するときは注意してください。

  • KMSに基づいて暗号化されたレプリケートオブジェクトをNoに設定する

    AliyunOSSRoleを選択すると、AliyunOSSFullAccessポリシーが自動的にAliyunOSSRoleロールにアタッチされます。

    警告

    AliyunOSSRoleロールには、現在のAlibaba Cloudアカウント内のすべてのバケットですべての操作を実行する権限があります。 このロールを使用するときは注意してください。

カスタム役割

同じアカウント内でCRRを実行するルールを作成する場合、カスタムロールを使用してデータ複製タスクを完了できます。 RAMコンソールでカスタムロールを作成し、必要なポリシーをカスタムロールにアタッチする必要があります。

  1. 通常のサービスロールを作成します。

    ロールを作成するときは、[信頼できるエンティティの選択] を [Alibaba Cloud Service] に、ロールタイプを [通常のサービスロール] に、[信頼できるサービスの選択] を [OSS] に設定します。 詳細については、「通常のサービスロールの作成」をご参照ください。

  2. RAMロールに権限を付与します。

    次のいずれかの方法を使用して、RAMロールに権限を付与できます。

    必要なシステムポリシーをRAMロールにアタッチする

    警告

    AliyunOSSFullAccessシステムポリシーをRAMロールにアタッチします。 AliyunOSSFullAccessシステムポリシーがアタッチされているRAMロールには、現在のAlibaba Cloudアカウント内のすべてのバケットですべての操作を実行する権限があります。 システムポリシーをRAMロールにアタッチするときは、注意して続行してください。

    KMSで暗号化されたオブジェクトを宛先バケットにレプリケートする場合は、AliyunKMSFullAccessシステムポリシーをRAMロールにアタッチする必要があります。

    詳細については、「RAMロールへの権限の付与」をご参照ください。

    RAMロールにカスタムポリシーをアタッチする

    RAMロールにカスタムポリシーをアタッチして、ソースバケットとターゲットバケットでCRRを実行するために必要な最小限の権限をロールに付与できます。

    説明

    ビジネス要件に基づいて、src-bucketとdest-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で暗号化されたオブジェクトを宛先バケットにレプリケートする場合は、AliyunKMSFullAccessシステムポリシーをRAMロールにアタッチする必要があります。

方法

OSSコンソールの使用

  1. OSSコンソールにログインします。

  2. 左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、ソースバケットの名前をクリックします。

  3. 左側のナビゲーションツリーで、データ管理 > クロスリージョンレプリケーションを選択します。

  4. クロスリージョンレプリケーションタブで、クロスリージョンレプリケーションをクリックします。

  5. クロスリージョンレプリケーションパネルで、パラメーターを設定します。 下表にパラメーターを示します。

    セクション

    パラメーター

    説明

    ターゲットバケットの設定

    ソースバケット

    ソースバケットのリージョンと名前が表示されます。 パラメーターを指定する必要はありません。

    ターゲットバケット

    [Alibaba Cloudアカウントに属するバケットの選択] を選択し、[リージョン] ドロップダウンリストからリージョンを選択し、[バケット] ドロップダウンリストから宛先バケットを選択します。

    レプリケーションポリシーの設定

    複製するオブジェクト

    宛先バケットにレプリケートするオブジェクトを選択します。 有効な値:

    説明

    データレプリケーションルールを作成した後、ライフサイクルルールまたはCopyObject操作によるオブジェクトのx-oss-last-access-time属性の変更と、ソースバケット内のオブジェクトのストレージクラス変換は、ターゲットバケットと同期されません。

    • ソースバケット内のすべてのオブジェクト: OSSは、ソースバケットから宛先バケットにすべてのオブジェクトをレプリケートします。

    • 指定されたプレフィックスを持つオブジェクト: OSSは、名前に特定のプレフィックスを含むオブジェクトをソースバケットから宛先バケットに複製します。 プレフィックスは最大10個まで指定できます。

    レプリケーションポリシー

    データ複製モードを設定します。 有効な値:

    • 追加 /変更: OSSは、オブジェクトの作成および更新操作のみをソースバケットから宛先バケットにレプリケートします。

    • 追加 /削除 /変更: OSSは、オブジェクトの作成、更新、および削除操作をソースバケットから宛先バケットにレプリケートします。

    マルチパートアップロードを実行してオブジェクトをソースバケットにアップロードする場合、アップロードされた各パーツはターゲットバケットにレプリケートされます。 CompleteMultipartUpload操作を呼び出して取得した完全なオブジェクトも、ターゲットバケットにレプリケートされます。

    詳細については、「特定のシナリオでのデータレプリケーション」をご参照ください。

    既存データの複製

    履歴データ (CRRを有効にする前にソースバケットに存在するデータ) をターゲットバケットにレプリケートするかどうかを指定します。

    • Yes: 履歴データが宛先バケットにレプリケートされます。

      重要

      履歴データがレプリケートされると、ソースバケットからレプリケートされたオブジェクトは、宛先バケット内の同じ名前を持つオブジェクトを上書きする可能性があります。 データの損失を防ぐために、ソースバケットとターゲットバケットのバージョン管理を有効にすることを推奨します。

    • いいえ: OSSは、CRRルールが宛先バケットに有効になった後にアップロードまたは更新されたオブジェクトのみをレプリケートします。

    KMS 暗号化オブジェクトの複製

    KMSに基づいて暗号化されたオブジェクトを宛先バケットに複製するかどうかを指定します。

    • はい: KMSベースの暗号化がソースまたは宛先バケットのオブジェクトに設定されている場合、オブジェクトは宛先バケットにレプリケートされます。

      説明

      HeadObject操作を呼び出して、ソースバケット内のオブジェクトの暗号化ルールを照会し、GetBucketEncryption操作を呼び出して、ターゲットバケットの暗号化ルールを照会します。

    • いいえ: KMSに基づいて暗号化されたオブジェクトは、宛先バケットにレプリケートされません。

    CMK ID

    宛先オブジェクトの暗号化に使用する顧客マスターキー (CMK) を指定します。

    CMKを使用してオブジェクトを暗号化する場合は、KMSコンソールの宛先バケットと同じリージョンにCMKを作成する必要があります。 詳細については、「CMKの作成」をご参照ください。

    RAM ロール

    オブジェクトの複製に使用するRAMロールを指定します。 新しい RAM ロール を選択します。 これは推奨されるオプションです。 ドロップダウンリストから [新しいRAMロール] を選択した後、画面の指示に従って新しいRAMロールに権限を付与します。

    AliyunOSSRoleまたはカスタムRAMロールを選択することもできます。 3種類のRAMロールの詳細については、「ロールタイプ」をご参照ください。

    レプリケーション速度の設定

    アクセラレーションタイプ

    加速タイプを指定します。 トランスミッション加速のみがサポートされています。 中国本土と中国本土以外のリージョン間でデータをレプリケートする場合、転送アクセラレーションを使用してデータ転送を高速化できます。 転送アクセラレーションを有効にすると、転送アクセラレーション料金が課金されます。 詳細については、「転送アクセラレーション料金」をご参照ください。

    RTC

    説明

    RTCは、中国 (杭州) 、中国 (上海) 、中国 (青島) 、中国 (北京) 、中国 (張家口) 、中国 (深セン) の各リージョンでご利用いただけます。

    RTCは、米国 (シリコンバレー) および米国 (バージニア) のリージョンでご利用いただけます。

    レプリケーション時間制御 (RTC) を有効にすると、OSSはOSSにアップロードしたほとんどのオブジェクトを数秒以内にレプリケートし、99.99% のオブジェクトを10分以内にレプリケートします。 RTCを有効にすると課金されます。 詳細については、「RTCトラフィック料金」をご参照ください。

    RTCがサポートされているリージョンの詳細については、「RTC」をご参照ください。

  6. [OK] をクリックします。 表示されるメッセージで、[有効化] をクリックします。

    • CRRルールを設定した後、ルールを変更または削除することはできません。

    • CRRルールを設定した後、レプリケーションタスクは3〜5分で開始されます。 レプリケーションの進行状況は、ソースバケットの クロスリージョンレプリケーション タブで確認できます。

    • CRRでは、データは非同期的に複製される。 ソースバケットから宛先バケットにデータをレプリケートするのに必要な期間は、データの量によって異なります。 期間は、数分から数時間の範囲であり得る。

OSS SDKの使用

同じアカウント内のCRRは、OSS SDK for Java、OSS SDK for Python、およびOSS SDK for Goを使用してのみサポートされます。

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 {
        // In this example, the endpoint of the China (Hangzhou) region is used. Specify your actual endpoint. 
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // We recommend that you do not save access credentials in the project code. Otherwise, access credentials may be leaked. As a result, the security of all resources in your account is compromised. In this example, access credentials are obtained from environment variables. Before you run the sample code, make sure that the environment variables are configured. 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Specify the name of the source bucket. 
        String bucketName = "src-bucket";
        // Specify the name of the destination bucket. The source and destination buckets must belong to the same Alibaba Cloud account. 
        String targetBucketName = "dest-bucket";
        // Specify the region in which the destination bucket is located. The source and destination buckets must be located in different regions. 
        String targetBucketLocation = "oss-cn-shanghai";

        // Create an OSSClient instance. 
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            AddBucketReplicationRequest request = new AddBucketReplicationRequest(bucketName);
            request.setTargetBucketName(targetBucketName);
            request.setTargetBucketLocation(targetBucketLocation);
            // Specify whether to replicate historical data. By default, historical data is replicated. In this example, this parameter is set to false, which indicates that historical data is not replicated. 
            request.setEnableHistoricalObjectReplication(false);
            // Specify the name of the RAM role that you want OSS to use to replicate data. The role must have the permissions to perform CRR on the source bucket and receive replicated objects in the destination bucket. 
            request.setSyncRole("yourRole");
            // Specify whether to replicate the objects that are encrypted by using SSE-KMS. 
            //request.setSseKmsEncryptedObjectsStatus("Enabled");
            // Specify the CMK ID used in SSE-KMS. If Status is set to Enabled, you must specify this parameter. 
            //request.setReplicaKmsKeyID("3542abdd-5821-4fb5-a425-90adca***");
            //List prefixes = new ArrayList();
            //prefixes.add("image/");
            //prefixes.add("video");
            //prefixes.add("a");
            //prefixes.add("A");
            // Specify the prefixes that are contained in the names of the objects that you want to replicate. After you specify the prefixes, only objects whose names contain one of the prefixes are replicated to the destination bucket. 
            //request.setObjectPrefixList(prefixes);
            //List actions = new ArrayList();
            //actions.add(AddBucketReplicationRequest.ReplicationAction.ALL);
            // Specify the operations that you want to replicate to the destination bucket. The default value is ALL, which indicates that all operations performed on objects in the source bucket are replicated to the destination 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
# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
# Specify the name of the source bucket. Example: src-bucket. 
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'src-bucket')
replica_config = ReplicationRule(
    # Specify the name of the destination bucket. The source and destination buckets must belong to the same Alibaba Cloud account. 
    target_bucket_name='dest-bucket',
    # Specify the region in which the destination bucket is located. The source and destination buckets must be located in different regions. 
    target_bucket_location='oss-cn-shanghai',
    # Specify the name of the RAM role that you want OSS to use to replicate data. The role must have the permissions to perform CRR on the source bucket and receive replicated objects in the destination bucket. 
    sync_role_name='roleNameTest',
)

# Specify the prefixes that are contained in the names of the objects that you want to replicate. After you specify the prefixes, only objects whose names contain one of the prefixes are replicated to the destination bucket. 
# prefix_list = ['prefix1', 'prefix2']
# Specify the data replication rule. 
# replica_config = ReplicationRule(
     # prefix_list=prefix_list,
     # Specify the operations that you want to replicate to the destination bucket. The default value is ALL, which indicates that all operations performed on objects in the source bucket are synchronized to the destination bucket. 
     # action_list=[ReplicationRule.ALL],
     # Specify the name of the destination bucket. The source and destination buckets must belong to the same Alibaba Cloud account. 
     # target_bucket_name='dest-bucket',
     # Specify the region in which the destination bucket is located. The source and destination buckets must be located in different regions. 
     # target_bucket_location='yourTargetBucketLocation',
     # Specify whether to replicate historical data. By default, historical data is replicated. In this example, this parameter is set to False, which indicates that historical data is not replicated. 
     # is_enable_historical_object_replication=False,
     # Specify the link that you want to use to transfer data during data replication. 
     # target_transfer_type='oss_acc',    
  #)

# Enable data replication. 
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)
}

// Enable data replication. 
func main() {
	// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Create an OSSClient instance. 
	// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. 
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Specify the name of the source bucket. 
	srcbucketName := "yourSrcBucket"
	// Specify the name of the destination bucket. 
	destBucketName := "yourDestBucket"
	// Specify that objects whose names contain one of the following prefixes are replicated to the destination bucket: prefix_1 and prefix_2.  
	// To replicate all objects from the source bucket to the destination bucket, do not configure prefixes. 
	prefix1 := "prefix_1"
	prefix2 := "prefix_2"
	// Specify the CMK ID used in SSE-KMS. If Status is set to Enabled, you must specify this parameter. 
	keyId := "c4d49f85-ee30-426b-a5ed-95e9xxxx"
	// Specify whether to replicate the objects that are encrypted by using SSE-KMS. 
	source := "Enabled"
	prefixSet := oss.ReplicationRulePrefix{Prefix: []*string{&prefix1, &prefix2}}
	// Enable the RTC feature. 
	enabled := "enabled"
	reqReplication := oss.PutBucketReplication{
		Rule: []oss.ReplicationRule{
			{
				PrefixSet: &prefixSet,
				// Specify the operations that you want to replicate to the destination bucket. The default value is ALL, which indicates that all operations performed on objects in the source bucket are synchronized to the destination bucket. 
				Action: "ALL",
				RTC:    &enabled,
				Destination: &oss.ReplicationRuleDestination{
					Bucket: destBucketName,
					// Specify the region in which the destination bucket is located. The source bucket and destination bucket must be located in different regions. 
					Location: "oss-cn-shanghai",
					// Specify the link that you want to use to transfer data during data replication. In this example, this parameter is set to oss_acc, which indicates that the link used for transfer acceleration is used. 
					TransferType: "oss_acc",
				},
				// Specify whether to replicate historical data. By default, historical data is replicated. In this example, this parameter is set to disabled, which indicates that historical data is not replicated. 
				HistoricalObjectReplication: "disabled",
				// Specify the name of the RAM role that you want OSS to use to replicate data. The role must have the permissions to perform CRR on the source bucket and receive replicated objects in the destination 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を使用して同じアカウント内でCRRを実行する方法の詳細については、「レプリケーション」をご参照ください。

OSS APIの使用

ビジネスで高度なカスタマイズが必要な場合は、RESTful APIを直接呼び出すことができます。 APIを直接呼び出すには、コードに署名計算を含める必要があります。 詳細については、「PutBucketReplication」をご参照ください。

関連ドキュメント