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

KMS キー: 宛先オブジェクトの暗号化に使用する KMS キーを指定します。
宛先バケットと同じリージョンに事前に KMS キーを作成する必要があります。詳細については、「CMK の作成」をご参照ください。
RAM ロール: 宛先オブジェクトの KMS 暗号化を実行するために RAM ロールを承認します。
新しい RAM ロール: 宛先オブジェクトの KMS 暗号化を実行するために新しい RAM ロールを作成します。ロール名は、
kms-replication-SourceBucketName-DestinationBucketNameの形式で指定します。AliyunOSSRole: 宛先オブジェクトの KMS 暗号化を実行するために AliyunOSSRole ロールを使用します。AliyunOSSRole ロールがまだ作成されていない場合、このオプションを選択すると OSS が自動的に作成します。
説明ロールを作成またはロールの権限を変更する場合は、
AliyunOSSFullAccessポリシーをロールにアタッチしてください。これを実行しないと、データレプリケーションが失敗する可能性があります。
HeadObject 操作および GetBucketEncryption 操作を呼び出して、それぞれソースオブジェクトおよび宛先バケットの暗号化ステータスを照会できます。
レプリケーションの進捗が 100 % に達しているか確認してください。
データレプリケーションは非同期で、ほぼリアルタイムで実行されます。宛先バケットへのデータ転送に要する時間は、データ量に応じて数分から数時間まで変動します。ラージオブジェクトをレプリケーションする場合、宛先バケットにオブジェクトが表示されるかどうかを確認する前に、レプリケーションの進捗が 100 % に達するまで待機してください。
ソースバケットからオブジェクトを削除した後、宛先バケットからもオブジェクトが削除されないのはなぜですか?
理由 1: 宛先バケットで保持ポリシーが有効になっています。
保持ポリシーの保持期間が満了するまでは、リソース所有者を含むすべてのユーザーが、そのバケットからオブジェクトを削除できません。
理由 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 へレプリケーションされたデータは、バケット B からバケット A へ再びレプリケーションされることはありません。同様に、バケット B からバケット A へレプリケーションされたデータも、バケット A からバケット B へ再びレプリケーションされることはありません。
ソースバケット内のオブジェクトがライフサイクルルールによって削除された場合、宛先バケットからも削除されますか?
ソースバケットのデータレプリケーションポリシーが 追加/変更 に設定されている場合、ライフサイクルルールによってソースバケットから削除されたオブジェクトは、宛先バケットから削除されません。
ソースバケットのデータレプリケーションポリシーが 追加/削除/変更 に設定されている場合、ライフサイクルルールによってソースバケットから削除されたオブジェクトは、宛先バケットからも削除されます。
説明ライフサイクルルールによってソースバケットから削除されたオブジェクトが宛先バケットに存在する場合、それは 追加/削除/変更 ポリシーが機能していないことを意味するわけではありません。宛先バケットに手動で同じ名前のオブジェクトが書き込まれている可能性があります。
既存データのレプリケーション進捗が長時間 0 % のままとなるのはなぜですか?
レプリケーション進捗はリアルタイムで更新されません
OSS は、既存データのレプリケーション進捗を、すべてのオブジェクトのスキャンが完了した後にのみ更新します。バケットに数百億個など非常に多数のオブジェクトが含まれている場合、進捗の更新に数時間かかることがあります。進捗が 0 % のままでも、必ずしもレプリケーションが開始されていないわけではありません。
宛先バケットのストレージ容量およびレプリケーショントラフィックの変化をモニターすることで、ソースバケットからの既存データのレプリケーションが宛先バケットで開始されているかどうかを確認できます。これらのメトリックのモニタリング方法については、「バケットのリソース使用量の表示」をご参照ください。
ソースバケットの権限ポリシーが不適切です
OSS は、データレプリケーションルールを作成する際に、現在のところソースバケットの権限を検証していません。このため、ルールの作成は成功しますが、宛先バケットへデータが一切レプリケーションされず、レプリケーション進捗が 0 % のままとなります。
適切な権限ポリシーを構成するには、「データレプリケーションに必要な権限」をご参照ください。
データレプリケーションが遅い場合、どのような対応ができますか?
帯域幅を増加させる
データレプリケーションは非同期で、ほぼリアルタイムで実行されます。ソースバケットから宛先バケットへのデータ転送に要する時間は、データ量に応じて数分から数時間まで変動します。レプリケーションに過度に時間がかかる場合は、遅延の原因となっている帯域幅制限がないか確認してください。帯域幅が原因である場合、テクニカルサポート に連絡して、帯域幅の増加を依頼し、レプリケーション性能を向上させてください。
レプリケーションタイムコントロール(RTC)を有効化する
レプリケーションタイムコントロール(RTC)を有効化すると、OSS はほとんどのオブジェクトを数秒以内に、99.99 % のオブジェクトを 10 分以内にレプリケーションします。RTC を有効化した後は、RTC 対応タスクによって生成されるデータレプリケーショントラフィックに対して課金されます。詳細については、「レプリケーションタイムコントロール(RTC)の使用」をご参照ください。
ソースバケットおよび宛先バケットで実行されたレプリケーション操作を追跡するにはどうすればよいですか?
イベント通知ルールを構成し、イベントタイプを ObjectReplication:ObjectCreated、ObjectReplication:ObjectRemoved、および ObjectReplication:ObjectModified に設定できます。これにより、オブジェクトの作成、更新、削除、上書きなどのオブジェクト変更について、レプリケーション中にソースバケットおよび宛先バケットから通知を受け取ることができます。詳細については、「イベント通知を使用したオブジェクト変更のリアルタイムモニタリング」をご参照ください。
バージョン管理が一時停止されているバケットに対するデータレプリケーションはサポートされていますか?
いいえ。データレプリケーションは、両方のバケットでバージョン管理が無効になっている場合、または両方のバケットでバージョン管理が有効になっている場合のみ構成できます。
宛先バケットで KMS 暗号化を使用している場合、KMS 暗号化 API 呼び出しに対して課金されますか?
はい。宛先バケットで KMS 暗号化を使用している場合、KMS 暗号化 API 呼び出しに対して課金されます。詳細については、「KMS の課金」をご参照ください。
有効化したデータレプリケーションルールを無効化できますか?
はい。ルール横の [レプリケーションの無効化] をクリックすることで、データレプリケーションを停止できます。
ルールを無効化した後、宛先バケットにはこれまでにレプリケーションされたすべてのデータが保持されますが、OSS はソースバケットからの新規データのレプリケーションを継続しません。
レプリケーションによってオブジェクトの順序が変更されますか?
いいえ。レプリケーションはオブジェクトの更新順序を変更しません。