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

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

最終更新日:Jun 18, 2025

同一アカウント内での同一リージョンレプリケーション (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:ListPoliciesForRoleram:AttachPolicyToRole などの権限が必要です。ram:CreateRoleram:GetRole などの権限を RAM ユーザーに付与することによるリスクを排除するために、RAM ユーザーが関連付けられている Alibaba Cloud アカウントを使用して、RAM ロールを作成し、必要なポリシーを付与することができます。その後、RAM ユーザーは Alibaba Cloud アカウントによって作成された RAM ロールを引き受けることができます。

(推奨) 新しい RAM ロール

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

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

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

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

    RAM ロールを作成した後、画面の指示に従って必要なポリシーをロールにアタッチします。その後、RAM ロールは、ソースバケットからデスティネーションバケットにデータをレプリケートするためのポリシーにアタッチされます。

AliyunOSSRole

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

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

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

    警告

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

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

    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 ロールにアタッチする

    ソースバケットとデスティネーションバケットで同一アカウント内での SRR を実行するために必要な最小限の権限を RAM ロールに付与するために、カスタム 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 個のプレフィックスを指定できます。増加については、technical support にお問い合わせください。リクエストに応じて、プレフィックスの最大数を 30 に増やすことができます。

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

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

    説明

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

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

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

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

    詳細については、「バージョン管理が有効なバケット内のオブジェクトに SRR を設定する方法」をご参照ください。

    既存データの複製

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

    • [はい]:履歴データはコピー先バケットにレプリケートされます。

      重要

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

    • [いいえ]: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 {
        // この例では、中国 (杭州) リージョンのエンドポイントが使用されています。実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // アクセスクレデンシャルをプロジェクトコードに保存しないことをお勧めします。そうしないと、アクセスクレデンシャルが漏洩する可能性があります。その結果、アカウント内のすべてのリソースのセキュリティが侵害されます。この例では、アクセスクレデンシャルは環境変数から取得されます。サンプルコードを実行する前に、環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // ソースバケットの名前を指定します。
        String bucketName = "src-bucket";
        // コピー先バケットの名前を指定します。ソースバケットとコピー先バケットは、同じ Alibaba Cloud アカウントに属している必要があります。
        String targetBucketName = "dest-bucket";
        // コピー先バケットが配置されているリージョンを指定します。ソースバケットとコピー先バケットは、同じリージョンに配置されている必要があります。
        String targetBucketLocation = "oss-cn-hangzhou";

        // 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 がデータのレプリケートに使用する RAM ロールの名前を指定します。 RAM ロールには、ソースバケットで SRR を実行し、コピー先バケットでレプリケートされたオブジェクトを受信するための権限が必要です。
            request.setSyncRole("yourRole");
            // SSE-KMS を使用して暗号化されたオブジェクトをレプリケートするかどうかを指定します。
            //request.setSseKmsEncryptedObjectsStatus("Enabled");
            // SSE-KMS で使用される CMK 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");
            // レプリケートするオブジェクトの名前に含まれるプレフィックスを指定します。プレフィックスを指定すると、名前にプレフィックスのいずれかが含まれるオブジェクトのみがコピー先バケットにレプリケートされます。
            //request.setObjectPrefixList(prefixes);
            //List actions = new ArrayList();
            //actions.add(AddBucketReplicationRequest.ReplicationAction.PUT);
            // OSS がソースバケットからコピー先バケットにオブジェクトの作成および更新操作をレプリケートするように指定します。
            //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())
# ソースバケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
# ソースバケットの名前を指定します。例: src-bucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'src-bucket')
replica_config = ReplicationRule(
    # コピー先バケットの名前を指定します。ソースバケットとコピー先バケットは、同じ Alibaba Cloud アカウントに属している必要があります。
    target_bucket_name='dest-bucket',
    # コピー先バケットが配置されているリージョンを指定します。ソースバケットとコピー先バケットは、同じリージョンに配置されている必要があります。
    target_bucket_location='oss-cn-hangzhou',
    # OSS がデータのレプリケートに使用する RAM ロールの名前を指定します。 RAM ロールには、ソースバケットで SRR を実行し、コピー先バケットでレプリケートされたオブジェクトを受信するための権限が必要です。
    sync_role_name='roleNameTest',
)

# レプリケートするオブジェクトの名前に含まれるプレフィックスを指定します。プレフィックスを指定すると、名前にプレフィックスのいずれかが含まれるオブジェクトのみがコピー先バケットにレプリケートされます。
# prefix_list = ['prefix1', 'prefix2']
# データレプリケーションルールを指定します。
# replica_config = ReplicationRule(
     # prefix_list=prefix_list,
     # OSS がソースバケットからコピー先バケットにオブジェクトの作成および更新操作をレプリケートするように指定します。
     # action_list=[ReplicationRule.PUT],
     # コピー先バケットの名前を指定します。
     # target_bucket_name='dest-bucket',
     # コピー先バケットが配置されているリージョンを指定します。
     # target_bucket_location='yourTargetBucketLocation',
     # 履歴データをレプリケートするかどうかを指定します。デフォルトでは、履歴データはレプリケートされます。この例では、このパラメーターは False に設定されており、履歴データはレプリケートされないことを示します。
     # is_enable_historical_object_replication=False,    
     # SSE-KMS を使用して暗号化されたオブジェクトをレプリケートします。
     # sse_kms_encrypted_objects_status=ReplicationRule.ENABLED
     # SSE-KMS で使用される CMK ID を指定します。コピー先バケットにレプリケートされたオブジェクトを SSE-KMS を使用して暗号化する場合は、このパラメーターを指定する必要があります。
     # replica_kms_keyid='9468da86-3509-4f8d-a61e-6eab1eac****',
  #)

# データレプリケーションを有効にします。
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 インスタンスを作成します。
	// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。実際のエンドポイントを指定してください。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// ソースバケットの名前を指定します。
	srcbucketName := "yourSrcBucket"
	// コピー先バケットの名前を指定します。
	destBucketName := "yourDestBucket"
	// 名前にプレフィックス prefix_1 と prefix_2 のいずれかが含まれるオブジェクトがコピー先バケットにレプリケートされるように指定します。
	// ソースバケットからコピー先バケットにすべてのオブジェクトをレプリケートするには、プレフィックスを設定しないでください。
	prefix1 := "prefix_1"
	prefix2 := "prefix_2"
	// SSE-KMS で使用される CMK ID を指定します。Status が Enabled に設定されている場合は、このパラメーターを指定する必要があります。
	keyId := "c4d49f85-ee30-426b-a5ed-95e9****"
	// SSE-KMS を使用して暗号化されたオブジェクトをレプリケートするかどうかを指定します。
	source := "Enabled"
	prefixSet := oss.ReplicationRulePrefix{Prefix: []*string{&prefix1, &prefix2}}	
	reqReplication := oss.PutBucketReplication{
		Rule: []oss.ReplicationRule{
			{
				PrefixSet: &prefixSet,
				// OSS がソースバケットからコピー先バケットにオブジェクトの作成および更新操作をレプリケートするように指定します。
				Action: "PUT",				
				Destination: &oss.ReplicationRuleDestination{
					Bucket: destBucketName,
					// コピー先バケットが配置されているリージョンを指定します。ソースバケットとコピー先バケットは、同じリージョンに配置されている必要があります。
					Location: "oss-cn-hangzhou",					
				},
				// 履歴データをレプリケートするかどうかを指定します。デフォルトでは、履歴データはレプリケートされます。この例では、このパラメーターは disabled に設定されており、履歴データはレプリケートされないことを示します。
				HistoricalObjectReplication: "disabled",
				// OSS がデータのレプリケートに使用する RAM ロールの名前を指定します。 RAM ロールには、ソースバケットで SRR を実行し、コピー先バケットでレプリケートされたオブジェクトを受信するための権限が必要です。
				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 を有効にする方法の詳細については、「put-bucket-replication」をご参照ください。

OSS API を使用する

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