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

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

最終更新日:Nov 09, 2025

クロスアカウント同一リージョンレプリケーション (SRR) は、オブジェクトの作成、更新、削除などの操作を、アカウント A のソースバケットから、アカウント B の同一リージョンにある宛先バケットに、自動的かつ非同期にコピーします。このトピックでは、クロスアカウント同一リージョンレプリケーションを設定する方法について説明します。

前提条件

  • アカウント A のリージョンに、SRR のソースバケットとしてバケット A を作成します。アカウント A の UID、バケット A の名前、およびそのリージョンを記録します。

  • アカウント B の同一リージョンに、SRR の宛先バケットとしてバケット B を作成します。アカウント B の UID とバケット B の名前を記録します。

ロールの権限付与

クロスアカウント SRR タスクには、2 つの異なるアカウントのバケットが関与します。したがって、Resource Access Management (RAM) ロールに必要な信頼ポリシーと最小権限ポリシーを設定する必要があります。

  1. アカウント A を使用して、次の操作を実行します。

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

      重要

      RAM ユーザーを使用してロールを作成できます。RAM ユーザーには、ram:CreateRoleram:GetRoleram:ListPoliciesForRole、および ram:AttachPolicyToRole の権限が必要です。ただし、RAM ユーザーに ram:CreateRoleram:GetRole などの権限を付与すると、セキュリティ上の脅威が高くなります。Alibaba Cloud アカウントを使用して RAM ロールを作成し、それに権限を付与することをお勧めします。権限付与が完了すると、RAM ユーザーは Alibaba Cloud アカウントによって作成された RAM ロールを直接使用できます。

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

      説明

      ロールが作成されたら、後で使用するために [基本情報] セクションから RAM ロール ARN を記録します。

    2. ソースバケットでクロスアカウント SRR を実行するための権限をロールに付与します。

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

      RAM ロールにシステムポリシーを付与する

      警告

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

      RAM ロールにカスタムポリシーを付与する

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

      説明

      ポリシーを使用するときは、必要に応じてソースバケット名を置き換えてください。

      {
         "Version":"1",
         "Statement":[
            {
               "Effect":"Allow",
               "Action":[
                  "oss:ReplicateList",
                  "oss:ReplicateGet"
               ],
               "Resource":[
                  "acs:oss:*:*:src-bucket",          	
                  "acs:oss:*:*:src-bucket/*"
               ]
            }
         ]
      }

      Key Management Service (KMS) で暗号化されたオブジェクトを宛先バケットにレプリケーションする場合は、AliyunKMSFullAccess システムポリシーもロールに付与する必要があります。詳細については、「RAM ロールへの権限付与」をご参照ください。

  2. アカウント B を使用して、宛先バケットでレプリケーションされたオブジェクトを受信する権限をロールに付与します。

    (推奨) 方法 1: ビジュアルエディターを使用してポリシーを追加する

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

    2. 左側のナビゲーションウィンドウで、バケット をクリックし、宛先バケット名 dest-bucket をクリックします。

    3. 左側のナビゲーションウィンドウで、権限管理 > バケット承認ポリシー を選択します。

    4. バケット承認ポリシー ページの GUI で追加 タブで、レプリケーションオブジェクトの受信 をクリックします。

    5. レプリケーションオブジェクトの受信 パネルの UID および RAM ロールの取得方法 で、[ソースレプリケーション RAM ロール ARN から取得] を選択します。ソースから RAM ロールの ARN をコピーする に、ステップ 1 で記録したロール ARN を入力します。[権限付与の目的] で、[クロスアカウント SRR] を選択します。

    6. ポリシーの生成 をクリックします。

    方法 2: 構文ポリシーで追加

    1. 左側のナビゲーションウィンドウで、権限管理 > バケット承認ポリシー を選択します。

    2. バケット承認ポリシー ページの 構文で追加 タブで、[編集] をクリックします。

    3. ポリシーエディターで、次のバケットポリシーを入力します。

      重要
      • JSON エディターを使用してバケットポリシーを追加すると、新しいポリシーが既存のポリシーを上書きします。新しいポリシーに既存のポリシーの内容が含まれていることを確認してください。そうしないと、既存のポリシーに依存する操作が失敗する可能性があります。

      • ポリシーを使用するときは、必要に応じて、カスタムロール名、宛先バケット名 (dest-bucket)、ソースバケットを所有するアカウントの UID (137918634953xxxx)、および宛先バケットを所有するアカウントの UID (111933544165xxxx) を置き換えてください。カスタムロール名に大文字が含まれている場合は、小文字に変換してください。たとえば、作成されたロールの名前が AliyunOssDrsRole の場合、aliyunossdrsrole に変換する必要があります。UID は Alibaba Cloud アカウントの UID である必要があります。

      {
         "Version":"1",
         "Statement":[
            {
              "Effect":"Allow",
              "Action":[
                  "oss:ReplicateList",
                  "oss:ReplicateGet",
                  "oss:ReplicatePut",
                  "oss:ReplicateDelete"			
               ],
              "Principal": [
                  "arn:sts::137918634953xxxx:assumed-role/aliyunossdrsrole/*"		 
      		 ],
               "Resource":[
                  "acs:oss:*:111933544165xxxx:dest-bucket",          	
                  "acs:oss:*:111933544165xxxx:dest-bucket/*"
               ]
            }
         ]
      }
    4. [保存] をクリックします。

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

アカウント A のソースバケットからアカウント B の宛先バケットに KMS で暗号化されたオブジェクトをレプリケーションする場合は、アカウント B を使用して次の手順を実行します。

  1. KMS コンソールの [インスタンス管理] ページにログインします。宛先バケットと同じリージョンで KMS インスタンスを購入して有効にします。KMS インスタンスを購入する際は、[アクセス管理数量] が 2 以上であることを確認してください。他のパラメーターはデフォルト設定のままにします。詳細については、「KMS インスタンスの購入と有効化」をご参照ください。

    説明

    KMS で暗号化されたオブジェクトのクロスアカウントレプリケーションは KMS に依存します。この機能をサポートするリージョンは KMS によって制限されます。KMS がサポートするリージョンの詳細については、「ソフトウェアで保護されたキーをサポートするリージョンとエンドポイント」をご参照ください。

  2. KMS インスタンスでキーを作成します。キーの種類はデフォルト以外のキーである必要があります。ソフトウェアで保護されたキーを使用することをお勧めします。詳細については、「ソフトウェアで保護されたキーの作成」をご参照ください。

    説明

    キーが作成されたら、レプリケーションルールを作成するときに使用するために、[基本情報] セクションからキー ARN を記録します。

  3. 作成したキーにキーポリシーを設定します。キーポリシーを設定するときは、[他のアカウントユーザー] を選択し、上記の手順で作成したロール ARN を [他のアカウントユーザー] として指定します。詳細については、「キーポリシーの設定」をご参照ください。

    重要

    KMS で暗号化されたデータをクロスアカウントでレプリケーションするには、キーポリシーに少なくとも復号 (kms:Decrypt) とデータキーの生成 (kms:GenerateDataKey) の権限が含まれている必要があります。コンソールでキーポリシーを設定すると、これらの権限はデフォルトで含まれます。OpenAPI を使用してカスタムキーポリシーを設定する場合は、ポリシーに少なくとも kms:Decryptkms:GenerateDataKey の権限が含まれていることを確認してください。

手順

OSS コンソールの使用

アカウント A を使用して、ソースバケットの SRR ルールを作成します。

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

  2. バケット をクリックし、src-bucket をクリックします。

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

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

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

    セクション

    パラメーター

    説明

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

    ソースバケット

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

    ターゲットバケット

    [別のアカウントのバケットを指定] を選択し、宛先バケット名を手動で入力します。

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

    複製するオブジェクト

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

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

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

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

    データレプリケーション方法を選択します。

    説明

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

    • [追加/変更] (ディザスタリカバリに適用): OSS は、オブジェクトの作成および更新操作のみをソースバケットから宛先バケットにレプリケーションします。

      重要

      このレプリケーションポリシーが適用されると、ポリシーが有効になった後にアップロードまたは更新されたオブジェクトのみが宛先バケットにレプリケーションされ、ソースバケットから削除されたオブジェクトは宛先バケットから削除されません。このポリシーは、ソースバケットでの手動削除またはライフサイクルポリシーによってトリガーされる自動削除による宛先バケットでのデータ損失を効果的に防ぎます。

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

      重要

      新しくアップロードおよび更新されたオブジェクトのレプリケーションに加えて、このレプリケーションポリシーには削除のレプリケーションが含まれており、データの整合性を保証します。このポリシーは、複数のユーザーまたはアプリケーションが同じデータセットを共有およびアクセスする必要があるシナリオに適用できます。手動またはライフサイクルポリシーによってソースバケットから削除されたオブジェクトは、宛先バケットからも削除されます。オブジェクトは削除されると回復できません。

    オブジェクトがマルチパートアップロードを使用してソースバケットにアップロードされた場合、各パートのアップロード操作は宛先バケットにレプリケーションされます。すべてのパートで CompleteMultipartUpload 操作が実行された後に生成される最終的なオブジェクトも、宛先バケットにレプリケーションされます。

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

    既存データの複製

    SRR ルールが有効になる前にソースバケットに既に存在する既存データをレプリケーションするかどうかを選択します。

    • [レプリケーション]: 既存データを宛先バケットにレプリケーションします。

      重要

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

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

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

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

    • [レプリケーション]: ソースオブジェクトまたは宛先バケットが KMS 管理キー (SSE-KMS、指定された CMK ID を使用) を使用して暗号化されている場合に、オブジェクトを宛先バケットにレプリケーションするには、このオプションを選択します。このオプションを選択した後、KMS キーも指定する必要があります。

      説明

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

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

    使用する KMS キー

    KMS キー ARN を入力します。KMS キー ARN の取得方法の詳細については、「KMS インスタンスでキーを作成する」をご参照ください。

    RAM ロール

    ドロップダウンリストから、ステップ 1 で作成したロールを選択します。

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

    • SRR ルールが作成された後、それを編集または削除することはできません。

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

    • バケット間の SRR は非同期プロセスです。データを宛先バケットにレプリケーションするのにかかる時間は、データサイズによって異なり、通常は数分から数時間です。

Alibaba Cloud SDK の使用

クロスアカウント SRR は、Java、Python、Go のソフトウェア開発キット (SDK) でのみサポートされています。

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();
        // ソースバケット名を指定します。例: src-bucket。
        String bucketName = "src-bucket";
        // データをレプリケーションする宛先バケットを指定します。宛先バケットは、ソースバケットとは異なるアカウントに属している必要があります。
        String targetBucketName = "dest-bucket";
        // 宛先バケットが配置されているリージョンを指定します。宛先バケットは、ソースバケットと同じリージョンにある必要があります。
        String targetBucketLocation = "oss-cn-hangzhou";

        // 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 にデータのレプリケーションを許可するロールの名前を指定します。このロールには、ソースバケットで SRR を実行し、宛先バケットでレプリケーションされたオブジェクトを受信する権限が付与されている必要があります。
            request.setSyncRole("yourRole");           
            //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-hangzhou',
    # OSS にデータのレプリケーションを許可するロールの名前を指定します。このロールには、ソースバケットで SRR を実行し、宛先バケットでレプリケーションされたオブジェクトを受信する権限が付与されている必要があります。
    sync_role_name='yourRole',
)

# レプリケーションするオブジェクトのプレフィックスを指定します。プレフィックスを指定すると、プレフィックスに一致するオブジェクトのみが宛先バケットにレプリケーションされます。
# prefix_list = ['prefix1', 'prefix2']
# データレプリケーションルールを設定します。
# replica_config = ReplicationRule(
     # prefix_list=prefix_list,
     # オブジェクトの作成および更新操作をソースバケットから宛先バケットにレプリケーションします。
     # action_list=[ReplicationRule.PUT],
     # データをレプリケーションする宛先バケットを指定します。宛先バケットは、ソースバケットとは異なるアカウントに属している必要があります。
     # target_bucket_name='dest-bucket',
     # 宛先バケットが配置されているリージョンを指定します。宛先バケットは、ソースバケットと同じリージョンにある必要があります。
     # target_bucket_location='oss-cn-hangzhou',
     # デフォルトでは、既存データがレプリケーションされます。この例では、値を False に設定して、既存データのレプリケーションを無効にします。
     # is_enable_historical_object_replication=False,      
  #)

# データレプリケーションを有効にします。
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 インスタンスを作成します。
    // yourEndpoint をバケットのエンドポイントに置き換えます。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを 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"    
    prefixSet := oss.ReplicationRulePrefix{Prefix: []*string{&prefix1, &prefix2}}
    
    reqReplication := oss.PutBucketReplication{
    Rule: []oss.ReplicationRule{
    {
    PrefixSet: &prefixSet,
    //オブジェクトの作成および更新操作をソースバケットから宛先バケットにレプリケーションします。
    Action: "PUT",    
    Destination: &oss.ReplicationRuleDestination{
    Bucket: destBucketName,
    // 宛先バケットが配置されているリージョンを指定します。ソースバケットと宛先バケットは同じリージョンにある必要があります。    
    Location: "oss-cn-hangzhou",    
    },
    // デフォルトでは、既存データがレプリケーションされます。この例では、値を disabled に設定して、既存データのレプリケーションを無効にします。
    HistoricalObjectReplication: "disabled",
    // OSS にデータのレプリケーションを許可するロールの名前を指定します。このロールには、ソースバケットでクロスアカウント SRR を実行し、宛先バケットでレプリケーションされたオブジェクトを受信する権限が付与されている必要があります。
    SyncRole:                    "yourRole",    
    },
    },
    }

    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」をご参照ください。

REST API の使用

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

リファレンス