すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:データレプリケーションに関する FAQ

最終更新日:Mar 04, 2025

このトピックでは、クロスリージョンレプリケーション (CRR) と同一リージョンレプリケーション (SRR) を含む、Object Storage Service (OSS) のクロスアカウントレプリケーションと同一アカウントレプリケーションについて、よくある質問への回答を提供します。

データレプリケーションルールを作成できない場合はどうすればよいですか?

  1. 必要な権限が不足しているかどうかを確認します。

    • RAM ユーザーの権限

      • RAM ユーザーとして OSS コンソールでデータレプリケーションルールを作成しようとすると、[OK] をクリックできません。

        • 原因: oss:PutBucketReplication 権限がありません。

        • 解決策: RAM ユーザーに oss:PutBucketReplication 権限を付与します。

      • RAM ユーザーとして OSS コンソールでデータレプリケーションルールを作成しようとすると、[RAM ロールの名前] リストにカスタム RAM ロールの名前が表示されません。

        • 原因: ram:ListRoles 権限がありません。

        • 解決策: RAM ユーザーに ram:ListRoles 権限を付与します。

      詳細については、「RAM ユーザーにカスタムポリシーをアタッチする」をご参照ください。

    • RAM ロールの権限

      • 同一アカウントレプリケーション

        同一アカウントレプリケーションの場合、ソースバケットとデスティネーションバケットに対してレプリケーション操作を実行するための権限を RAM ロールに付与する必要があります。 RAM ロールの作成方法と RAM ロールへの権限の付与方法の詳細については、「ロールの種類」をご参照ください。

      • クロスアカウントレプリケーション

        アカウント A からアカウント B へのクロスアカウントレプリケーションの場合、アカウント A を使用してソースバケット内のデータをレプリケートする権限を RAM ロールに付与し、アカウント B を使用してデスティネーションバケットでレプリケートされたオブジェクトを受信する権限を RAM ロールに付与する必要があります。 RAM ロールの作成方法と RAM ロールへの権限の付与方法の詳細については、「方法」をご参照ください。

  2. ソースバケットとデスティネーションバケットのバージョン管理ステータスが同じかどうかを確認します。

    レプリケーショ ンタスクのソースバケットとデスティネーションバケットは、バージョン管理が有効または無効のいずれか、同じバージョン管理ステータスである必要があります。

  3. エンドポイントと AccessKey ペアが正しいかどうかを確認します。

    OSS SDK または ossutil を使用してデータレプリケーションルールを作成する場合は、次の構成を確認します。

ソースバケット内のオブジェクトがデスティネーションバケットにレプリケートされないのはなぜですか?

ソースバケットのデータレプリケーションルールを構成した後にオブジェクトがデスティネーションバケットにレプリケートされない場合は、次の考えられる原因に基づいて問題のトラブルシューティングを行います。

  1. ソースバケットの構成が正しいかどうかを確認します。

    • データレプリケーションのステータスが [有効] になっているかどうかを確認します。

    • 意図した名前のプレフィックスがデータレプリケーションルールで指定されているかどうかを確認します。

      • 名前が特定のプレフィックスを含むオブジェクトのみをソースバケットからデスティネーションバケットにレプリケートするには、データレプリケーションルールでプレフィックスを指定する必要があります。 たとえば、データレプリケーションルールで log プレフィックスのみが指定されている場合、log/date1.txt や log/date2.txt など、名前に log プレフィックスが含まれるオブジェクトのみがレプリケートされます。 date3.txt など、名前に log プレフィックスが含まれていないオブジェクトはレプリケートされません。

        説明

        データレプリケーションルールで指定されたプレフィックスには、末尾にアスタリスク (*) や名前を含めることはできません。 たとえば、log/* プレフィックスは無効です。

      • ソースバケットからデスティネーションバケットにすべてのオブジェクトをレプリケートするには、プレフィックスを指定しないでください。

  2. レプリケートに失敗したオブジェクトが既存データのオブジェクトかどうかを確認します。 既存データのオブジェクトは、データレプリケーションルールで既存データのオブジェクトのレプリケーションを有効にした場合にのみレプリケートされます。

  3. ソースバケット内のオブジェクトが同じリージョン内またはリージョンをまたいで他のバケットからレプリケートされているかどうかを確認します。

    バケット内のオブジェクトがデータレプリケーションルールに基づいて作成されたレプリカである場合、そのオブジェクトは別のデータレプリケーションルールに基づいてデスティネーションバケットにレプリケートできません。 たとえば、バケット A からバケット B にオブジェクトをレプリケートするデータレプリケーションルールと、バケット B からバケット C にオブジェクトをレプリケートする別のレプリケーションルールを構成したとします。 この場合、もともとバケット A からレプリケートされたバケット B 内のオブジェクトは、バケット B からバケット C にレプリケートされません。

  4. レプリケートに失敗したオブジェクトが Key Management Service (KMS) を使用して暗号化されているかどうかを確認します。 オブジェクトが KMS を使用して暗号化されている場合は、データレプリケーションルールを作成するときに KMS で暗号化されたオブジェクトのレプリケーションを有効にする必要があります。

    ソースバケットまたはデスティネーションバケット内のオブジェクトに対して 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 操作を呼び出して、デスティネーションバケットの暗号化ステータスをクエリできます。

  5. レプリケーションの進捗状況が 100% であるかどうかを確認します。

    データはほぼリアルタイムで非同期にレプリケートされます。 ソースバケットからデスティネーションバケットにデータをレプリケートするために必要な時間は、データサイズに応じて数分から数時間までさまざまです。 レプリケートするデータ量が多い場合は、進捗状況が 100% になった後にソースデータがデスティネーションバケットに表示されるかどうかを確認します。

データレプリケーショ ンタスクによってデスティネーションバケットからデータが削除されないのはなぜですか?

  • 原因 1: デスティネーションバケットで保持ポリシーが有効になっています。

    指定されたデータ保持期間が経過するまで、リソース所有者を含むどのユーザーもバケットからオブジェクトを削除できません。

  • 原因 2: ソースバケットのバージョン管理ステータスとレプリケーションポリシーの構成も、ソースオブジェクトの削除によってデスティネーションオブジェクトの削除がトリガーされるかどうかに影響します。

    ソースバケットのバージョン管理

    リクエストの詳細

    レプリケーションポリシー

    結果

    バージョン管理無効

    オブジェクト削除リクエスト

    追加/変更

    ソースバケット内のオブジェクトのみが削除されます。 デスティネーションバケット内のオブジェクトは削除されません。

    追加/削除/変更

    ソースバケットから削除されたオブジェクトもデスティネーションバケットから削除されます。

    バージョン管理有効

    バージョン ID が指定されていないオブジェクト削除リクエスト

    追加/変更

    オブジェクトはソースバケットとデスティネーションバケットから削除されません。 ソースバケット内のオブジェクトに対して削除マーカーが作成され、デスティネーションバケットに同期されます。

    追加/削除/変更

    バージョン 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-64 値がデスティネーションオブジェクトの 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 値がデスティネーションオブジェクトの 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% のままなのはなぜですか?

  • レプリケーションの進捗状況の更新の遅延

    既存データのレプリケーションの進捗状況はリアルタイムでは更新されません。 レプリケーションの進捗状況は、すべてのオブジェクトがスキャンされるまで更新されません。 ソースバケットに数億個など多数のオブジェクトが格納されている場合、既存データのレプリケーションの進捗状況が更新されるまで数時間かかります。 既存データのレプリケーションの進捗状況が更新されない場合でも、既存データがデスティネーションバケットにレプリケートされていないわけではありません。

デスティネーションバケットのストレージ容量とトラフィック使用量 (インバウンドトラフィックやアウトバウンドトラフィックなど) を表示することで、ソースバケットの既存データがデスティネーションバケットにレプリケートされているかどうかを確認できます。 詳細については、「バケットのリソース使用量を表示する」をご参照ください。

  • ソースバケットのポリシー構成が正しくない

    OSS は、データレプリケーションルールで指定されたソースバケットにレプリケーションに必要な権限があるかどうかを検証しません。 そのため、ソースバケットに必要な権限がない場合でも、データレプリケーションルールを作成できますが、データはレプリケートされません。 その結果、データレプリケーションの進捗状況は 0% のままになります。

    この場合は、必要な権限を構成する必要があります。 詳細については、「データレプリケーションに必要な権限」をご参照ください。

データレプリケーションが遅い場合はどうすればよいですか?

  • 帯域幅を増やす

    データレプリケーショ ンタスクは、ほぼリアルタイムでデータを非同期にレプリケートします。 ソースバケットからデスティネーションバケットにデータをレプリケートするために必要な時間は、データサイズに応じて数分から数時間までさまざまです。 レプリケーショ ンタスクに時間がかかる場合は、帯域幅の制限が原因でレプリケーショ ンタスクが遅くなっているかどうかを確認することをお勧めします。 レプリケーションが帯域幅の問題によって遅くなっている場合は、technical support に連絡して帯域幅を増やし、レプリケーション効率を最適化することをお勧めします。

  • RTC を有効にする

    Replication Time Control (RTC) を有効にすると、OSS にアップロードしたオブジェクトのほとんどが数秒以内にレプリケートされ、オブジェクトの 99.99% が 10 分以内にレプリケートされます。 RTC 機能を有効にすると、RTC が有効なデータレプリケーショ ンタスクで生成されたデータレプリケーショントラフィックに対して課金されます。 詳細については、「RTC」をご参照ください。

ソースバケットとデスティネーションバケットにおけるデータレプリケーションに関連する操作を知るにはどうすればよいですか?

イベントタイプを ObjectReplication:ObjectCreatedObjectReplication:ObjectRemoved、および ObjectReplication:ObjectModified に設定して、レプリケーションによってソースバケットとデスティネーションバケットのオブジェクトに加えられた変更の通知を受信できます。 変更には、オブジェクトの追加、変更、削除、上書きが含まれます。 詳細については、「イベント通知を使用してオブジェクトの変更をリアルタイムで監視する」をご参照ください。

バージョン管理が一時停止されたバケットはデータレプリケーションをサポートしていますか?

いいえ、バージョン管理が一時停止されたバケットはデータレプリケーションをサポートしていません。 データレプリケーションルールは、2 つのバージョン管理が無効になっているバケット間または 2 つのバージョン管理が有効になっているバケット間でのみ構成できます。

デスティネーションバケットが KMS を使用してデータを暗号化する場合、KMS 暗号化に関連する API 操作の呼び出しに対して課金されますか?

デスティネーションバケットが KMS を使用してデータを暗号化する場合、KMS 暗号化に関連する API 操作の呼び出しに対して課金されます。 料金の詳細については、「KMS の課金」をご参照ください。

データレプリケーションルールを無効にできますか?

はい、データレプリケーションルールの横にある [レプリケーションの無効化] をクリックすると、レプリケーションルールを無効にできます。

データレプリケーションルールを無効にした後、レプリケートされたデータはデスティネーションバケットに保存されます。 ソースバケットの増分データはデスティネーションバケットにレプリケートされません。