アカウント間のクロスリージョンレプリケーション (CRR) により、Alibaba Cloudアカウントa内のリージョンのバケットからAlibaba CloudアカウントB内の別のリージョンの別のバケットへのObject Storage Service (OSS) オブジェクトの自動および非同期 (ほぼリアルタイム) レプリケーションが可能になります。アカウント間のCRRは、オブジェクトの作成、上書き、削除などの操作をソースバケットから宛先バケットにレプリケートします。 このトピックでは、アカウント間でCRRを実行する方法について説明します。
前提条件
CRRタスクのソースバケットとして機能するバケットAは、アカウントa内のリージョンに作成され、アカウントaのUID、バケットAの名前、およびバケットAが配置されているリージョンが記録されます。
CRRタスクの宛先バケットとして機能するバケットBは、アカウントB内の別のリージョンに作成され、アカウントBのUID、バケットBの名前、およびバケットBが配置されているリージョンが記録されます。
ロール権限付与
クロスアカウントレプリケーション
クロスアカウントレプリケーションには、2つのAlibaba Cloudアカウント内のバケットが含まれます。 次の手順に従って、RAMロールの信頼ポリシーと最低レベルの権限を設定する必要があります。
アカウントAを使用して、次の操作を実行します。
通常のサービスロールを作成します。
重要RAMユーザーを使用してRAMロールを作成できます。 RAMユーザーには、
ram:CreateRole
、ram:GetRole
、ram:ListPoliciesForRole
、およびram:AttachPolicyToRole
の権限が必要です。 ただし、RAMユーザーにram:CreateRole
やram:GetRole
などの権限を付与することは危険です。 RAMユーザーが関連付けられているAlibaba Cloudアカウントを使用して、RAMロールを作成し、RAMロールに必要な権限を付与できます。 これにより、RAMユーザーはAlibaba Cloudアカウントによって作成されたRAMロールを引き受けることができます。ロールを作成するときは、[信頼できるエンティティの選択] を [Alibaba Cloud Service] に、ロールタイプを [通常のサービスロール] に、[信頼できるサービスの選択] を [OSS] に設定します。 詳細については、「通常のサービスロールの作成」をご参照ください。
説明RAMロールが作成された後、[基本情報] セクションにRAMロールのAlibaba Cloud Resource Name (ARN) を記録し、その後の権限付与を行います。
RAMロールに、ソースバケットでCRRを実行する権限を付与します。
次のいずれかの方法を使用して、RAMロールに権限を付与できます。
必要なシステムポリシーをRAMロールにアタッチ
警告AliyunOSSFullAccess
システムポリシーをRAMロールにアタッチします。AliyunOSSFullAccess
システムポリシーがアタッチされているRAMロールには、現在のAlibaba Cloudアカウント内のすべてのバケットですべての操作を実行する権限があります。 システムポリシーをRAMロールにアタッチするときは、注意して続行してください。RAMロールへのカスタムポリシーのアタッチ
RAMポリシーを使用して、ソースバケットでCRRを実行するために必要な最小限の権限を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ロールへの権限の付与」をご参照ください。
アカウントBを使用して、移行先バケットにレプリケートするオブジェクトを受け取る権限をRAMロールに付与します。
方法1 :( 推奨) GUIで追加
OSSコンソールにログインします。
左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、
dest-bucket
という名前のバケットを見つけて、バケット名をクリックします。左側のナビゲーションツリーで、権限管理 > バケット承認ポリシー を選択します。
バケット承認ポリシー タブで、GUI で追加 をクリックし、レプリケーションオブジェクトの受信 をクリックします。
レプリケーションオブジェクトの受信パネルで、UID および RAM ロールの取得方法 を [レプリケーションのソースRAMロールARN] に設定し、手順1で作成したRAMロールのARNを ソースから RAM ロールの ARN をコピーする に選択します。
ポリシーの生成 をクリックします。
方法2: 構文による追加
左側のナビゲーションツリーで、権限管理 > バケット承認ポリシー を選択します。
バケット承認ポリシー タブで、構文で追加 をクリックし、[編集] をクリックします。
コードエディターで、次のバケットポリシーを入力します。
重要ポリシーステートメントを指定してバケットポリシーを設定し、RAM ロールに必要な権限を付与すると、新しいバケットポリシーによって既存のバケットポリシーが上書きされます。 新しいバケットポリシーに既存のバケットポリシーの内容が含まれていることを確認してください。 含まれていない場合、既存のバケットポリシーの承認に失敗する可能性があります。
カスタムロール名を、ビジネス要件に基づいて作成したロールの名前に置き換えます。 作成したロール名に大文字が含まれている場合は、小文字に変換する必要があります。 たとえば、作成したロール名がAliyunOssDrsRoleの場合、AliyunOssDrsRoleをaliyunossdrsroleに変換する必要があります。 次の例では、宛先バケットの名前はdest-bucket、ソースバケットが属するアカウントのUIDは137918634953xxxx、宛先バケットが属するアカウントのUIDは111933544165xxxxです。
{ "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/*" ] } ] }
[保存] をクリックします。 表示されたメッセージボックスで [OK] をクリックします。
KMSに基づいて暗号化されたオブジェクトの複製
KMSに基づいて暗号化されたオブジェクトは、中国 (杭州) 、中国 (上海) 、中国 (深セン) 、中国 (河源) 、中国 (広州) 、中国 (青島) 、中国 (北京) 、中国 (張家口) 、中国 (Hohhot) 、中国 (Ulanqab) 、中国 (成都) 、中国東部2金融、中国 (香港) 、シンガポール (シンガポール) 、マレーシア (クアラルンプール) 、インドネシア (ジャカルタ) 、フィリピン (マニラ) 、タイ (バンコク) 、日本 (東京) 、米国 (シリコンバレー) 、米国 (バージニア) 、ドイツ (フランクフルト) 、英国 (ロンドン) 。
KMSに基づいて暗号化されたオブジェクトをAlibaba CloudアカウントA内のソースバケットからAlibaba CloudアカウントB内のターゲットバケットにレプリケートするには、ターゲットバケットが属するアカウントBを使用して次の手順を実行します。
KMSコンソールにログインします。 左側のナビゲーションウィンドウで、[リソース]> [インスタンス] を選択します。 [インスタンス] ページで、移行先バケットと同じリージョンにKMSインスタンスを作成して有効にします。 KMSインスタンスを作成するときは、アクセス管理数量パラメーターの値が2以上であることを確認してください。 他のパラメーターのデフォルト設定を保持します。 詳細については、「KMSインスタンスの購入と有効化」をご参照ください。
KMSインスタンスでキーを作成します。 キーのタイプをデフォルトにすることはできません。 ソフトウェアキーの使用を推奨します。 詳細については、「ソフトウェア保護キー」をご参照ください。
説明キーを作成した後、[基本情報] セクションにキーのARNを記録して、レプリケーションルールを後で設定します。
キーのポリシーを設定します。 キーポリシーを設定するときは、[Cross-account User] を前の手順で作成したロールのARNに設定します。 詳細については、「キーポリシーの設定」をご参照ください。
重要アカウント間でSSE-KMSによって暗号化されたオブジェクトを複製するには、キーポリシーに少なくとも
kms:Decrypt
およびkms:GenerateDataKey
権限が必要です。 KMSコンソールでキーポリシーを設定すると、前述の権限がデフォルトで追加されます。 API操作を呼び出してカスタムキーポリシーを設定する場合は、ポリシーに少なくともkms:Decrypt
およびkms:GenerateDataKey
権限があることを確認してください。
手続き
OSSコンソールの使用
アカウントaを使用して、ソースバケットのCRRルールを作成します。
OSSコンソールにログインします。
左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、ソースバケットの名前をクリックします。
左側のナビゲーションツリーで、データ管理 > クロスリージョンレプリケーションを選択します。
クロスリージョンレプリケーションタブで、クロスリージョンレプリケーションをクリックします。
クロスリージョンレプリケーションパネルで、パラメーターを設定します。 下表にパラメーターを示します。
セクション
パラメーター
説明
ターゲットバケットの設定
ソースバケット
ソースバケットのリージョンと名前が表示されます。 パラメーターを指定する必要はありません。
ターゲットバケット
[別のAlibaba Cloudアカウントに属するバケットを指定する] を選択し、[リージョン] ドロップダウンリストからリージョンを選択して、宛先バケットの名前を入力します。
レプリケーションポリシーの設定
複製するオブジェクト
宛先バケットにレプリケートするオブジェクトを選択します。 有効な値:
ソースバケット内のすべてのオブジェクト: OSSは、ソースバケットから宛先バケットにすべてのオブジェクトをレプリケートします。
指定されたプレフィックスを持つオブジェクト: OSSは、名前に特定のプレフィックスを含むオブジェクトをソースバケットから宛先バケットに複製します。 プレフィックスは最大10個まで指定できます。
レプリケーションポリシー
データ複製モードを設定します。 有効な値:
説明データレプリケーションルールを作成した後、ライフサイクルルールまたはCopyObject操作が原因で、オブジェクトのx-oss-last-access-time属性の変更と、ソースバケット内のオブジェクトのストレージクラス変換は、ターゲットバケットと同期されません。
追加 /変更 (ディザスタリカバリに適用): OSSは、オブジェクトの作成および更新操作のみをソースバケットから宛先バケットにレプリケートします。
重要このレプリケーションポリシーが適用されると、ポリシーが有効になった後にアップロードまたは更新されたオブジェクトのみが宛先バケットにレプリケートされ、ソースバケットから削除されたオブジェクトは宛先バケットから削除されません。 このポリシーは、ソースバケットのライフサイクルポリシーによってトリガーされる手動削除または自動削除による宛先バケットのデータ損失を効果的に防止します。
追加 /削除 /変更 (複数のユーザーまたはアプリケーションが同じデータセットを共有およびアクセスする必要があるシナリオに適用されます): OSSは、オブジェクトの作成、更新、および削除操作をソースバケットから宛先バケットにレプリケートします。
重要このレプリケーションポリシーには、新しくアップロードおよび更新されたオブジェクトのレプリケーションに加えて、データの一貫性を保証する削除のレプリケーションが含まれます。 このポリシーは、複数のユーザーまたはアプリケーションが同じデータセットを共有してアクセスする必要があるシナリオに適用できます。 手動またはライフサイクルポリシーを使用してソースバケットから削除されたオブジェクトも、宛先バケットから削除されます。 オブジェクトは削除後に復元できません。
マルチパートアップロードを実行してオブジェクトをソースバケットにアップロードする場合、アップロードされた各パーツはターゲットバケットにレプリケートされます。 CompleteMultipartUpload操作を呼び出して取得した完全なオブジェクトも、ターゲットバケットにレプリケートされます。
詳細については、「バージョン管理でのデータレプリケーションの使用」をご参照ください。
既存データの複製
履歴データ (CRRを有効にする前にソースバケットに存在するデータ) をターゲットバケットにレプリケートするかどうかを指定します。
Yes: 履歴データが宛先バケットにレプリケートされます。
重要履歴データがレプリケートされると、ソースバケットからレプリケートされたオブジェクトは、宛先バケット内の同じ名前を持つオブジェクトを上書きする可能性があります。 データの損失を防ぐために、ソースバケットとターゲットバケットのバージョン管理を有効にすることを推奨します。
いいえ: OSSは、CRRルールが宛先バケットに有効になった後にアップロードまたは更新されたオブジェクトのみをレプリケートします。
KMSに基づいて暗号化されたオブジェクトの複製
KMSに基づいて暗号化されたオブジェクトをソースバケットから宛先バケットに複製するかどうかを指定します。 有効な値:
はい: KMSベースの暗号化が移行先バケットまたは移行元バケット内のオブジェクトに設定されている場合、オブジェクトは移行先バケットにレプリケートされます。 KMSに基づいて暗号化されたオブジェクトの複製をはいに設定した場合、CMK IDパラメーターを指定する必要があります。
説明HeadObject操作を呼び出して、ソースバケット内のオブジェクトの暗号化ルールを照会し、GetBucketEncryption操作を呼び出して、ターゲットバケットの暗号化ルールを照会します。
いいえ: KMSに基づいて暗号化されたオブジェクトは、宛先バケットにレプリケートされません。
CMK ID
KMSキーのARNを指定します。 KMSキーのARNを取得する方法の詳細については、「KMSインスタンスでのキーの作成」をご参照ください。
RAMロール名
手順1で作成したRAMロールをドロップダウンリストから選択します。
アクセラレーションタイプ
トランスミッション加速は、ソースバケットと宛先バケットがそれぞれ中国本土のリージョンと中国本土以外のリージョンにある場合にのみサポートされます。
転送アクセラレーションを有効にすると、転送アクセラレーション料金が課金されます。 詳細については、「転送アクセラレーション料金」をご参照ください。
RTC
説明RTCは、中国 (杭州) 、中国 (上海) 、中国 (青島) 、中国 (北京) 、中国 (張家口) 、中国 (深セン) の各リージョンでご利用いただけます。
RTCは、米国 (シリコンバレー) および米国 (バージニア) のリージョンでご利用いただけます。
レプリケーション時間制御 (RTC) を有効にすると、OSSはOSSにアップロードしたほとんどのオブジェクトを数秒以内にレプリケートし、99.99% のオブジェクトを10分以内にレプリケートします。 詳細は、「RTC」をご参照ください。 RTCを有効にすると課金されます。 詳細については、「RTCトラフィック料金」をご参照ください。
[OK] をクリックします。 表示されるメッセージで、有効化 をクリックします。
CRRルールを設定した後、ルールを変更または削除することはできません。
CRRルールを設定した後、レプリケーションタスクは3〜5分で開始されます。 レプリケーションの進行状況は、ソースバケットの クロスリージョンレプリケーション タブで確認できます。
CRRでは、データは非同期的に複製される。 ソースバケットから宛先バケットにデータをレプリケートするのに必要な期間は、データの量によって異なります。 期間は、数分から数時間の範囲であり得る。
OSS SDKの使用
アカウント間のCRRは、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. As a result, the security of all resources in your account is compromised. 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 source and destination buckets must be located in different regions.
String targetBucketLocation = "oss-cn-shanghai";
// 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 role must have the permissions to perform CRR 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 different regions.
target_bucket_location='oss-cn-shanghai',
# Specify the name of the RAM role that you want OSS to use to replicate data. The role must have the permissions to perform CRR on the source bucket and receive replicated objects in the destination bucket.
sync_role_name='roleNameTest',
)
# Specify the prefixes that are contained in the names of the objects that you want to replicate.
# prefix_list = ['prefix1', 'prefix2']
# Configure 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.P],
# 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 different regions.
# target_bucket_location='yourTargetBucketLocation',
# 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,
# Specify the link that you want to use to transfer data during data replication.
# target_transfer_type='oss_acc',
#)
# 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.
// 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}}
// Enable the RTC feature.
enabled := "enabled"
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",
RTC: &enabled,
Destination: &oss.ReplicationRuleDestination{
Bucket: destBucketName,
// Specify the region in which the destination bucket is located. The source bucket and destination bucket must be located in different regions.
Location: "oss-cn-hangzhou",
// Specify the link that you want to use to transfer data during data replication. In this example, this parameter is set to oss_acc, which indicates that the link used for transfer acceleration is used.
TransferType: "oss_acc",
},
// 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 role must have the permissions to perform CRR 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を使用してアカウント間でCRRを実行する方法の詳細については、「レプリケーション」をご参照ください。
OSS APIの使用
ビジネスで高度なカスタマイズが必要な場合は、OSS RESTful APIを直接呼び出すことができます。 APIを直接呼び出すには、コードに署名計算を含める必要があります。 詳細については、「PutBucketReplication」をご参照ください。