このトピックでは、同一アカウント、アカウント間、同一リージョン、クロスリージョンのレプリケーションなど、データレプリケーションに関する一般的な問題とトラブルシューティング方法について説明します。
データレプリケーションルールを作成できないのはなぜですか?
必要な権限が付与されているか確認します。
RAM ユーザーに必要な権限がありません
コンソールで、RAM ユーザーが [OK] をクリックしてデータレプリケーションルールを作成できません。
原因: oss:PutBucketReplication 権限がありません。
解決策: RAM ユーザーに oss:PutBucketReplication 権限を付与します。
RAM ユーザーがコンソールでデータレプリケーションルールを作成する際、カスタム作成されたロールが権限付与ロールリストに表示されません。
原因: ram:ListRoles 権限がありません。
解決策: RAM ユーザーに ram:ListRoles 権限を付与します。
詳細については、「RAM ユーザーにカスタムアクセスポリシーを付与する」をご参照ください。
RAM ロールに必要な権限がありません
同一アカウント内のレプリケーション
同一アカウント内のレプリケーションでは、ソースバケットと宛先バケット間でレプリケーション操作を実行するためのロール権限を付与する必要があります。RAM ロールの作成と権限付与の方法の詳細については、「ロールタイプ」をご参照ください。
クロスアカウントレプリケーション
アカウント間のレプリケーションでは、アカウント A はソースバケットからデータをレプリケートする権限をロールに付与し、アカウント B は宛先バケットでレプリケートされたオブジェクトを受信する権限をロールに付与する必要があります。RAM ロールの作成と権限付与の詳細については、「ロールの権限付与」をご参照ください。
バケットのバージョン管理ステータスが一致しているか確認します。
ソースバケットと宛先バケットのバージョン管理ステータスは同じである必要があります。つまり、両方のバケットでバージョン管理が有効または無効のいずれかである必要があります。
エンドポイントまたは AccessKey 情報が正しいか確認します。
SDK または ossutil を使用してデータレプリケーションルールを作成する場合は、次の構成を確認します。
ソースバケットと宛先バケットが配置されているリージョンのエンドポイントが正しいか確認します。詳細については、「OSS のリージョンとエンドポイント」をご参照ください。
レプリケーション関係を確立するために使用される AccessKey が正しいか確認します。詳細については、「RAM ユーザーの AccessKey ペアを表示する」をご参照ください。
データが宛先バケットにレプリケートされないのはなぜですか?
ソースバケットにデータレプリケーションルールを設定した後、宛先バケットにオブジェクトのレプリカが表示されない場合は、以下の考えられる原因に基づいて問題をトラブルシューティングします。
ソースバケットが正しく設定されているか確認します。
データレプリケーションのステータスが [有効] になっているか確認します。
プレフィックスが正しいか確認します。
指定されたオブジェクトをレプリケートする: ソースバケットから指定されたオブジェクトのみをレプリケートするには、Prefix パラメーターをターゲットファイルのプレフィックスに設定します。たとえば、Prefix を log に設定すると、log/date1.txt や log/date2.txt など、名前が log で始まるオブジェクトのみがレプリケートされます。date3.txt など、指定されたプレフィックスに一致しないオブジェクトはレプリケートされません。
説明プレフィックスの末尾にアスタリスク (*) を使用したり、バケット名を含めたりすることはできません。
すべてのオブジェクトをレプリケートする: ソースバケットからすべてのオブジェクトをレプリケートするには、Prefix パラメーターを空のままにします。
既存データのレプリケーションが設定されているか、および既存ファイルが同期されていないかを確認します。
ソースバケット内のファイルが、同一リージョンまたはクロスリージョンレプリケーションを使用して別のバケットからレプリケートされているかどうかを確認します。
バケット内のオブジェクトが別のレプリケーションルールからのレプリカである場合、OSS はこのオブジェクトを再度レプリケートしません。たとえば、バケット A からバケット B へ、およびバケット B からバケット C へのレプリケーションを設定した場合、バケット A からのオブジェクトレプリカはバケット B からバケット C へはレプリケートされません。
ファイルが KMS を使用して暗号化されているかどうかを確認します。その場合は、[KMS で暗号化されたオブジェクトをレプリケートする] オプションを選択する必要があります。
ソースオブジェクトまたは宛先バケットが KMS 管理キーによるサーバー側暗号化 (SSE-KMS) で暗号化されており、カスタマーマスターキー (CMK) ID が指定されている場合は、[レプリケート] を選択し、次のパラメーターを設定する必要があります。

使用する KMS キー: 宛先オブジェクトの暗号化に使用する KMS キーを指定します。
まず、KMS プラットフォーム上の宛先バケットと同じリージョンに KMS キーを作成する必要があります。詳細については、「キーを作成する」をご参照ください。
権限付与ロール: 宛先オブジェクトに対して KMS 暗号化を実行する権限を持つ RAM ロール。
ロールの作成: KMS を使用して宛先オブジェクトを暗号化するための RAM ロールを作成します。ロール名は
kms-replication-SourceBucketName-DestinationBucketNameのフォーマットを使用する必要があります。AliyunOSSRole: KMS で宛先オブジェクトを暗号化するために使用されるロール。このロールが存在しない場合、このオプションを選択すると OSS が自動的に作成します。
説明ロールを作成したり、ロールの権限を変更したりする場合は、
AliyunOSSFullAccess権限がロールに付与されていることを確認してください。そうしないと、データレプリケーションが失敗する可能性があります。
HeadObject および GetBucketEncryption 操作を呼び出して、それぞれソースオブジェクトと宛先バケットの暗号化ステータスをクエリできます。
レプリケーションの進捗状況が 100% であるかどうかを確認します。
データレプリケーションは非同期であり、ほぼリアルタイムで行われます。データを宛先バケットにレプリケートするために必要な時間は、データサイズに応じて数分から数時間かかる場合があります。レプリケートするオブジェクトが大きい場合は、レプリケーションが完了するまで待ちます。データレプリケーションの進捗が 100% であることを確認した後、オブジェクトが宛先バケットにあるかどうかを確認します。
データが宛先バケットから同期的に削除されないのはなぜですか?
原因 1: 宛先バケットに WORM (Write-Once-Read-Many) 保持ポリシーが設定されている。
ポリシーで指定された保持期間が終了するまで、リソース所有者を含むどのユーザーもバケット内のオブジェクトを削除できません。
原因 2: データが宛先バケットから削除されるかどうかは、ソースバケットのバージョン管理ステータスと設定されたデータレプリケーションポリシーに依存します。
ソースバケットのバージョン管理ステータス
リクエストメソッド
データレプリケーションポリシー
結果
バージョン管理が無効
削除リクエストが開始される
作成/変更されたデータをレプリケート
ソースバケット内のオブジェクトのみが削除されます。宛先バケット内のオブジェクトは削除されません。
作成/削除/変更されたデータをレプリケート
ソースバケットと宛先バケットのオブジェクトが同期的に削除されます。
バージョン管理が有効
オブジェクトのバージョン ID を指定せずに削除リクエストが開始される
作成/変更されたデータをレプリケート
ソースバケットと宛先バケットのオブジェクトは削除されません。OSS はソースバケットに削除マーカーを作成し、その削除マーカーが宛先バケットにレプリケートされます。
作成/削除/変更されたデータをレプリケート
オブジェクトのバージョン ID を指定して削除リクエストが開始される
作成/変更されたデータをレプリケート
ソースバケット内のオブジェクトのみが削除されます。宛先バケット内のオブジェクトは削除されません。
作成/削除/変更されたデータをレプリケート
ソースバケットと宛先バケットのオブジェクトが同期的に削除されます。
レプリケーション完了後、ソースバケットと宛先バケット間のデータ整合性をどのように確認しますか?
レプリケーション完了後、以下のコードを使用してソースバケットと宛先バケット間のデータ整合性を確認できます。
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.model.*;
import com.aliyun.oss.OSSException;
import com.aliyuncs.exceptions.ClientException;
public class Demo {
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 をバケットが配置されているリージョンのエンドポイントに設定します。
String destEndpoint = "https://oss-cn-beijing.aliyuncs.com";
OSSClient destClient = new OSSClient(destEndpoint, credentialsProvider);
// 宛先バケットの名前を指定します。
String destBucketName = "dest-replication-bucket";
// ソースバケットと宛先バケットでバージョン管理が無効になっている場合は、listObjectsV2 操作を呼び出して、ソースバケット内のレプリケートされたファイルをリストします。
// ソースバケットと宛先バケットでバージョン管理が有効または一時停止されている場合は、listVersions 操作を呼び出して、ソースバケット内のレプリケートされたファイルをリストします。
ListObjectsV2Result result;
ListObjectsV2Request request = new ListObjectsV2Request(srcBucketName);
do {
result = srcClient.listObjectsV2(request);
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 値が同じかどうかを確認します。
Long srcCrc = srcMeta.getServerCRC();
String 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 値が同じかどうかを確認します。
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 が同じかどうかを確認します。
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());
}
}
推移的なレプリケーションはサポートされていますか?
いいえ、サポートされていません。たとえば、バケット A からバケット B へのデータレプリケーションルールが設定され、別のルールがバケット B からバケット C へ設定されている場合、バケット A からのデータはバケット B にのみレプリケートされ、バケット C にはレプリケートされません。
バケット A からバケット C にデータをレプリケートしたい場合は、バケット A からバケット C へのデータレプリケーションルールも設定する必要があります。
バケット A とバケット B の両方で既存データのレプリケーションが有効になっている場合、バケット A に書き込まれた新しいデータは、既存データのレプリケーションが完了する前に、既存データのレプリケーションタスクによってスキャンされ、バケット C にレプリケートされる可能性があります。
OSS バケットの双方向同期において、レプリケーションループのリスクはありますか?
いいえ、ありません。バケット A とバケット B の間に双方向レプリケーション関係が設定された後、バケット A からバケット B にレプリケートされたデータは、バケット A には戻されません。これは、新規データと既存データの両方に適用されます。同様に、バケット B からバケット A にレプリケートされたデータは、バケット B には戻されません。
ソースバケット内のファイルがライフサイクルルールに基づいて削除された場合、これらのファイルは宛先バケットからも削除されますか?
ソースバケットのデータレプリケーションポリシーが [作成/変更されたデータをレプリケート] に設定されている場合、ライフサイクルルールによってソースバケットから削除されたファイルは、宛先バケットからも削除されません。
ソースバケットのレプリケーションポリシーが [作成/削除/変更されたデータをレプリケート] に設定されている場合、ライフサイクルルールによってソースバケットから削除されたファイルは、宛先バケットからも削除されます。
説明ライフサイクルルールによってソースバケットから削除されたファイルが宛先バケットで見つかった場合でも、必ずしも [作成/削除/変更されたデータをレプリケート] ポリシーが無効であるとは限りません。これは、同じ名前のファイルを手動で宛先バケットに書き込んだ場合に発生する可能性があります。
既存データのレプリケーションの進捗が長時間 0% のままなのはなぜですか?
レプリケーションの進捗はリアルタイムで更新されません
既存データのレプリケーションの進捗はリアルタイムで更新されません。進捗はすべてのファイルがスキャンされた後にのみ更新されます。バケットに数億個などの多数のファイルが含まれている場合、進捗が更新されるまで数時間待つ必要がある場合があります。進捗バーが更新されていないからといって、既存データが宛先バケットにレプリケートされていないわけではありません。
宛先バケットのストレージ容量とレプリケーショントラフィックの変化を確認することで、ソースバケットからの既存データがレプリケートされているかどうかを確認できます。バケットのストレージ容量とレプリケーショントラフィックの表示方法の詳細については、「バケットの使用状況を照会する」をご参照ください。
ソースバケットの権限付与ポリシーが正しくありません
データレプリケーションルールを作成する際、ソースバケットの権限付与ポリシーはチェックされません。その結果、ルールは作成できますが、データは宛先バケットにレプリケートされず、レプリケーションの進捗は 0% のままになります。
正しいアクセスポリシーを設定するには、「データレプリケーションの権限」をご参照ください。
データレプリケーションが遅い場合はどうすればよいですか?
帯域幅を増やす
データレプリケーションは非同期であり、ほぼリアルタイムで行われます。ソースバケットから宛先バケットへのデータ転送には、データサイズに応じて数分から数時間かかる場合があります。レプリケーションプロセスに時間がかかりすぎる場合は、帯域幅制限によりレプリケーションタスクが遅延していないか確認してください。問題が帯域幅不足によって引き起こされている場合は、テクニカルサポートに連絡して帯域幅のスペックアップをリクエストし、レプリケーション効率を最適化することをお勧めします。
レプリケーション時間コントロール (RTC) を有効にする
RTC を有効にすると、OSS はアップロードしたほとんどのオブジェクトを数秒以内にレプリケートし、99.99% のオブジェクトを 10 分以内にレプリケートします。RTC を有効にすると、RTC が有効になっているレプリケーションルールによって生成されるデータレプリケーショントラフィックに対して課金されます。詳細については、「レプリケーション時間コントロール (RTC) を使用する」をご参照ください。
ソースバケットと宛先バケットでどのデータレプリケーション操作が実行されたかを知るにはどうすればよいですか?
データレプリケーション中のソースバケットと宛先バケットの変更に関する情報 (オブジェクトの作成、更新、削除、上書きなど) を取得できます。これを行うには、イベント通知ルールを設定し、イベントタイプを ObjectReplication:ObjectCreated、ObjectReplication:ObjectRemoved、および ObjectReplication:ObjectModified に設定します。詳細については、「イベント通知を使用して OSS オブジェクトの変更をリアルタイムで処理する」をご参照ください。
バージョン管理が一時停止されているバケットのデータレプリケーションはサポートされていますか?
いいえ、サポートされていません。データレプリケーションは、バージョン管理が無効または有効のいずれかである 2 つのバケットに対してのみ有効にできます。
宛先バケットが KMS を使用して暗号化されている場合、KMS 暗号化アルゴリズムの API 呼び出しに対して課金されますか?
はい、課金されます。宛先バケットが KMS を使用して暗号化されている場合、KMS 暗号化アルゴリズムの API 呼び出しに対して課金されます。料金の詳細については、「KMS の課金」をご参照ください。
データレプリケーションを有効にした後、無効にすることはできますか?
はい、できます。ルールの右側にある [レプリケーションを無効にする] をクリックします。
レプリケーションが無効になった後、レプリケートされたデータは宛先バケットに保持されます。ソースバケットの増分データは、宛先バケットにレプリケートされなくなります。