このトピックでは、Object Storage Service (OSS) でのクロスリージョンレプリケーション (CRR) や同一リージョンレプリケーション (SRR) など、クロスアカウントと同一アカウントのレプリケーションに関するよくある質問に対する回答を提供します。
データレプリケーションルールを作成できないのはなぜですか?
不十分な権限
同じアカウントのレプリケーション
同じアカウントのレプリケーションでは、RAMロールにソースバケットとターゲットバケットでレプリケーション操作を実行する権限を付与する必要があります。 RAMロールを作成し、RAMロールに権限を付与する方法の詳細については、「ロールの種類」をご参照ください。
クロスアカウントレプリケーション
クロスアカウントレプリケーションの場合、アカウントAを使用して、ソースバケット内のデータをレプリケートする権限をRAMロールに付与し、アカウントBを使用して、コピー先バケット内のレプリケートされたオブジェクトを受信する権限をRAMロールに付与する必要があります。 RAMロールを作成し、RAMロールに権限を付与する方法の詳細については、「手順」をご参照ください。
送信元バケットと送信先バケット間のバージョン管理ステータスの不一致
レプリケーションタスクのソースバケットと宛先バケットのバージョン管理ステータスは、バージョン管理が有効または非バージョン管理である必要があります。
無効なエンドポイントまたはAccessKeyペア
OSS SDKまたはossutilを使用してデータレプリケーションルールを作成する場合、次の設定を確認します。
ソースバケットと宛先バケットのエンドポイントが正しいかどうかを確認します。 詳細は、「リージョンとエンドポイント」をご参照ください。
AccessKeyペアが正しいかどうかを確認します。 詳細については、「RAMユーザーのAccessKeyペアに関する情報の表示」をご参照ください。
ソースバケット内のオブジェクトが宛先バケットにレプリケートされないのはなぜですか。
ソースバケットのデータレプリケーションルールを設定した後にオブジェクトがターゲットバケットにレプリケートされない場合、次の考えられる原因に基づいて問題をトラブルシューティングします。
レプリケーション完了時間
データは、ほぼリアルタイムで非同期的に複製される。 ソースバケットから宛先バケットにデータを複製するのに必要な時間は、データのサイズに基づいて数分から数時間の範囲であり得る。 複製するオブジェクトのサイズが大きい場合は、数分待ってから宛先バケットでオブジェクトのレプリカを確認します。
ソースバケット設定
データレプリケーションのステータスが有効かどうかを確認します。
レプリケートするオブジェクトの名前のプレフィックスが正しく設定されているかどうかを確認します。
名前に特定のプレフィックスを含むオブジェクトをソースバケットから宛先バケットにレプリケートするには、データレプリケーションルールでプレフィックスを指定します。 たとえば、データレプリケーションルールでログプレフィックスのみが指定されている場合、log/date1.txtやlog/date2.txtなど、ログプレフィックスを含む名前のオブジェクトのみがレプリケートされます。 date3.txtなど、名前にログプレフィックスが含まれていないオブジェクトはレプリケートされません。
ソースバケットからターゲットバケットにすべてのオブジェクトをレプリケートするには、プレフィックスを指定しないでください。
レプリケーション規則の制限
バケット内のオブジェクトがデータレプリケーションルールに基づいて作成されたレプリカである場合、オブジェクトを別のデータレプリケーションルールに基づいて宛先バケットにレプリケートすることはできません。 たとえば、バケットaからバケットBにオブジェクトをレプリケートするようにデータレプリケーションルールを設定し、バケットBからバケットCにオブジェクトをレプリケートするように別のレプリケーションルールを設定した場合、バケットAからバケットBにレプリケートされたオブジェクトはバケットBからバケットCにレプリケートされません。
KMS暗号化オブジェクト
ソースまたは宛先バケット内のオブジェクトに対してKey Management Service (KMS) ベースの暗号化が設定されている場合、KMSに基づいて暗号化されたオブジェクトの複製パラメーターをはいに設定し、次の図に示すパラメーターを設定して、KMSを使用して暗号化されたオブジェクトを複製します。
CMK ID: 宛先バケット内のオブジェクトの暗号化に使用されるカスタマーマスターキー (CMK) 。
CMKを使用して宛先バケットにレプリケートされるオブジェクトを暗号化する場合は、KMSコンソールの宛先バケットと同じリージョンにCMKを作成する必要があります。 詳細については、「CMKの作成」をご参照ください。
RAMロール名: ターゲットオブジェクトに対してKMSベースの暗号化を実行する権限を持つRAMロール。
新しいRAMロール: CMKを使用して宛先オブジェクトを暗号化するためのRAMロールが作成されます。 RAMロールは、
kms-replication-sourceBucketName-destinationBucketName
形式です。AliyunOSSRole: AliyunOSSRoleロールは、ターゲットオブジェクトに対してKMSベースの暗号化を実行するために使用されます。 AliyunOSSRoleロールが存在しない場合、このオプションを選択すると、OSSは自動的にAliyunOSSRoleロールを作成します。
説明RAMロールを作成する場合、または既存のRAMロールの権限を変更する場合は、必ず
AliyunOSSFullAccess
ポリシーをロールにアタッチしてください。 そうしないと、データの複製に失敗する可能性があります。
HeadObject操作を呼び出して、ソースバケット内のオブジェクトの暗号化ステータスを照会し、GetBucketEncryption操作を呼び出して、ターゲットバケットの暗号化ステータスを照会します。
ソースバケットと宛先バケット間のデータの整合性を確認するにはどうすればよいですか。
次のコードを実行して、レプリケーションタスクの完了後に、宛先バケットとソースバケット間のデータの整合性を確認できます。
com.aliyun.oss.OSSClientをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.mo delをインポートします。*;
com.aliyun.oss.OSSExceptionをインポートします。com.aliyuncs.exceptions.ClientExceptionをインポートします。public classデモ {
public static void main(String[] args) throws ClientException {
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// srcEndpointを、ソースバケットが配置されているリージョンのエンドポイントに設定します。
String srcEndpoint = "https://oss-cn-hangzhou.aliyuncs.com";
OSSClient srcClient = new OSSClient(srcEndpoint , credentialsProvider);
// ソースバケットの名前を指定します。
String srcBucketName = "src-replication-bucket";
// destEndpointを、宛先バケットが配置されているリージョンのエンドポイントに設定します。
文字列destEndpoint = "https://oss-cn-beijing.aliyuncs.com";
OSSClient destClient = new OSSClient(destEndpoint, credentialsProvider);
// 宛先バケットの名前を指定します。
文字列destBucketName = "dest-replication-bucket";
// ソースバケットとターゲットバケットがバージョン管理されていない場合は、listObjectsV2操作を呼び出して、ソースバケットからレプリケートされたオブジェクトを一覧表示します。
// ソースバケットとターゲットバケットのバージョン管理が有効または一時停止されている場合は、listVersions操作を呼び出して、ソースバケットからレプリケートされたオブジェクトを一覧表示します。
ListObjectsV2Resultの結果。
ListObjectsV2Request request = new ListObjectsV2Request(srcBucketName);
do {
result = srcClient.listObjectsV2 (リクエスト);
for (OSSObjectSummary summary : result.getObjectSummaries())
{
String objectName = summary.getKey();
ObjectMetadata srcMeta;
try {
// ソースバケットからレプリケートされたオブジェクトのメタデータを照会します。
srcMeta = srcClient.headObject(srcBucketName, objectName);
} catch (OSSException ossException) {
if (ossException.getErrorCode().equals("NoSuchKey")) {
continue;
} else {
System.out.println("head src-object failed: " + objectName);
}
continue;
}
ObjectMetadata destMeta;
try {
// 宛先バケット内の宛先オブジェクトのメタデータを照会します。
destMeta = destClient.headObject(destBucketName, objectName);
} catch (OSSException ossException) {
if (ossException.getErrorCode().equals("NoSuchKey")) {
System.out.println("dest-object not exist: " + objectName);
} else {
System.out.println("head dest-object failed: " + objectName);
}
continue;
}
// ソースオブジェクトのCRC-64値がターゲットオブジェクトの値と同じかどうかを確認します。
長いsrcCrc = srcMeta.getServerCRC();
文字列srcMd5 = srcMeta.getContentMD5();
if (srcCrc != null) {
if (destMeta.getServerCRC() != null) {
if (!destMeta.getServerCRC().equals(srcCrc)) {
System.out.println("crc not equal: " + objectName
+ "| srcCrc: " + srcCrc + "| destCrc: " + destMeta.getServerCRC());
}
continue;
}
}
// ソースオブジェクトのMD5値がターゲットオブジェクトのMD5値と同じかどうかを確認します。
if (srcMd5!= null) {
if (destMeta.getContentMD5() != null) {
if (!destMeta.getContentMD5().equals(srcMd5)) {
System.out.println("md5 not equal: " + objectName
+ "| srcMd5: " + srcMd5 + "| destMd5: " + destMeta.getContentMD5());
}
continue;
}
}
// ソースオブジェクトのETag値がターゲットオブジェクトのETag値と同じかどうかを確認します。
if (srcMeta.getETag() == null | | !srcMeta.getETag().equals(destMeta.getETag())) {
System.out.println("etag not equal: " + objectName)
+ "| srcEtag: " + srcMeta.getETag() + "| destEtag: " + destMeta.getETag());
}
}
request.setContinuationToken(result.getNextContinuationToken());
request.setStartAfter(result.getStartAfter());
} while (result.isTruncated());
}
}
OSSは連鎖レプリケーションをサポートしていますか?
OSSは連鎖レプリケーションをサポートしていません。 たとえば、データ複製ルールがバケットaからバケットBにデータを複製するように構成され、別のデータ複製ルールがバケットBからバケットCにデータを複製するように構成されている場合、バケットAのデータはバケットBにのみ複製され、バケットCには複製されません。
バケットAからバケットCにデータをレプリケートする場合は、バケットaからバケットCにデータをレプリケートするようにデータレプリケーションルールを設定する必要があります。
例外は、履歴データ複製がバケットAおよびバケットBに対して有効であり、履歴データ複製が進行中である場合、新たにバケットAに書き込まれたデータが履歴データ複製によって検出され、バケットCに複製され得ることである。
2つのバケット間の双方向同期は循環レプリケーションを引き起こしますか?
いいえ、双方向同期は循環レプリケーションを引き起こしません。 たとえば、バケットAとバケットBの間の双方向同期を設定した場合、バケットAからバケットBにレプリケートされたデータ (履歴データと増分データ) はバケットBからバケットAにレプリケートされません。同様に、バケットBからバケットAにレプリケートされたデータ (履歴データと増分データ) はバケットAからバケットBにレプリケートされません。
データレプリケーションルールは、ライフサイクルルールに基づくオブジェクトの削除をソースバケットから宛先バケットに同期させますか。
レプリケーションルールのレプリケーションポリシーの指定方法によって異なります。
レプリケーションポリシーを追加 /変更に設定した場合: ライフサイクルルールに基づいてソースバケットからオブジェクトが削除された場合、OSSはターゲットバケットからそのコピーを削除しません。
レプリケーションポリシーを追加 /削除 /変更に設定した場合: ライフサイクルルールに基づいてソースバケットからオブジェクトが削除されると、OSSはそれらのコピーを宛先バケットから削除します。
説明宛先バケットでは、ライフサイクルルールに基づいてソースバケットから削除されたオブジェクトと同じ名前のオブジェクトを見つけることができます。 これは、[追加 /削除 /変更] レプリケーションポリシーが有効にならないことを示すものではありません。 ソースバケットから削除されたオブジェクトと同じ名前のオブジェクトを、宛先バケットに手動で書き込むことができます。
履歴データのレプリケーションの進捗状況が長期間0% として表示されるのはなぜですか。
履歴データのレプリケーションの進行状況はリアルタイムで更新されません。 レプリケーションの進行状況は、すべてのオブジェクトがスキャンされるまで更新されません。 何億ものオブジェクトなど、大量のオブジェクトがソースバケットに格納されている場合、履歴データのレプリケーションの進行状況が更新されるまでに数時間かかります。 履歴データのレプリケーションの進行状況が更新されない場合、履歴データが宛先バケットにレプリケートされないことを意味するものではありません。
送信元バケットの履歴データが送信先バケットにレプリケートされているかどうかを確認するには、送信先バケットのストレージ容量と、受信トラフィックや送信トラフィックなどのトラフィック使用量を表示します。 詳細については、「バケットのリソース使用量の表示」をご参照ください。
バージョン管理が中断されたバケットはデータレプリケーションをサポートしますか?
いいえ、バージョン管理が中断されたバケットはデータレプリケーションをサポートしません。 データレプリケーションルールは、2つのバージョン管理されていないバケットまたは2つのバージョン管理が有効なバケット間でのみ設定できます。
宛先バケットがKMSを使用してデータを暗号化する場合、KMS暗号化に関連するAPI操作の呼び出しに対して課金されますか?
宛先バケットがKMSを使用してデータを暗号化する場合、KMS暗号化に関連するAPI操作の呼び出しに対して課金されます。 料金の詳細については、「KMSの課金」をご参照ください。
データレプリケーションルールを無効にできますか?
はい。データレプリケーションルールの横にある [レプリケーションの無効化] をクリックして、データレプリケーションルールを無効にできます。
データレプリケーションルールを無効にすると、レプリケートされたデータは宛先バケットに保存されます。 ソースバケット内の増分データは、宛先バケットにレプリケートされません。