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

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

最終更新日:Nov 09, 2025

同一アカウント内のクロスリージョンレプリケーション (CRR) は、あるリージョンのソースバケットから別のリージョンのターゲットバケットにオブジェクトを自動的かつ非同期にコピーします。これには、オブジェクトの作成、更新、削除が含まれます。このトピックでは、同一アカウント内で CRR を設定する方法について説明します。

前提条件

  • ソースバケット (バケット A) がリージョンに作成されていること。アカウント UID、バケット A の名前、およびそのリージョンをメモしておきます。

  • ターゲットバケット (バケット B) が同じアカウントの別のリージョンに作成されていること。バケット B の名前とそのリージョンをメモしておきます。

ロールタイプ

同一アカウント内で CRR を設定するには、レプリケーション用のロールを指定する必要があります。タスクには、次のいずれかのロールを選択できます。

重要

RAM ユーザーを使用してロールを作成できます。RAM ユーザーには、ram:CreateRoleram:GetRoleram:ListPoliciesForRole、および ram:AttachPolicyToRole の権限が必要です。ただし、ram:CreateRoleram:GetRole などのロール関連の権限を RAM ユーザーに付与すると、高いセキュリティリスクが生じるため、関連付けられた Alibaba Cloud アカウントを使用して RAM ロールを作成し、それに権限を付与することができます。その後、RAM ユーザーは Alibaba Cloud アカウントによって作成された RAM ロールを偽装できます。

(推奨) 新しいロールの作成

同一アカウントの CRR ルールを作成するときに、レプリケーションタスク用の新しいロールを作成できます。新しいロールの作成を選択すると、oss-replication-{uuid} という名前のロールが自動的に作成されます。Key Management Service (KMS) を使用して暗号化されたオブジェクトをレプリケートするかどうかに基づいて、異なるアクセスポリシーが付与されます。

  • KMS で暗号化されたオブジェクトのレプリケート

    ロールを作成した後、画面の指示に従って権限を付与します。権限付与後、ロールには、ソースバケットからターゲットバケットへのレプリケーションのための詳細なポリシーと、KMS を管理する権限を付与する AliyunKMSFullAccess ポリシーが付与されます。

  • KMS で暗号化されたオブジェクトをレプリケートしない

    ロールを作成した後、画面の指示に従って権限を付与します。権限付与後、ロールには、ソースバケットからターゲットバケットへのレプリケーションのための詳細なポリシーが付与されます。

AliyunOSSRole

同一アカウントの CRR ルールを作成するときに、AliyunOSSRole を選択してレプリケーションタスクを完了できます。このロールを選択すると、KMS で暗号化されたオブジェクトをレプリケートするかどうかに基づいて、異なるアクセスポリシーが付与されます。

  • KMS で暗号化されたオブジェクトのレプリケート

    AliyunOSSRole を選択すると、ロールには Object Storage Service (OSS) を管理する権限を付与する AliyunOSSFullAccess ポリシーと、KMS を管理する権限を付与する AliyunKMSFullAccess ポリシーが自動的に付与されます。

    警告

    このロールには、現在のアカウントのすべてのバケットと KMS キーに対するすべての操作を実行する権限があります。権限の範囲が広いため、このロールは注意して使用してください。

  • KMS で暗号化されたオブジェクトをレプリケートしない。

    AliyunOSSRole を選択すると、ロールには OSS の完全な管理権限を提供する AliyunOSSFullAccess ポリシーが自動的に付与されます。

    警告

    このロールには、現在のアカウントのすべてのバケットに対するすべての操作を実行する権限があります。権限の範囲が広いため、このロールは注意して使用してください。

カスタムロール

同一アカウントの CRR ルールを作成するときに、レプリケーションタスクにカスタムロールを使用できます。RAM コンソールでカスタムロールを作成し、必要な権限をロールに付与する必要があります。

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

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

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

    次のいずれかの方法でロールに権限を付与できます。

    RAM ロールへのシステムポリシーの付与

    警告

    AliyunOSSFullAccess システムポリシーを RAM ロールに付与できます。AliyunOSSFullAccess ポリシーは、デフォルトで現在のアカウントのすべてのバケットに対するすべての操作を実行する権限を付与します。このポリシーは注意して使用してください。

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

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

    RAM ロールへのカスタムポリシーの付与

    RAM ポリシーを使用して、ソースバケット (src-bucket) からターゲットバケット (dest-bucket) へのレプリケーションに必要な最小限の権限を RAM ロールに付与できます。

    説明

    ポリシーを使用するときは、ソースバケットとターゲットバケットの名前を実際の名前で置き換えてください。

    {
       "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 システムポリシーもロールに付与する必要があります。

重要

同一アカウント内でリージョンをまたいでデータをレプリケートする場合、OSS はレプリケーションに使用される RAM ロールのアクセスポリシーのみをチェックします。OSS は、ソースバケットとターゲットバケットのバケットポリシーをチェックしません。

手順

OSS コンソールの使用

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

  2. バケット をクリックします。次に、ソースバケットの名前をクリックします。

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

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

  5. クロスリージョンレプリケーション ダイアログボックスで、次の表の説明に従ってパラメーターを設定します。

    エリア

    パラメーター

    説明

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

    ソースバケット

    ソースバケットのリージョンと名前。

    ターゲットバケット

    [このアカウントのバケットを選択] を選択します。次に、ドロップダウンリストからターゲットバケットのリージョンと名前を選択します。

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

    複製するオブジェクト

    レプリケートするソースデータを選択します。

    説明

    レプリケーションルールが作成された後、ライフサイクルルールまたは CopyObject 操作によって引き起こされるソースバケット内のオブジェクトのストレージタイプの変更は、ターゲットバケットにレプリケートされません。オブジェクトの最終アクセス時間 (x-oss-last-access-time) プロパティもレプリケートされません。

    • すべてのファイルの同期: バケット内のすべてのオブジェクトをターゲットバケットにレプリケートします。

    • 特定のプレフィックスを持つオブジェクトをレプリケート: 指定されたプレフィックスを持つオブジェクトをターゲットバケットにレプリケートします。デフォルトでは最大 10 個のプレフィックスを追加できます。さらにプレフィックスを追加するには、テクニカルサポートにお問い合わせください。最大 30 個のプレフィックスを追加できます。

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

    レプリケーションメソッドを選択します。

    • 追加/変更: ソースバケット内のオブジェクトの追加と更新をターゲットバケットにレプリケートします。

    • 追加/削除/変更: ソースバケット内のオブジェクトの追加、更新、削除をターゲットバケットにレプリケートします。

    オブジェクトがマルチパートアップロードを使用してソースバケットにアップロードされた場合、各パートのアップロード操作はターゲットバケットにレプリケートされます。すべてのパートに対して CompleteMultipartUpload 操作が実行された後に生成されたオブジェクトも、ターゲットバケットにレプリケートされます。

    CRR がバージョン管理と共に使用される場合のレプリケーション動作の詳細については、「バージョン管理を使用したレプリケーション」をご参照ください。

    既存データの複製

    CRR ルールが有効になる前に保存されていたソースバケット内の既存データをレプリケートするかどうかを選択します。

    • レプリケート: 既存データをターゲットバケットにレプリケートします。

      重要

      既存データがレプリケートされると、ソースバケットのオブジェクトがターゲットバケットの同じ名前のオブジェクトを上書きする可能性があります。データ損失を防ぐために、ソースバケットとターゲットバケットの両方でバージョン管理を有効にしてください。

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

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

    KMS で暗号化されたオブジェクトをターゲットバケットにレプリケートするかどうかを選択します。

    • レプリケート: ソースオブジェクトまたはターゲットバケットが KMS で管理されるキー (SSE-KMS) を使用したサーバー側暗号化で暗号化されており、CMK ID が指定されている場合、オブジェクトをターゲットバケットにレプリケートします。

      説明

      HeadObject および GetBucketEncryption 操作を呼び出して、それぞれソースオブジェクトとターゲットバケットの暗号化ステータスをクエリできます。

    • レプリケートしない: KMS で暗号化されたオブジェクトをターゲットバケットにレプリケートしません。

    CMK ID

    ターゲットオブジェクトを暗号化するための KMS キーを指定します。

    事前に KMS プラットフォームでターゲットバケットと同じリージョンに KMS キーを作成する必要があります。詳細については、「キーの作成」をご参照ください。

    RAM ロール

    新しい RAM ロール を選択します。ドロップダウンリストからこのオプションを選択した後、画面の指示に従ってロールに権限を付与します。

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

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

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

    トランスミッション加速 のみがサポートされています。転送アクセラレーションは、中国本土と中国本土以外のリージョン間の CRR の速度を向上させます。転送アクセラレーションを有効にすると、転送アクセラレーション料金が課金されます。課金方法の詳細については、「転送アクセラレーション料金」をご参照ください。

    レプリケーション時間管理 (RTC)

    説明

    RTC は、中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (深圳) の各リージョン間のクロスリージョンレプリケーションタスクでのみ有効にできます。

    RTC は、米国 (シリコンバレー) と米国 (バージニア) リージョン間のクロスリージョンレプリケーションタスクでのみ利用できます。

    既存データのレプリケーションを含まないタスクの場合、RTC は有効化してから 15 分以内に有効になります。既存データのレプリケーションを含むタスクの場合、RTC は既存データがレプリケートされてから約 1 時間後に有効になります。RTC が有効になると、OSS は新しく書き込まれたオブジェクト (非既存オブジェクト) の 99.99% を 10 分以内にレプリケートします。RTC を有効にすると、RTC 料金が課金されます。

  6. [OK] をクリックします。表示されるダイアログボックスで、[有効化] をクリックします。

    • CRR ルールを作成した後は、編集または削除できません。

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

    • バケット間の CRR は非同期 (ほぼリアルタイム) であるため、データをターゲットバケットにレプリケートするために必要な時間はデータサイズによって異なります。このプロセスには通常、数分から数時間かかります。

Alibaba Cloud SDK の使用

Java、Python、Go の SDK のみが、同一アカウント内の CRR をサポートしています。

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
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";
        // エンドポイントに対応するリージョン ID を指定します。例: cn-hangzhou。
        String region = "cn-hangzhou";
        // プロジェクトコードにアクセス資格情報を保存しないでください。保存すると、アクセス資格情報が漏洩し、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。この例では、環境変数からアクセス資格情報を取得する方法を示します。この例を実行する前に、環境変数を設定してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // ソースバケットの名前を指定します。
        String bucketName = "src-bucket";
        // データをレプリケートするターゲットバケットを指定します。ターゲットバケットとソースバケットは、同じアカウントに属している必要があります。
        String targetBucketName = "dest-bucket";
        // ターゲットバケットのリージョンを指定します。ターゲットバケットとソースバケットは、異なるリージョンにある必要があります。
        String targetBucketLocation = "oss-cn-shanghai";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // V4 署名アルゴリズムの使用を明示的に宣言します。
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            AddBucketReplicationRequest request = new AddBucketReplicationRequest(bucketName);
            request.setTargetBucketName(targetBucketName);
            request.setTargetBucketLocation(targetBucketLocation);
            // デフォルトでは、既存データがレプリケートされます。この例では、このパラメーターを false に設定して、既存データのレプリケーションを無効にします。
            request.setEnableHistoricalObjectReplication(false);
            // データのレプリケーションを承認されたロールの名前を指定します。このロールには、ソースバケットで CRR を実行し、ターゲットバケットでレプリケートされたオブジェクトを受信する権限が付与されている必要があります。
            request.setSyncRole("yourRole");
            // 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");
            // レプリケートするオブジェクトのプレフィックスを指定します。プレフィックスを指定すると、プレフィックスに一致するオブジェクトのみがターゲットバケットにレプリケートされます。
            //request.setObjectPrefixList(prefixes);
            //List actions = new ArrayList();
            //actions.add(AddBucketReplicationRequest.ReplicationAction.PUT);
            // ソースバケット内のオブジェクトの追加と更新をターゲットバケットにレプリケートします。
            //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(
    # データをレプリケートするターゲットバケットを指定します。ターゲットバケットとソースバケットは、同じアカウントに属している必要があります。
    target_bucket_name='dest-bucket',
    # ターゲットバケットのリージョンを指定します。ターゲットバケットとソースバケットは、異なるリージョンにある必要があります。
    target_bucket_location='oss-cn-shanghai',
    # データのレプリケーションを承認されたロールの名前を指定します。このロールには、ソースバケットで CRR を実行し、ターゲットバケットでレプリケートされたオブジェクトを受信する権限が付与されている必要があります。
    sync_role_name='roleNameTest',
)

# レプリケートするオブジェクトのプレフィックスを指定します。プレフィックスを指定すると、プレフィックスに一致するオブジェクトのみがターゲットバケットにレプリケートされます。
# prefix_list = ['prefix1', 'prefix2']
# レプリケーションルールを設定します。
# replica_config = ReplicationRule(
     # prefix_list=prefix_list,
     # ソースバケット内のオブジェクトの追加と更新をターゲットバケットにレプリケートします。
     # action_list=[ReplicationRule.PUT],
     # データをレプリケートするターゲットバケットを指定します。ターゲットバケットとソースバケットは、同じアカウントに属している必要があります。
     # target_bucket_name='dest-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 (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// グローバル変数を定義します。
var (
	region     string // バケットが配置されているリージョン。
	bucketName string // バケットの名前。
)

// コマンドラインパラメーターを初期化するために使用される init 関数を指定します。
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}

func main() {
	// コマンドラインパラメーターを解析します。
	flag.Parse()

	var (
		targetBucket   = "target bucket name" // ターゲットバケットの名前。
		targetLocation = "oss-cn-beijing"     // ターゲットバケットが配置されているリージョン。
	)

	// バケットの名前が指定されているかどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// リージョンが指定されているかどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// デフォルト設定をロードし、資格情報プロバイダーとリージョンを指定します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSS クライアントを作成します。
	client := oss.NewClient(cfg)

	// バケットのデータレプリケーションを有効にするリクエストを作成します。
	request := &oss.PutBucketReplicationRequest{
		Bucket: oss.Ptr(bucketName), // バケットの名前。
		ReplicationConfiguration: &oss.ReplicationConfiguration{
			Rules: []oss.ReplicationRule{
				{
					RTC: &oss.ReplicationTimeControl{
						Status: oss.Ptr("enabled"), // RTC 機能を有効にします。
					},
					Destination: &oss.ReplicationDestination{
						Bucket:       oss.Ptr(targetBucket),   // ターゲットバケットの名前。
						Location:     oss.Ptr(targetLocation), // ターゲットバケットが配置されているリージョン。
						TransferType: oss.TransferTypeOssAcc,  // 転送のタイプ。
					},
					HistoricalObjectReplication: oss.HistoricalObjectReplicationEnabled, // 既存データレプリケーション機能を有効にします。
				},
			},
		},
	}

	// データレプリケーションを有効にします。
	result, err := client.PutBucketReplication(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to put bucket replication %v", err)
	}

	// 結果を表示します。
	log.Printf("put bucket replication result:%#v\n", result)
}

ossutil の使用

ossutil を使用して CRR を有効にする方法の詳細については、「put-bucket-replication」をご参照ください。

REST API の使用

プログラムに高いカスタマイズ要件がある場合は、REST API リクエストを直接送信できます。これを行うには、署名を計算するためのコードを手動で記述する必要があります。詳細については、「PutBucketReplication」をご参照ください。

リファレンス