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

Object Storage Service:同一アカウント内のクロスリージョンレプリケーション

最終更新日:Mar 28, 2026

クロスリージョンレプリケーション (CRR) は、同一の Alibaba Cloud アカウント内で、あるリージョンのソースバケットから別のリージョンの宛先バケットにオブジェクトを自動的かつ非同期にレプリケーションします。オブジェクトの作成、更新、削除の操作は、ほぼリアルタイムでレプリケーションされます。このトピックでは、同一アカウントに属するバケットに対して CRR を設定する方法について説明します。

前提条件

  • ご利用の Alibaba Cloud アカウントの特定のリージョンにソースバケットを作成済みであること。アカウントの UID、ソースバケット名、およびそのリージョンを記録しておきます。

  • 同一の Alibaba Cloud アカウントの別のリージョンに宛先バケットを作成済みであること。宛先バケット名とそのリージョンを記録しておきます。

ロールの種類

CRR を実行するには、Object Storage Service (OSS) がソースバケットから宛先バケットへオブジェクトをレプリケーションするために引き受けることができる RAM ロールを指定する必要があります。レプリケーションには、以下のいずれかのロールタイプを選択できます。

重要

RAM ユーザーを使用してロールを作成できます。RAM ユーザーには、ram:CreateRoleram:GetRoleram:ListPoliciesForRole、および ram:AttachPolicyToRole の権限が必要です。ただし、ram:CreateRoleram:GetRole のようなロール関連の権限を RAM ユーザーに付与すると、セキュリティリスクが生じます。親の Alibaba Cloud アカウントを使用して RAM ロールを作成し、権限を付与した上で、RAM ユーザーがそのロールを引き受けることを推奨します。

(推奨) 新しい RAM ロール

CRR ルールを作成する際に、レプリケーション用に新しい RAM ロールを作成できます。OSS は自動的に oss-replication-{uuid} という名前のロールを作成し、Key Management Service (KMS) で暗号化されたオブジェクトをレプリケーションするかどうかに応じて、異なる権限ポリシーをアタッチします。

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

    ロールを作成した後、プロンプトに従って必要な権限を付与します。権限が付与されると、ロールはソースバケットから宛先バケットへのレプリケーションのための詳細な権限ポリシーと、Key Management Service (KMS) を管理するための AliyunKMSCryptoUserAccess ポリシーを受け取ります。

  • KMS 暗号化されたオブジェクトを複製しないでください。

    ロールを作成した後、プロンプトに従って必要な権限を付与します。権限が付与されると、ロールはソースバケットから宛先バケットへのレプリケーションのための詳細な権限ポリシーを受け取ります。

AliyunOSSRole

CRR ルールを作成する際に、AliyunOSSRole を選択してレプリケーションを実行できます。OSS は、KMS で暗号化されたオブジェクトをレプリケーションするかどうかの選択に基づいて、異なる権限ポリシーをロールにアタッチします。

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

    AliyunOSSRole を選択すると、OSS は自動的に次の権限ポリシーをロールにアタッチします:AliyunOSSFullAccess (Object Storage Service を管理する権限) および AliyunKMSCryptoUserAccess (Key Management Service を管理する権限)。

    警告

    このロールは広範な権限を持ち、現在のアカウント配下にあるすべてのバケットと KMS リソースに対するすべての操作を許可します。このロールは注意して使用してください。

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

    AliyunOSSRole を選択すると、OSS は自動的に AliyunOSSFullAccess (Object Storage Service を管理する権限) をロールにアタッチします。

    警告

    このロールは広範な権限を持ち、現在のアカウント配下にあるすべてのバケットに対するすべての操作を許可します。このロールは注意して使用してください。

カスタムロール

CRR ルールを作成する際に、レプリケーションにカスタムロールを使用できます。Resource Access Management (RAM) コンソールでカスタムロールを作成し、必要な権限をロールに付与する必要があります。

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

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

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

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

    システムポリシー

    警告

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

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

    詳細については、「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. クロスリージョンレプリケーション パネルで、以下のパラメーターを設定します。

    セクション

    パラメーター

    説明

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

    ソースバケット

    ソースバケットのリージョンと名前を表示します。

    宛先バケット

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

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

    複製するオブジェクト

    レプリケーションするソースオブジェクトを選択します。

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

    • [指定したプレフィックスで同期]:指定したプレフィックスを持つオブジェクトのみを宛先バケットにレプリケーションします。デフォルトでは最大 10 個のプレフィックスを追加できます。上限を 100 に増やすには、テクニカルサポートにお問い合わせください。

    [オブジェクトのタグ付け]

    説明

    このパラメーターを設定するには、以下の条件を満たす必要があります:

    • オブジェクトにタグがすでに設定されていること。

    • 「削除マーカーのレプリケーション」も「削除操作のレプリケーション」も選択されていないこと。

    [ルールの設定] チェックボックスを選択すると、特定のタグを持つオブジェクトを宛先バケットにレプリケーションできます。最大 10 個のタグ (キーと値のペア) を追加できます。タグを追加した後、以下のいずれかの [タグフィルタリングポリシー] を選択できます:

    • [すべてのタグを含む]:フィルタリングルールで定義されたすべてのタグがオブジェクトに存在する場合にのみ、オブジェクトがレプリケーションされます。

    • [いずれかのタグを含む]:フィルタリングルールで定義されたタグのうち、少なくとも 1 つがオブジェクトに存在する場合に、オブジェクトがレプリケーションされます。

      説明

      タグフィルタリングは現在、中国 (張家口)、中国 (中衛)、メキシコ の各リージョンではサポートされていません。

    コピー削除操作

    オブジェクトのレプリケーション方法を選択します。

    説明

    CRR ルールを作成した後、ライフサイクルルールまたは CopyObject 操作によって引き起こされるソースバケットのストレージクラスの変更、およびバケット内のオブジェクトの最終アクセス時刻 (x-oss-last-access-time) 属性の変更は、宛先バケットにレプリケーションされません。

    • [いいえ] (ディザスタリカバリシナリオ向け):オブジェクトの作成および更新操作をソースバケットから宛先バケットにレプリケーションします。

      重要
      • このポリシーでは、新規および更新されたオブジェクトのみがレプリケーションされます。ソースバケットでの削除操作は宛先バケットに影響しません。この方法により、ソースバケットでの手動削除やライフサイクルルールによる自動削除が原因で発生する宛先バケットのデータ損失を防ぎます。

      • ソースバケットでバージョン管理が有効になっている場合、特定のバージョン ID を指定せずにソースバケットからオブジェクトが削除されると、OSS はソースバケットに削除マーカーを作成します。この削除マーカーも宛先バケットにレプリケーションされます。

    • [はい] (同じデータセットを共有およびアクセスする必要があるシナリオ向け):オブジェクトの作成、更新、削除操作をソースバケットから宛先バケットにレプリケーションします。

      重要

      このポリシーでは、すべてのオブジェクトの作成、更新、削除が宛先バケットにレプリケーションされます。この方法はデータ整合性を確保し、同じデータセットを共有およびアクセスする必要があるマルチユーザーまたはマルチアプリケーション環境に適しています。ただし、これはソースバケットからオブジェクトが削除される (手動またはライフサイクルルールによる) と、宛先バケットからも削除され、回復できなくなることも意味します。

    マルチパートアップロードを使用してオブジェクトがソースバケットにアップロードされると、各パートがレプリケーションされます。CompleteMultipartUpload 操作が完了した後に作成される最終的なオブジェクトもレプリケーションされます。

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

    既存データの複製

    CRR を有効にする前にソースバケットに存在していたオブジェクトをレプリケーションするかどうかを指定します。

    • 複製: 既存データを送信先バケットに複製します。

      重要

      既存データをレプリケーションすると、ソースバケットのオブジェクトが宛先バケットの同名オブジェクトを上書きする可能性があります。このデータ損失を防ぐために、ソースバケットと宛先バケットの両方でバージョン管理を有効にすることを推奨します。

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

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

    KMS で暗号化されたオブジェクトを宛先バケットにレプリケーションするかどうかを指定します。

    • [レプリケーション]:ソースオブジェクトが KMS 管理キー (指定されたカスタマーマスターキー (CMK) ID を持つ SSE-KMS) で暗号化されている場合、または宛先バケットが SSE-KMS 暗号化を使用するように設定されている場合に、オブジェクトを宛先バケットにレプリケーションします。

      説明

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

    • [レプリケーションしない]:KMS で暗号化されたオブジェクトを宛先バケットにレプリケーションしません。

    CMK ID

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

    まず、宛先バケットと同じリージョンに KMS キーを作成する必要があります。詳細については、「CMK の作成」をご参照ください。

    RAM ロール

    新しい RAM ロール を選択することを推奨します。その後、プロンプトに従ってロールに権限を付与する必要があります。

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

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

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

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

    レプリケーション タイム コントロール (RTC)

    説明

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

    RTC は、米国 (シリコンバレー) および米国 (バージニア) の各リージョンで利用可能です。

    既存データをレプリケーションしない場合、RTC は 15 分以内に有効になります。レプリケーションする場合は、既存データのレプリケーションが完了してから約 1 時間後に有効になります。RTC が有効になると、OSS は新しいオブジェクト (既存データではないオブジェクト) の 99.99% を 10 分以内にレプリケーションします。RTC を有効にすると、RTC 料金が発生します。

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

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

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

    • オブジェクトを宛先バケットにレプリケーションするために必要な時間は、そのサイズと数量によって異なり、通常は数分から数時間かかります。

Alibaba Cloud SDK

Java、Python、Go 向けの Alibaba Cloud 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);
            // OSS がレプリケーションのために引き受ける RAM ロールを指定します。ロールには、ソースバケットからのレプリケーションと宛先バケットへの書き込み権限が必要です。
            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");
            // レプリケーションするオブジェクトのプレフィックスを指定します。指定されたプレフィックスを持つオブジェクトのみが宛先バケットにレプリケーションされます。
            //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',
    # OSS がデータをレプリケーションするために引き受ける RAM ロールの名前を指定します。このロールには、ソースバケットからの 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」をご参照ください。

関連ドキュメント