このトピックでは、同一アカウントおよびクロスアカウントシナリオにおけるデータレプリケーション(同一リージョンおよびクロスリージョンを含む)に関するよくある質問に回答し、トラブルシューティング方法を提供します。
データレプリケーションルールを作成できないのはなぜですか?
必要な権限が付与されているか確認してください。
RAM ユーザーの権限不足
RAM ユーザーがコンソールでデータレプリケーションルールを作成しようとした際に、OK ボタンが使用できません。
原因:
oss:PutBucketReplication権限が不足しています。解決策: RAM ユーザーに
oss:PutBucketReplication権限を付与してください。
RAM ユーザーがコンソールでデータレプリケーションルールを作成する際、カスタム作成したロールが選択肢に表示されません。
原因:
ram:ListRoles権限が不足しています。解決策: RAM ユーザーに
ram:ListRoles権限を付与してください。
詳細については、「RAM ユーザーへのカスタム権限ポリシーの付与」をご参照ください。
RAM ロールの権限不足
同一アカウントレプリケーション
同一アカウントでのレプリケーションを行うには、ソースバケットと送信先バケット間でレプリケーション操作を実行できるよう、RAM ロールに権限を付与する必要があります。RAM ロールの作成および権限付与方法の詳細については、「ロールタイプ」をご参照ください。
クロスアカウントレプリケーション
アカウント A からアカウント B へのクロスアカウントレプリケーションを行うには、アカウント A を使用して RAM ロールにソースバケットからのデータレプリケーション権限を付与し、アカウント B を使用して RAM ロールに送信先バケットへのレプリケートオブジェクトの書き込み権限を付与する必要があります。RAM ロールの作成および権限付与方法の詳細については、「RAM ロールへの権限付与」をご参照ください。
ソースバケットと送信先バケットのバージョン管理ステータスが一致しているか確認してください。
ソースバケットと送信先バケットは、どちらもバージョン管理が有効であるか、またはどちらも無効である必要があります。
エンドポイントまたは AccessKey 情報が正しいか確認してください。
SDK または ossutil を使用してデータレプリケーションルールを作成する場合、以下の設定を確認してください。
ソースバケットおよび送信先バケットのリージョンに対応するエンドポイントが正しいか確認してください。詳細については、「リージョンとエンドポイント」をご参照ください。
レプリケーションルールで使用する AccessKey が正しいか確認してください。詳細については、「RAM ユーザーの AccessKey 情報の確認」をご参照ください。
オブジェクトが送信先バケットにレプリケートされないのはなぜですか?
データレプリケーションルールを構成した後、オブジェクトが送信先バケットにレプリケートされない場合は、以下の考えられる原因を確認してトラブルシューティングを行ってください。
ソースバケットの構成が正しいか確認してください。
データレプリケーションステータスが「有効」になっているか確認してください。
プレフィックスが正しいか確認してください。
特定のオブジェクトのみをレプリケートする場合: 特定のプレフィックスを持つオブジェクトのみをレプリケートするには、プレフィックスパラメーターを目的のプレフィックスに設定します。たとえば、プレフィックスを
logに設定すると、OSS は名前がlogで始まるオブジェクト(log/date1.txtやlog/date2.txtなど)のみをレプリケートします。date3.txtのようにプレフィックスに一致しないオブジェクトはレプリケートされません。説明プレフィックスはアスタリスク (*) で終わってはいけません(例:
log/*)。また、バケット名を含んではいけません。すべてのオブジェクトをレプリケートする場合: ソースバケット内のすべてのオブジェクトをレプリケートするには、プレフィックスパラメーターを空のままにしてください。
既存オブジェクトのレプリケーションが有効になっているか確認してください。このオプションが無効の場合、既存のオブジェクトはレプリケートされません。
ソースバケット内のオブジェクトが別のレプリケーションルールによって作成されたレプリカではないか確認してください。
バケット内のオブジェクトが別のレプリケーションルールによって作成されたレプリカである場合、OSS はそのオブジェクトを再度レプリケートしません。たとえば、バケット A からバケット B へ、およびバケット B からバケット C へとレプリケーションを構成した場合、バケット A からバケット B にレプリケートされたオブジェクトはバケット C にレプリケートされません。
オブジェクトが KMS で暗号化されているか確認してください。その場合は、KMS 暗号化オブジェクトのレプリケーションを有効にする必要があります。
ソースバケットまたは送信先バケット内のオブジェクトが、KMS で管理される CMK を使用したサーバ側暗号化(SSE-KMS)で暗号化されている場合、コピー を選択し、以下のパラメーターを構成する必要があります。

CMK ID: 送信先バケット内のオブジェクトを暗号化する CMK を指定します。
送信先バケットと同じリージョンの KMS コンソールで CMK を作成する必要があります。詳細については、「CMK の作成」をご参照ください。
RAM ロール名: 送信先バケット内のオブジェクトに対して KMS 暗号化を実行する RAM ロールを承認します。
新しい RAM ロール: 送信先オブジェクトの KMS 暗号化を実行するための新しい RAM ロールを作成します。ロール名は
kms-replication-<SourceBucketName>-<DestinationBucketName>の形式になります。AliyunOSSRole: AliyunOSSRole サービスリンクロールを使用して送信先オブジェクトの KMS 暗号化を実行します。このロールを作成していない場合、このオプションを選択すると OSS が自動的に作成します。
説明RAM ロールを作成するか、既存のロールの権限を変更する場合は、そのロールに
AliyunOSSFullAccessポリシーを必ずアタッチしてください。そうしないと、データレプリケーションが失敗する可能性があります。
ソースオブジェクトの暗号化ステータスをクエリするには HeadObject 操作を、送信先バケットの暗号化ステータスをクエリするには GetBucketEncryption 操作を呼び出すことができます。
レプリケーションの進捗が 100 % になっているか確認してください。
データレプリケーションは非同期プロセスであり、データサイズに応じて数分から数時間かかることがあります。ラージオブジェクトをレプリケートしている場合は、レプリケーションが完了するまでお待ちください。レプリケーションの進捗が 100 % に達したら、送信先バケット内にオブジェクトがあるか確認してください。
削除操作が送信先バケットに同期されないのはなぜですか?
原因 1: 送信先バケットに保持ポリシー(WORM)が構成されています。
保持ポリシーの保持期間が終了するまでは、リソース所有者を含むいかなるユーザーも、バケット内のオブジェクトを削除できません。
原因 2: 削除操作がレプリケートされるかどうかは、ソースバケットのバージョン管理ステータスとデータレプリケーションポリシーに依存します。
ソースバケットのバージョン管理ステータス
リクエストタイプ
データレプリケーションポリシー
結果
未バージョン管理
Delete リクエストを開始
Add/Change
オブジェクトはソースバケットからのみ削除されます。送信先バケットのオブジェクトは削除されません。
Add/Delete/Change
オブジェクトはソースバケットと送信先バケットの両方から削除されます。
バージョン管理が有効
オブジェクトのバージョン ID を指定せずに Delete リクエストを開始
Add/Change
いずれのバケットからもオブジェクトは削除されません。代わりに、OSS はソースバケットに削除マーカーを作成し、この削除マーカーが送信先バケットにレプリケートされます。
Add/Delete/Change
オブジェクトのバージョン ID を指定して Delete リクエストを開始
Add/Change
指定されたオブジェクトバージョンはソースバケットからのみ削除されます。送信先バケットからは削除されません。
Add/Delete/Change
指定されたオブジェクトバージョンはソースバケットと送信先バケットの両方から削除されます。
データ整合性の検証
レプリケーションタスクが完了した後、以下のコードを実行してソースバケットと送信先バケット間のデータ整合性を検証できます。
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-64 値が同じかどうかを確認します。
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());
}
}
OSS はチェーンレプリケーションをサポートしていますか?
いいえ。たとえば、バケット A からバケット B へのデータレプリケーションルールと、バケット B からバケット C への別のルールを構成した場合、バケット A のデータはバケット B にのみレプリケートされ、バケット C にはレプリケートされません。
バケット A からバケット C にデータをレプリケートするには、バケット A からバケット C への個別のデータレプリケーションルールを構成する必要があります。
バケット B からバケット C へのルールで既存データのレプリケーションを有効にした場合、初期スキャン時にバケット A からバケット B に到着したばかりのオブジェクトがレプリケートされる可能性があります。
双方向レプリケーションと無限ループ
いいえ。バケット A とバケット B 間で双方向レプリケーションを構成しても、バケット A からバケット B にレプリケートされたデータ(新規および既存の両方)がバケット A に再レプリケートされることはありません。同様に、バケット B からバケット A にレプリケートされたデータがバケット B に再レプリケートされることもありません。
ライフサイクルルールによる削除の同期
データレプリケーションポリシーが Add/Change に設定されている場合、ソースバケットでライフサイクルルールによって削除されたオブジェクトは、送信先バケットから削除されません。
データレプリケーションポリシーが Add/Delete/Change に設定されている場合、ソースバケットでライフサイクルルールによって削除されたオブジェクトは、送信先バケットからも削除されます。
説明送信先バケットに削除されるべきオブジェクトが残っている場合でも、Add/Delete/Change ポリシーが失敗したとは限りません。送信先バケットに同じ名前のオブジェクトを手動で書き込んだ可能性があります。
レプリケーションの進捗が 0% で停止しています
進捗はリアルタイムで更新されません
既存オブジェクトのレプリケーション進捗は、すべてのオブジェクトのスキャンが完了した後にのみ更新されます。バケット内に数億ものオブジェクトが含まれている場合、進捗の更新には数時間かかることがあります。進捗バーが静的であっても、レプリケーションが停止しているとは限りません。
レプリケーションが開始されたことを確認するには、送信先バケットのストレージ使用量とインバウンドレプリケーショントラフィックをモニタリングしてください。詳細については、「バケットのリソース使用量のクエリ」をご参照ください。
ソースバケットの権限ポリシーが不正確
データレプリケーションルールを作成する際、OSS はソースバケットの権限をチェックしません。そのため、必要な権限が不足していてもルールの作成は成功しますが、レプリケーションは失敗し、進捗は 0 % のままになります。
正しい権限を構成するには、「データレプリケーションの権限」をご参照ください。
データレプリケーションが遅い
帯域幅を増加させる
データレプリケーションは非同期かつニアリアルタイムのプロセスです。所要時間はデータ量に依存し、数分から数時間の範囲になります。レプリケーションが遅い原因として帯域幅制限が考えられます。帯域幅が問題である場合は、テクニカルサポート に連絡して帯域幅の増加を依頼してください。
レプリケーションタイムコントロール(RTC)を有効にする
RTC を有効にすると、OSS はほとんどのオブジェクトを数秒以内に、99.99 % のオブジェクトを 10 分以内にレプリケートします。RTC を有効にすると、RTC 対応タスクによって生成されたデータレプリケーショントラフィックに対して課金されます。詳細については、「レプリケーションタイムコントロール(RTC)の使用」をご参照ください。
レプリケーション操作の追跡
レプリケーション中にソースバケットおよび送信先バケット内のオブジェクトの変更をモニタリングするために、イベント通知ルールを構成できます。ObjectReplication:ObjectCreated、ObjectReplication:ObjectRemoved、または ObjectReplication:ObjectModified のイベントタイプを設定することで、オブジェクトの作成、削除、更新、上書きに関する通知を受け取れます。詳細については、「イベント通知を使用したオブジェクト変更のリアルタイムモニタリング」をご参照ください。
バージョン管理が一時停止されたバケットのレプリケーション
いいえ。データレプリケーションは、どちらも未バージョン管理であるか、またはどちらもバージョン管理が有効な 2 つのバケット間でのみ有効化できます。
KMS 暗号化と API 呼び出しの課金
はい。送信先バケットに KMS 暗号化を使用すると、KMS API 呼び出しに対して課金されます。詳細については、「KMS 1.0 課金」をご参照ください。
レプリケーションルールの無効化
はい。ルールの横にある レプリケーションの無効化 をクリックすることで、データレプリケーションを停止できます。
レプリケーションを無効化した後、レプリケートされたデータは送信先バケットに残ります。OSS はソースバケットから送信先バケットへの増分データのレプリケーションを停止します。
レプリケーションとオブジェクトの順序
レプリケーションによってオブジェクトの変更順序は変わりません。