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

Object Storage Service:アカウント間のSRR

最終更新日:May 14, 2024

アカウント間での同じリージョンレプリケーション (SRR) により、Alibaba Cloudアカウント間で、リージョン内のバケットから同じリージョン内の別のバケットへのObject Storage Service (OSS) オブジェクトの自動および非同期 (ほぼリアルタイム) レプリケーションが可能になります。 オブジェクトの作成、更新、削除などの操作は、ソースバケットから宛先バケットにレプリケートできます。 このトピックでは、アカウント間でSRRを実行する方法について説明します。

前提条件

  • SRRタスクのソースバケットとして機能するバケットAは、アカウントa内のリージョンに作成され、アカウントAのUID、バケットAの名前、およびバケットAが配置されているリージョンが記録されます。

  • SRRタスクの宛先バケットとして機能するバケットBは、アカウントB内の同じリージョンに作成され、アカウントBのUIDとバケットBの名前が記録されます。

OSSコンソールの使用

  1. アカウントAを使用して、次の操作を実行します。

    1. 通常のサービスロールを作成します。

      重要

      RAMユーザーを使用してRAMロールを作成できます。 RAMユーザーには、ram:CreateRoleram:GetRoleram:ListPoliciesForRole、およびram:AttachPolicyToRoleの権限が必要です。 ただし、RAMユーザーにram:CreateRoleram:GetRoleなどの権限を付与することは危険です。 RAMユーザーが関連付けられているAlibaba Cloudアカウントを使用して、RAMロールを作成し、RAMロールに必要な権限を付与できます。 これにより、RAMユーザーはAlibaba Cloudアカウントによって作成されたRAMロールを引き受けることができます。

      ロールを作成するときは、[信頼できるエンティティの選択] を [Alibaba Cloud Service] に、ロールタイプを [通常のサービスロール] に、[信頼できるサービスの選択] を [OSS] に設定します。 詳細については、「通常のサービスロールの作成」をご参照ください。

      説明

      RAMロールが作成された後、[基本情報] セクションにRAMロールのAlibaba Cloud Resource Name (ARN) を記録し、その後の権限付与を行います。

    2. ソースバケットでSRRを実行する権限をRAMロールに付与します。

      次のいずれかの方法を使用して、RAMロールに権限を付与できます。

      必要なシステムポリシーをRAMロールにアタッチ

      警告

      AliyunOSSFullAccessシステムポリシーをRAMロールにアタッチします。 AliyunOSSFullAccessシステムポリシーがアタッチされているRAMロールには、現在のAlibaba Cloudアカウント内のすべてのバケットですべての操作を実行する権限があります。 システムポリシーをRAMロールにアタッチするときは注意してください。

      詳細については、「RAMロールへの権限の付与」をご参照ください。

      RAMロールへのカスタムポリシーのアタッチ

      RAMポリシーを使用して、ソースバケットでSRRを実行するために必要な最小限の権限をRAMロールに付与できます。

      説明

      ビジネス要件に基づいて、src-bucketをソースバケットの名前に置き換えます。

      {
         "バージョン":"1" 、
         "ステートメント":[
            {
               "効果":"許可" 、
               "Action":[
                  "oss:ReplicateList" 、
                  "oss:ReplicateGet"
               ],
               "Resource":[
                  "acs:oss:*:*:src-bucket" 、
                  "acs:oss:*:*:src-bucket/*"
               ]
            }
         ]
      }

      詳細については、「RAMロールへの権限の付与」をご参照ください。

  2. アカウントBを使用して、移行先バケットにレプリケートするオブジェクトを受け取る権限をRAMロールに付与します。

    方法1 :( 推奨) GUIで追加

    1. にログインします。OSSコンソール.

    2. 左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、目的のバケットを見つけてクリックします。

    3. 左側のナビゲーションツリーで、権限管理 > バケット承認ポリシー を選択します。

    4. バケット承認ポリシー タブで、GUI で追加 をクリックし、レプリケーションオブジェクトの受信 をクリックします。

    5. レプリケーションオブジェクトの受信パネルで、UID および RAM ロールの取得方法[レプリケーションのソースRAMロールARN] に設定し、ソースから RAM ロールの ARN をコピーする手順1で作成したRAMロールのAlibaba Cloudリソース名 (ARN) を選択します。

    6. ポリシーの生成 をクリックします。

    方法2: 構文による追加

    1. 左側のナビゲーションツリーで、権限管理 > バケット承認ポリシー を選択します。

    2. バケット承認ポリシー タブで、構文で追加 をクリックし、[編集] をクリックします。

    3. コードエディターで、次のバケットポリシーを入力します。

        重要

        ポリシーステートメントを指定してバケットポリシーを設定し、RAMロールに必要な権限を付与すると、新しいバケットポリシーによって既存のバケットポリシーが上書きされます。 新しいバケットポリシーに既存のバケットポリシーの内容が含まれていることを確認します。 そうしないと、既存のバケットポリシーの承認が失敗する可能性があります。

        カスタムロール名を、ビジネス要件に基づいて作成したロールの名前に置き換えます。 作成したロール名に大文字が含まれている場合は、小文字に変換する必要があります。 たとえば、作成したロール名がAliyunOssDrsRoleの場合、AliyunOssDrsRoleをaliyunossdrsroleに変換する必要があります。 次の例では、宛先バケットの名前はdest-bucket、ソースバケットが属するアカウントのUIDは137918634953xxxx、宛先バケットが属するアカウントのUIDは111933544165xxxxです。

      {
          "Version": "1"、
          "Statement": [{
              "Effect": "Allow",
              "Action": [
                  "oss:ReplicateList" 、
                  "oss:ReplicateGet" 、
                  "oss:ReplicatePut" 、
                  "oss:ReplicateDelete"
              ],
              "プリンシパル": [
                  "arn:sts::137918634953xxxx:assumed-role/aliyunossdrsrole/*"
              ],
              "Resource": [
                  "acs:oss:*:111933544165xxxx:dest-bucket" 、
                  "acs:oss:*:111933544165xxxx:dest-bucket/*"
              ]
      	}]
      }
    4. [保存] をクリックします。 表示されたメッセージボックスで [OK] をクリックします。

  3. アカウントAを使用して、ソースバケットのSRRルールを作成します。

    1. にログインします。OSSコンソール.

    2. 左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、[src-bucket] をクリックします。

    3. 左側のナビゲーションツリーで、データ管理 > 同一リージョン内のレプリケーション.

    4. On the同一リージョン内のレプリケーションタブをクリックします。同一リージョン内のレプリケーション.

    5. 同一リージョン内のレプリケーションパネルで、パラメーターを設定します。 下表にパラメーターを示します。

      セクション

      パラメーター

      説明

      複製先バケットの設定

      ソースバケット

      ソースバケットのリージョンと名前が表示されます。

      複製先バケット

      [別のAlibaba Cloudアカウントに属するバケットを指定する] を選択し、宛先バケットの名前を入力します。

      レプリケーションポリシーの設定

      複製するオブジェクト

      宛先バケットにレプリケートするオブジェクトを選択します。 有効な値:

      • [すべてのオブジェクト] [ソース] [バケット]: OSSは、すべてのオブジェクトをソースバケットから宛先バケットにレプリケートします。

      • 指定されたプレフィックスを持つオブジェクト: OSSは、名前に特定のプレフィックスを含むオブジェクトをソースバケットから宛先バケットに複製します。 プレフィックスは最大10個まで指定できます。

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

      データ複製モードを設定します。 有効な値:

      • 追加 /変更: OSSは、オブジェクトの作成および更新操作のみをソースバケットから宛先バケットにレプリケートします。

      • 追加 /削除 /変更: OSSは、オブジェクトの作成、更新、および削除操作をソースバケットから宛先バケットにレプリケートします。

      マルチパートアップロードを実行してオブジェクトをソースバケットにアップロードする場合、アップロードされた各パーツはターゲットバケットにレプリケートされます。 CompleteMultipartUpload操作を呼び出して取得した完全なオブジェクトも、ターゲットバケットにレプリケートされます。

      バージョン管理が有効なバケット内のオブジェクトのSRRを構成する方法の詳細については、「バージョン管理でのデータレプリケーションの使用」をご参照ください。

      過去データの複製

      履歴データ (SRRを有効にする前にソースバケットに存在するデータ) をターゲットバケットにレプリケートするかどうかを指定します。 有効な値:

      • Yes: 履歴データが宛先バケットにレプリケートされます。

        重要

        履歴データがレプリケートされると、ソースバケットからレプリケートされたオブジェクトは、宛先バケット内の同じ名前を持つオブジェクトを上書きする可能性があります。 データの損失を防ぐために、ソースバケットとターゲットバケットのバージョン管理を有効にすることを推奨します。

      • いいえ: OSSは、SRRを有効にした後にアップロードまたは更新されたオブジェクトのみをコピーします。

      RAMロール名

      手順1で作成したRAMロールをドロップダウンリストから選択します。

    6. [OK] をクリックします。 表示されるメッセージで、有効化 をクリックします。

      • SRRルールを設定した後、ルールを変更または削除することはできません。

      • SRRルールを設定した後、レプリケーションタスクは3〜5分で開始されます。 レプリケーションの進行状況は、ソースバケットの [SRR] タブで確認できます。

      • SRRでは、データは非同期的に複製される。 ソースバケットから宛先バケットにデータをレプリケートするのに必要な期間は、データの量によって異なります。 期間は、数分から数時間の範囲であり得る。

OSS SDKの使用

アカウント間のSRRは、OSS SDK for Java、OSS SDK for Python、およびOSS SDK for Goを使用してのみサポートされます。

Java

com.aliyun.oss.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。com.aliyun.oss.mo del.AddBucketReplicationRequestをインポートします。public classデモ {

    public static void main(String[] args) throws Exception {
        // この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // プロジェクトコードにアクセス資格情報を保存しないことをお勧めします。 そうしないと、アクセス資格情報が漏洩する可能性があります。 その結果、アカウント内のすべてのリソースのセキュリティが侵害されます。 この例では、アクセス資格情報は環境変数から取得されます。 サンプルコードを実行する前に、環境変数が設定されていることを確認してください。 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // ソースバケットの名前を指定します。 例: src-bucket. 
        String bucketName = "src-bucket";
        // 宛先バケットの名前を指定します。 宛先バケットとソースバケットは、異なるAlibaba Cloudアカウントに属している必要があります。 
        String targetBucketName = "dest-bucket";
        // 宛先バケットが配置されているリージョンを指定します。 ソースバケットと宛先バケットは同じリージョンにある必要があります。 
        文字列targetBucketLocation = "oss-cn-hangzhou";

        // Create an OSSClient instance. 
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            AddBucketReplicationRequest request = new AddBucketReplicationRequest(bucketName);

            request.setTargetBucketName(targetBucketName);
            request.setTargetBucketLocation(targetBucketLocation);
            // 履歴データを複製するかどうかを指定します。 デフォルトでは、履歴データはレプリケートされます。 この例では、このパラメーターはfalseに設定され、履歴データがレプリケートされないことを示します。 
            request.setEnableHistoricalObjectReplication(false);
            // OSSがデータの複製に使用するRAMロールの名前を指定します。 RAMロールには、ソースバケットでSRRを実行し、宛先バケットでレプリケートされたオブジェクトを受け取る権限が必要です。 
            request.setSyncRole("yourRole");           
            // リストプレフィックス=新しいArrayList();
            // prefixes.add("image/");
            // prefixes.add("ビデオ");
            // prefixes.add("a");
            // プレフィックス。add("A");
            // 複製するオブジェクトの名前に含まれるプレフィックスを指定します。 プレフィックスを指定すると、名前にプレフィックスの1つが含まれているオブジェクトのみが宛先バケットにレプリケートされます。 
            // request.setObjectPrefixList (プレフィックス);
            // リストアクション=新しいArrayList();
            // actions.add(AddBucketReplicationRequest.ReplicationAction.ALL);
            // 宛先バケットにレプリケートする操作を指定します。 デフォルト値は ALL です。 これは、ソースバケット内のオブジェクトに対して実行されたすべての操作が宛先バケットにレプリケートされることを示します。 
            // request.setReplicationActionList (アクション);
            ossClient.addBucketReplication(request);
        } catch (Exception e) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "しかし、何らかの理由でエラー応答で拒否されました。");
            System.out.println("エラーメッセージ:" + oe.getErrorMessage());
            System.out.println("エラーコード:" + oe.getErrorCode());
            System.out.println("リクエストID:" + oe.getRequestId());
            System.out.println("ホストID:" + oe.getHostId());
        } catch (ClientException e) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + 「ネットワークにアクセスできないなど」;
            System.out.println("エラーメッセージ:" + ce.getMessage());
        } 最後に{
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}        

Python

# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
oss2.modelsからReplicationRuleをインポート
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
# ソースバケットの名前を指定します。 例: src-bucket. 
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'src-bucket')
replica_config = ReplicationRule ()
    # 宛先バケットの名前を指定します。 ソースバケットと宛先バケットは、異なるAlibaba Cloudアカウントに属している必要があります。 
    target_bucket_name='dest-bucket' 、
    # 宛先バケットが配置されているリージョンを指定します。 ソースバケットと宛先バケットは同じリージョンにある必要があります。 
    target_bucket_location='oss-cn-hangzhou' 、
    # OSSでデータの複製に使用するRAMロールの名前を指定します。 RAMロールには、ソースバケットでSRRを実行し、宛先バケットでレプリケートされたオブジェクトを受け取る権限が必要です。 
    sync_role_name='yourRole' 、)

# レプリケートするオブジェクトの名前に含まれるプレフィックスを指定します。 プレフィックスを指定すると、名前にプレフィックスの1つが含まれているオブジェクトのみが宛先バケットにレプリケートされます。 
# prefix_list = ['prefix1', 'prefix2']
# データ複製ルールを指定します。 
# replica_config = ReplicationRule (
     # prefix_list=prefix_list,
     # 宛先バケットにレプリケートする操作を指定します。 デフォルト値は ALL です。 これは、ソースバケット内のオブジェクトに対して実行されたすべての操作が宛先バケットにレプリケートされることを示します。 
     # action_list=[ReplicationRule.ALL] 、
     # 宛先バケットの名前を指定します。 ソースバケットと宛先バケットは、異なるAlibaba Cloudアカウントに属している必要があります。 
     # target_bucket_name='dest-bucket' 、
     # 宛先バケットが配置されているリージョンを指定します。 ソースバケットと宛先バケットは同じリージョンにある必要があります。 
     # target_bucket_location='oss-cn-hangzhou' 、
     # 履歴データを複製するかどうかを指定します。 デフォルトでは、履歴データはレプリケートされます。 この例では、このパラメーターはFalseに設定されています。これは、履歴データがレプリケートされないことを示します。 
     # is_enable_historical_object_replication=False、      
  #)

# データ複製を有効にします。 
bucket.put_bucket_replication(replica_config) 

行く

パッケージメイン

import (import (import)
    "encoding/xml"
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
    "os"
)

func HandleError (エラーエラー) {
    fmt.Println("Error:", err)
    os.Exit(-1)
}

// データ複製を有効にします。 
func main() {
    // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err! =nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
    }
    // Create an OSSClient instance. 
    // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。 
    client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider))
    if err! =nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
    }
    // ソースバケットの名前を指定します。 
    srcbucketName := "yourSrcBucket"
    // 宛先バケットの名前を指定します。 ソースバケットと宛先バケットは、異なるAlibaba Cloudアカウントに属している必要があります。 
    destBucketName := "yourDestBucket"
    // レプリケートするオブジェクトの名前に含まれるprefix_1とprefix_2のプレフィックスを指定します。 プレフィックスを指定すると、名前にプレフィックスの1つが含まれているオブジェクトのみが宛先バケットにレプリケートされます。 
    // すべてのオブジェクトをソースバケットから宛先バケットにレプリケートするには、プレフィックスを指定しないでください。 
    prefix1 := "prefix_1"
    prefix2 := "prefix_2"    
    prefixSet := oss.ReplicationRulePrefix{Prefix: []* string{&prefix1, &prefix2}}
    
    reqReplication := oss.PutBucketReplication {
    ルール: []oss.ReplicationRule {
    {
    PrefixSet: &prefixSet、
    // 宛先バケットにレプリケートする操作を指定します。 デフォルト値は ALL です。 これは、ソースバケット内のオブジェクトに対して実行されたすべての操作が宛先バケットにレプリケートされることを示します。 
    アクション: "ALL" 、    
    宛先: &oss.ReplicationRuleDestination {
    バケット: destBucketName、
    // 宛先バケットが配置されているリージョンを指定します。 ソースバケットと宛先バケットは同じリージョンにある必要があります。     
    ロケーション: "oss-cn-hangzhou" 、    
    },
    // 履歴データを複製するかどうかを指定します。 デフォルトでは、履歴データはレプリケートされます。 この例では、このパラメーターはdisabledに設定されています。これは、履歴データがレプリケートされないことを示します。 
    HistoricalObjectReplication: "disabled" 、
    // OSSがデータの複製に使用するRAMロールの名前を指定します。 ロールには、ソースバケットでSRRを実行し、宛先バケットでレプリケートされたオブジェクトを受け取る権限が必要です。 
    SyncRole: "yourRole" 、    
    },
    },
    }

    xmlBody, err := xml.Marshal(reqReplication)
    if err! =nil {
    HandleError(err)
    }
    err = client.PutBucketReplication(srcbucketName, string(xmlBody))

    if err! =nil {
    HandleError(err)
    }

    fmt.Println("Put Bucket Replication Success!)
} 

ossutil の使用

ossutilを使用してSRRを有効にする方法の詳細については、「レプリケーション」をご参照ください。

OSS APIの使用

ビジネスで高度なカスタマイズが必要な場合は、RESTful APIを直接呼び出すことができます。 APIを直接呼び出すには、コードに署名計算を含める必要があります。 詳細については、「PutBucketReplication」をご参照ください。

参考資料