アカウント間のクロスリージョンレプリケーション (CRR) により、Alibaba Cloudアカウント内のリージョンのバケットから別のAlibaba Cloudアカウント内の別のリージョンの別のバケットへのObject Storage Service (OSS) オブジェクトの自動および非同期 (ほぼリアルタイム) レプリケーションが可能になります。 アカウント間のCRRは、オブジェクトの作成、上書き、削除などの操作をソースバケットから宛先バケットにレプリケートします。 このトピックでは、アカウント間でCRRを実行する方法について説明します。
前提条件
CRRタスクのソースバケットとして機能するバケットAは、アカウントa内のリージョンに作成され、アカウントAのUID、バケットAの名前、およびバケットAが配置されているリージョンが記録されます。
CRRタスクの宛先バケットとして機能するバケットBは、アカウントB内の別のリージョンに作成され、アカウントBのUID、バケットBの名前、およびバケットBが配置されているリージョンが記録されます。
手順
OSSコンソールの使用
アカウント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サービス] に、ロールタイプを [通常のサービスロール] に、[信頼できるサービスの選択] を [OSS] に設定します。 詳細については、「通常のサービスロールの作成」をご参照ください。
RAMロールに、ソースバケットでCRRを実行する権限を付与します。
次のいずれかの方法を使用して、RAMロールに権限を付与できます。
必要なシステムポリシーをRAMロールにアタッチ
警告AliyunOSSFullAccess
システムポリシーをRAMロールにアタッチします。AliyunOSSFullAccess
システムポリシーがアタッチされているRAMロールには、現在のAlibaba Cloudアカウント内のすべてのバケットですべての操作を実行する権限があります。 システムポリシーをRAMロールにアタッチするときは注意してください。詳細については、「RAMロールへの権限の付与」をご参照ください。
RAMロールへのカスタムポリシーのアタッチ
RAMポリシーを使用して、ソースバケットでCRRを実行するために必要な最小限の権限をRAMロールに付与できます。
説明ビジネス要件に基づいて、src-bucketをソースバケットの名前に置き換えます。
{ "バージョン":"1" 、 "ステートメント":[ { "効果":"許可" 、 "Action":[ "oss:ReplicateList" 、 "oss:ReplicateGet" ], "Resource":[ "acs:oss:*:*:src-bucket" 、 "acs:oss:*:*:src-bucket/*" ] } ] }
詳細については、「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です。
{ "バージョン":"1" 、 "ステートメント":[ { "効果":"許可" 、 "Action":[ "oss:ReplicateList" 、 "oss:ReplicateGet" 、 "oss:ReplicatePut" 、 "oss:ReplicateDelete" ], "プリンシパル": [ "arn:sts::137918634953xxxx:assumed-role/aliyunossdrsrole/*" ], "Resource":[ "acs:oss:*:111933544165xxxx::dest-bucket" 、 "acs:oss:*:111933544165xxxx::dest-bucket/*" ] } ] }
[保存] をクリックします。 表示されたメッセージボックスで [OK] をクリックします。
アカウントaを使用して、ソースバケットのCRRルールを作成します。
OSSコンソールにログインします。
左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、ソースバケットの名前をクリックします。
左側のナビゲーションツリーで、データ管理 > クロスリージョンレプリケーション を選択します。
クロスリージョンレプリケーション タブで、クロスリージョンレプリケーション をクリックします。
クロスリージョンレプリケーションパネルで、パラメーターを設定します。 下表にパラメーターを示します。
セクション
パラメーター
説明
複製先バケットの設定
ソースバケット
ソースバケットのリージョンと名前が表示されます。
複製先バケット
[別のAlibaba Cloudアカウントに属するバケットを指定する] を選択し、[リージョン] ドロップダウンリストからリージョンを選択して、宛先バケットの名前を入力します。
レプリケーションポリシーの設定
複製するオブジェクト
宛先バケットにレプリケートするオブジェクトを選択します。 有効な値:
ソースバケット内のすべてのオブジェクト: OSSは、ソースバケットから宛先バケットにすべてのオブジェクトをレプリケートします。
指定されたプレフィックスを持つオブジェクト: OSSは、名前に特定のプレフィックスを含むオブジェクトをソースバケットから宛先バケットに複製します。 プレフィックスは最大10個まで指定できます。
レプリケーションポリシー
データ複製モードを設定します。 有効な値:
追加 /変更: OSSは、オブジェクトの作成および更新操作のみをソースバケットから宛先バケットにレプリケートします。
追加 /削除 /変更: OSSは、オブジェクトの作成、更新、および削除操作をソースバケットから宛先バケットにレプリケートします。
マルチパートアップロードを実行してオブジェクトをソースバケットにアップロードする場合、アップロードされた各パーツはターゲットバケットにレプリケートされます。 CompleteMultipartUpload操作を呼び出して取得した完全なオブジェクトも、ターゲットバケットにレプリケートされます。
詳細については、「バージョン管理でのデータレプリケーションの使用」をご参照ください。
過去データの複製
履歴データ (CRRを有効にする前にソースバケットに存在するデータ) をターゲットバケットにレプリケートするかどうかを指定します。
Yes: 履歴データが宛先バケットにレプリケートされます。
重要履歴データがレプリケートされると、ソースバケットからレプリケートされたオブジェクトは、宛先バケット内の同じ名前を持つオブジェクトを上書きする可能性があります。 データの損失を防ぐために、ソースバケットとターゲットバケットのバージョン管理を有効にすることを推奨します。
いいえ: OSSは、CRRルールが宛先バケットに有効になった後にアップロードまたは更新されたオブジェクトのみをレプリケートします。
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
com.aliyun.oss.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。com.aliyun.oss.mo del.AddBucketReplicationRequestをインポートします。public classデモ {
public static void main(String[] args) throws Exception {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// プロジェクトコードにアクセス資格情報を保存しないことをお勧めします。 そうしないと、アクセス資格情報が漏洩する可能性があります。 その結果、アカウント内のすべてのリソースのセキュリティが侵害されます。 この例では、アクセス資格情報は環境変数から取得されます。 サンプルコードを実行する前に、環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// ソースバケットの名前を指定します。 例: src-bucket.
String bucketName = "src-bucket";
// 宛先バケットの名前を指定します。 ソースバケットと宛先バケットは、異なるAlibaba Cloudアカウントに属している必要があります。
String targetBucketName = "dest-bucket";
// 宛先バケットが配置されているリージョンを指定します。 ソースバケットと宛先バケットは、異なるリージョンに配置する必要があります。
文字列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);
// 履歴データを複製するかどうかを指定します。 デフォルトでは、履歴データはレプリケートされます。 この例では、このパラメーターはfalseに設定され、履歴データがレプリケートされないことを示します。
request.setEnableHistoricalObjectReplication(false);
// OSSがデータの複製に使用するRAMロールの名前を指定します。 ロールには、ソースバケットでCRRを実行し、宛先バケットでレプリケートされたオブジェクトを受け取る権限が必要です。
request.setSyncRole("yourRole");
// リストプレフィックス=新しいArrayList();
// prefixes.add("image/");
// prefixes.add("ビデオ");
// prefixes.add("a");
// プレフィックス。add("A");
// 複製するオブジェクトの名前に含まれるプレフィックスを指定します。 プレフィックスを指定すると、名前にプレフィックスの1つが含まれているオブジェクトのみが宛先バケットにレプリケートされます。
// request.setObjectPrefixList (プレフィックス);
// リストアクション=新しいArrayList();
// actions.add(AddBucketReplicationRequest.ReplicationAction.ALL);
// 宛先バケットにレプリケートする操作を指定します。 デフォルト値は ALL です。 これは、ソースバケット内のオブジェクトに対して実行されたすべての操作が宛先バケットにレプリケートされることを示します。
// request.setReplicationActionList (アクション);
ossClient.addBucketReplication(request);
} catch (Exception e) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "しかし、何らかの理由でエラー応答で拒否されました。");
System.out.println("エラーメッセージ:" + oe.getErrorMessage());
System.out.println("エラーコード:" + oe.getErrorCode());
System.out.println("リクエストID:" + oe.getRequestId());
System.out.println("ホストID:" + oe.getHostId());
} catch (ClientException e) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ 「ネットワークにアクセスできないなど」;
System.out.println("エラーメッセージ:" + ce.getMessage());
} 最後に{
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
Python
# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
oss2.modelsから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 ()
# 宛先バケットの名前を指定します。 ソースバケットと宛先バケットは、異なるAlibaba Cloudアカウントに属している必要があります。
target_bucket_name='dest-bucket' 、
# 宛先バケットが配置されているリージョンを指定します。 ソースバケットと宛先バケットは、異なるリージョンに配置する必要があります。
target_bucket_location='oss-cn-shanghai '、
# OSSでデータの複製に使用するRAMロールの名前を指定します。 ロールには、ソースバケットでCRRを実行し、宛先バケットでレプリケートされたオブジェクトを受け取る権限が必要です。
sync_role_name='roleNameTest' 、)
# レプリケートするオブジェクトの名前に含まれるプレフィックスを指定します。 プレフィックスを指定すると、名前にプレフィックスの1つが含まれているオブジェクトのみが宛先バケットにレプリケートされます。
# prefix_list = ['prefix1', 'prefix2']
# データ複製ルールを指定します。
# replica_config = ReplicationRule (
# prefix_list=prefix_list,
# 宛先バケットにレプリケートする操作を指定します。 デフォルト値は ALL です。 これは、ソースバケット内のオブジェクトに対して実行されたすべての操作が宛先バケットにレプリケートされることを示します。
# action_list=[ReplicationRule.ALL] 、
# 宛先バケットの名前を指定します。 ソースバケットと宛先バケットは、異なるAlibaba Cloudアカウントに属している必要があります。
# 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)
行く
パッケージメイン
import (import (import)
"encoding/xml"
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
func HandleError (エラーエラー) {
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)
}
// Create an OSSClient instance.
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを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"
// 宛先バケットの名前を指定します。 ソースバケットと宛先バケットは、異なるAlibaba Cloudアカウントに属している必要があります。
destBucketName := "yourDestBucket"
// レプリケートするオブジェクトの名前に含まれるprefix_1とprefix_2のプレフィックスを指定します。 プレフィックスを指定すると、名前にプレフィックスの1つが含まれているオブジェクトのみが宛先バケットにレプリケートされます。
// すべてのオブジェクトをソースバケットから宛先バケットにレプリケートするには、プレフィックスを指定しないでください。
prefix1 := "prefix_1"
prefix2 := "prefix_2"
prefixSet := oss.ReplicationRulePrefix{Prefix: []* string{&prefix1, &prefix2}}
// RTC機能を有効にします。
enabled := "enabled"
reqReplication := oss.PutBucketReplication {
ルール: []oss.ReplicationRule {
{
PrefixSet: &prefixSet、
// 宛先バケットにレプリケートする操作を指定します。 デフォルト値は ALL です。 これは、ソースバケット内のオブジェクトに対して実行されたすべての操作が宛先バケットにレプリケートされることを示します。
アクション: "ALL" 、
RTC: &有効、
宛先: &oss.ReplicationRuleDestination {
バケット: destBucketName、
// 宛先バケットが配置されているリージョンを指定します。 ソースバケットと宛先バケットは、異なるリージョンに配置する必要があります。
ロケーション: "oss-cn-hangzhou" 、
// データレプリケーション中にデータの転送に使用するリンクを指定します。 この例では、このパラメーターはoss_accに設定されています。これは、転送アクセラレーションに使用されるリンクが使用されることを示します。
TransferType: "oss_acc" 、
},
// 履歴データを複製するかどうかを指定します。 デフォルトでは、履歴データはレプリケートされます。 この例では、このパラメーターはdisabledに設定されています。これは、履歴データがレプリケートされないことを示します。
HistoricalObjectReplication: "disabled" 、
// OSSがデータの複製に使用するRAMロールの名前を指定します。 ロールには、ソースバケットでCRRを実行し、宛先バケットでレプリケートされたオブジェクトを受け取る権限が必要です。
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 APIを直接呼び出すことができます。 APIを直接呼び出すには、コードに署名計算を含める必要があります。 詳細については、「PutBucketReplication」をご参照ください。