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

Object Storage Service:アカウント間のSRR

最終更新日:Dec 11, 2024

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

前提条件

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

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

アカウント間でSRRを実行するために使用するRAMロールへの権限の付与

異なるAlibaba Cloudアカウントに属する2つのバケットは、アカウント間のデータレプリケーションに必要です。 次の項目では、アカウント間のデータレプリケーションにRAMロールが必要とする信頼ポリシーと最小限の権限について説明します。

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

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

      重要

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

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

      説明

      RAMロールが作成された後、[基本情報] セクションにRAMロールのAlibaba Cloud Resource Name (ARN) を記録し、その後の権限付与を行います。

    2. ソースバケットでSRRを実行する権限をRAMロールに付与します。

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

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

      警告

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

      RAMロールへのカスタムポリシーのアタッチ

      RAMポリシーを使用して、ソースバケットでSRRを実行するために必要な最小限の権限をRAMロールに付与できます。

      説明

      ビジネス要件に基づいて、src-bucketをソースバケットの名前に置き換えます。

      {
         "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ロールにアタッチする必要があります。 システムポリシーをRAMロールにアタッチする方法の詳細については、「RAMロールへの権限の付与」をご参照ください。

  2. アカウントBを使用して、移行先バケットにレプリケートするオブジェクトを受け取る権限をRAMロールに付与します。

    方法1 :( 推奨) GUIで追加

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

    2. 左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、dest-bucketという名前のバケットを見つけ、バケットの名前をクリックします。

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

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

    5. レプリケーションオブジェクトの受信パネルで、UID および RAM ロールの取得方法[レプリケーションのソースRAMロールARN] に設定し、手順1で作成したRAMロールのARNを ソースから RAM ロールの ARN をコピーする に入力します。

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

    方法2: 構文による追加

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

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

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

      重要
      • ポリシーステートメントを指定してバケットポリシーを設定し、RAM ロールに必要な権限を付与すると、新しいバケットポリシーによって既存のバケットポリシーが上書きされます。 新しいバケットポリシーに既存のバケットポリシーの内容が含まれていることを確認してください。 含まれていない場合、既存のバケットポリシーの承認に失敗する可能性があります。

      • ロール名を、ビジネス要件に基づいて作成したRAMロールの名前に置き換えます。 作成したRAMロールの名前に大文字が含まれている場合は、小文字に変換する必要があります。 たとえば、作成したRAMロールの名前がAliyunOssDrsRoleの場合、AliyunOssDrsRoleをaliyunossdrsroleに変換する必要があります。 次の例では、宛先バケットの名前はdest-bucket、ソースバケットが属するアカウントのUIDは137918634953xxxx、宛先バケットが属するアカウントのUIDは111933544165xxxxです。 Alibaba CloudアカウントのIDが必要です。

      {
         "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. [保存] をクリックします。 表示されたメッセージボックスで [OK] をクリックします。

SSE-KMSを使用して暗号化されたオブジェクトをレプリケート

説明

KMSに基づいて暗号化されたオブジェクトは、中国 (杭州) 、中国 (上海) 、中国 (深セン) 、中国 (河源) 、中国 (広州) 、中国 (青島) 、中国 (北京) 、中国 (張家口) 、中国 (Hohhot) 、中国 (Ulanqab) 、中国 (成都) 、中国東部2金融、中国 (香港) 、シンガポール (シンガポール) 、マレーシア (クアラルンプール) 、インドネシア (ジャカルタ) 、フィリピン (マニラ) 、タイ (バンコク) 、日本 (東京) 、米国 (シリコンバレー) 、米国 (バージニア) 、ドイツ (フランクフルト) 、英国 (ロンドン) 。

SSE-KMSを使用して暗号化されたオブジェクトを、アカウントaに属するソースバケットからアカウントBに属する宛先バケットにコピーする場合は、アカウントBを使用して次の手順を実行します。

  1. KMSコンソールにログインします。 左側のナビゲーションウィンドウで、[リソース]> [インスタンス] を選択します。 [インスタンス] ページで、移行先バケットと同じリージョンにKMSインスタンスを作成して有効にします。 KMSインスタンスを作成するときは、アクセス管理数量パラメーターの値が2以上であることを確認してください。 他のパラメーターのデフォルト設定を保持します。 詳細については、「KMSインスタンスの購入と有効化」をご参照ください。

    説明

    SSE-KMSによって暗号化されたオブジェクトのクロスアカウントレプリケーションは、KMSに依存します。 サポートされるリージョンはKMSによって決定されます。 KMSでサポートされているリージョンの詳細については、「ソフトウェアキー管理」をご参照ください。

  2. KMSインスタンスでキーを作成します。 キータイプをデフォルトにすることはできません。 ソフトウェアキーの使用を推奨します。 詳細については、「ソフトウェア保護キー」をご参照ください。

    説明

    キーを作成した後、後続のレプリケーションルールを設定するために、[基本情報] セクションにキーのARNを記録します。

  3. キーのポリシーを設定します。 キーポリシーを設定するときは、[Cross-account User]前の手順で作成したロールのARNに設定します。 詳細については、「キーポリシーの設定」をご参照ください。

    重要

    アカウント間でSSE-KMSによって暗号化されたオブジェクトを複製するには、キーポリシーに少なくともkms:Decryptおよびkms:GenerateDataKey権限が必要です。 KMSコンソールでキーポリシーを設定すると、前述の権限がデフォルトで追加されます。 API操作を呼び出してカスタムキーポリシーを設定する場合は、ポリシーに少なくともkms:Decryptおよびkms:GenerateDataKey権限があることを確認してください。

方法

OSSコンソールの使用

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

  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ベースの暗号化が移行先バケットまたは移行元バケット内のオブジェクトに設定されている場合、オブジェクトは移行先バケットにレプリケートされます。 KMSに基づいて暗号化されたオブジェクトの複製をはいに設定した場合、CMK IDパラメーターを指定する必要があります。

      説明

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

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

    CMK ID

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

    RAMロール名

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

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

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

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

    • 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, which compromises the security of all resources in your account. 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. Example: src-bucket. 
        String bucketName = "src-bucket";
        // Specify the name of the destination bucket. The destination bucket and the source bucket must belong to different Alibaba Cloud accounts. 
        String targetBucketName = "dest-bucket";
        // Specify the region in which the destination bucket is located. The destination bucket and the source bucket 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");           
            //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 destination bucket and the source bucket must belong to different Alibaba Cloud accounts. 
    target_bucket_name='dest-bucket',
    # Specify the region in which the destination bucket is located. The destination bucket and the source bucket 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='yourRole',
)

# 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. The destination bucket and the source bucket must belong to different Alibaba Cloud accounts. 
     # target_bucket_name='dest-bucket',
     # Specify the region in which the destination bucket is located. The destination bucket and the source bucket must be located in the same region. 
     # target_bucket_location='oss-cn-hangzhou',
     # 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,      
  #)

# Enable data replication. 
bucket.put_bucket_replication(replica_config)

行く

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. The destination bucket and the source bucket must belong to different Alibaba Cloud accounts. 
    destBucketName := "yourDestBucket"
    // Specify that objects whose names contain one of the following prefixes are replicated to the destination bucket: prefix_1 and prefix_2. After you specify the prefixes, only objects whose names contain one of the prefixes are replicated to the destination bucket. 
    // To replicate all objects from the source bucket to the destination bucket, do not configure prefixes. 
    prefix1 := "prefix_1"
    prefix2 := "prefix_2"    
    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 bucket and the destination bucket 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",    
    },
    },
    }

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

関連ドキュメント