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

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

最終更新日:Dec 12, 2024

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

前提条件

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

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

ロールタイプ

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

重要

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

(推奨) 新しいRAMロール

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

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

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

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

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

AliyunOSSRole

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

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

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

    警告

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

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

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

    警告

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

カスタム役割

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

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

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

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

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

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

    警告

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

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

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

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

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

    説明

    ビジネス要件に基づいて、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. 左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、[src-bucket] をクリックします。

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

  4. 同一リージョン内のレプリケーションタブで、同一リージョン内のレプリケーションをクリックします。

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

    セクション

    パラメーター

    説明

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

    ソースバケット

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

    ターゲットバケット

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

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

    複製するオブジェクト

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

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

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

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

    ソースバケットからターゲットバケットにレプリケートする操作を設定します。 有効な値:

    説明

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

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

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

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

    バージョン管理が有効なバケット内のオブジェクトのSRRを構成する方法の詳細については、「バージョン管理でのデータレプリケーションの使用」をご参照ください。

    既存データの複製

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

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

      重要

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

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

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

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

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

      説明

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

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

    CMK ID

    レプリケートするオブジェクトを暗号化する顧客マスターキー (CMK) を指定します。

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

    RAM ロール

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

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

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

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

    • SRRルールを設定した後、レプリケーションタスクは3〜5分で開始されます。 ソースバケットの同一リージョン内のレプリケーションタブの [履歴データの複製] 列で、レプリケーションの進行状況を確認できます。

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

OSS SDKの使用

同じアカウント内のSRRは、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 the same region. 
        String targetBucketLocation = "oss-cn-hangzhou";

        // 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 RAM role must have the permissions to perform SRR 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.PUT);
            // Specify that OSS replicates object creation and update operations from the source bucket 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 source 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 the same region. 
    target_bucket_location='oss-cn-hangzhou'
    # Specify the name of the RAM role that you want OSS to use to replicate data. The RAM role must have the permissions to perform SRR 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 that OSS replicates object creation and update operations from the source bucket to the destination bucket.
     # action_list=[ReplicationRule.PUT],
     # Specify the name of the destination bucket. 
     # target_bucket_name='dest-bucket',
     # Specify the region in which the destination bucket is located. 
     # 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,    
     # Replicate the objects that are encrypted by using SSE-KMS. 
     # sse_kms_encrypted_objects_status=ReplicationRule.ENABLED
     # Specify the CMK ID used in SSE-KMS. If you want to use SSE-KMS to encrypt the objects that are replicated to the destination bucket, you must specify this parameter. 
     # replica_kms_keyid='9468da86-3509-4f8d-a61e-6eab1eac****',
  #)

# 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-95e9****"
	// Specify whether to replicate the objects that are encrypted by using SSE-KMS. 
	source := "Enabled"
	prefixSet := oss.ReplicationRulePrefix{Prefix: []*string{&prefix1, &prefix2}}	
	reqReplication := oss.PutBucketReplication{
		Rule: []oss.ReplicationRule{
			{
				PrefixSet: &prefixSet,
				// Specify that OSS replicates object creation and update operations from the source bucket to the destination bucket.
				Action: "PUT",				
				Destination: &oss.ReplicationRuleDestination{
					Bucket: destBucketName,
					// Specify the region in which the destination bucket is located. The source and destination buckets must be located in the same region. 
					Location: "oss-cn-hangzhou",					
				},
				// 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 RAM role must have the permissions to perform SRR 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を使用してSRRを有効にする方法の詳細については、「レプリケーション」をご参照ください。

OSS APIの使用

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