データレプリケーション機能を使用すると、オブジェクトとオブジェクトに対して実行された操作 (オブジェクトの作成、上書き、削除など) を、ソースバケットからターゲットバケットに自動的に同期できます。OSS は、クロスリージョンレプリケーション (CRR) と同一リージョン内レプリケーション (SRR) の 2 つのデータレプリケーション機能を提供します。
注意事項
このトピックのサンプルコードでは、中国 (杭州) リージョン ID の
cn-hangzhouを使用します。デフォルトでは、パブリックエンドポイントを使用してバケット内のリソースにアクセスします。同じリージョン内の他の Alibaba Cloud サービスからバケット内のリソースにアクセスする場合は、内部エンドポイントを使用します。OSS がサポートするリージョンとエンドポイントの詳細については、「OSS のリージョンとエンドポイント」をご参照ください。このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報を構成する方法の詳細については、「アクセス認証情報を構成する」をご参照ください。
デフォルトでは、Alibaba Cloud アカウントにはデータレプリケーション関連の権限が付与されています。RAM ユーザーとして、またはセキュリティトークンサービス (STS) によって提供される一時的なアクセス資格情報を使用してデータをレプリケートする場合は、必要な権限が必要です。例:
データレプリケーションを有効にするには、
oss:PutBucketReplication権限が必要です。レプリケーション時間制御 (RTC) を有効または無効にするには、
oss:PutBucketRtc権限が必要です。データレプリケーションルールを表示するには、
oss:GetBucketReplication権限が必要です。データをレプリケートできるターゲットリージョンを表示するには、
oss:GetBucketReplicationLocation権限が必要です。データレプリケーションタスクの進行状況を表示するには、
oss:GetBucketReplicationProgress権限が必要です。データレプリケーションを無効にするには、
oss:DeleteBucketReplication権限が必要です。
サンプルコード
データレプリケーションを有効にする
データレプリケーションを有効にする前に、ソースバケットとターゲットバケットのバージョン管理が有効になっていないか、バージョン管理が有効になっていることを確認してください。
次のコードは、データレプリケーションを有効にする方法の例を示しています。ソースバケットとターゲットバケットは、同じリージョンまたは異なるリージョンに配置できます。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // バケットが配置されているリージョン。
bucketName string // バケットの名前。
)
// コマンドラインパラメータを初期化するために使用される init 関数を指定します。
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
}
func main() {
// コマンドラインパラメータを解析します。
flag.Parse()
var (
targetBucket = "target bucket name" // ターゲットバケットの名前。
targetLocation = "oss-cn-beijing" // ターゲットバケットが配置されているリージョン。
)
// バケットの名前が指定されているかどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。バケット名が必要です。")
}
// リージョンが指定されているかどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。リージョンが必要です。")
}
// デフォルトの構成を読み込み、認証情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// バケットのデータレプリケーションを有効にするリクエストを作成します。
request := &oss.PutBucketReplicationRequest{
Bucket: oss.Ptr(bucketName), // バケットの名前。
ReplicationConfiguration: &oss.ReplicationConfiguration{
Rules: []oss.ReplicationRule{
{
RTC: &oss.ReplicationTimeControl{
Status: oss.Ptr("enabled"), // RTC 機能を有効にします。
},
Destination: &oss.ReplicationDestination{
Bucket: oss.Ptr(targetBucket), // ターゲットバケットの名前。
Location: oss.Ptr(targetLocation), // ターゲットバケットが配置されているリージョン。
TransferType: oss.TransferTypeOssAcc, // 転送のタイプ。
},
HistoricalObjectReplication: oss.HistoricalObjectReplicationEnabled, // 既存データレプリケーション機能を有効にします。
},
},
},
}
// データレプリケーションを有効にします。
result, err := client.PutBucketReplication(context.TODO(), request)
if err != nil {
log.Fatalf("バケットレプリケーションの設定に失敗しました %v", err)
}
// 結果を表示します。
log.Printf("バケットレプリケーションの設定結果: %#v\n", result)
}
データレプリケーションルールをクエリする
次のコードは、バケットのデータレプリケーションルールをクエリする方法の例を示しています。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // バケットが配置されているリージョン。
bucketName string // バケットの名前。
)
// コマンドラインパラメータを初期化するために使用される init 関数を指定します。
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
}
func main() {
// コマンドラインパラメータを解析します。
flag.Parse()
// バケットの名前が指定されているかどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。バケット名が必要です。")
}
// リージョンが指定されているかどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。リージョンが必要です。")
}
// デフォルトの構成を読み込み、認証情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// バケットのデータレプリケーションルールをクエリするリクエストを作成します。
request := &oss.GetBucketReplicationRequest{
Bucket: oss.Ptr(bucketName),
}
// クエリ操作を実行します。
getResult, err := client.GetBucketReplication(context.TODO(), request)
if err != nil {
log.Fatalf("バケットレプリケーションの取得に失敗しました %v", err)
}
// 結果を表示します。
log.Printf("バケットレプリケーションの取得結果: %#v\n", getResult)
}
RTC 機能を有効または無効にする
次のコードは、CRR ルールの RTC 機能を有効または無効にする方法の例を示しています。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // バケットが配置されているリージョン。
bucketName string // バケットの名前。
)
// コマンドラインパラメータを初期化するために使用される init 関数を指定します。
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
}
func main() {
// コマンドラインパラメータを解析します。
flag.Parse()
var (
ruleId = "replication id"
)
// バケットの名前が指定されているかどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。バケット名が必要です。")
}
// リージョンが指定されているかどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。リージョンが必要です。")
}
// デフォルトの構成を読み込み、認証情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// RTC 機能を有効または無効にするリクエストを作成します。
request := &oss.PutBucketRtcRequest{
Bucket: oss.Ptr(bucketName),
RtcConfiguration: &oss.RtcConfiguration{
RTC: &oss.ReplicationTimeControl{
Status: oss.Ptr("enabled"),
},
ID: oss.Ptr(ruleId), // レプリケーションルールの ID を指定します。
},
}
// RTC 機能を有効または無効にする操作を実行します。
result, err := client.PutBucketRtc(context.TODO(), request)
if err != nil {
log.Fatalf("バケット RTC の設定に失敗しました %v", err)
}
// 結果を表示します。
log.Printf("バケット RTC の設定結果: %#v\n", result)
}
データをレプリケートできるリージョンをクエリする
次のコードは、バケットからデータをレプリケートできるリージョンをクエリする方法の例を示しています。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // バケットが配置されているリージョン。
bucketName string // バケットの名前。
)
// コマンドラインパラメータを初期化するために使用される init 関数を指定します。
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
}
func main() {
// コマンドラインパラメータを解析します。
flag.Parse()
// バケットの名前が指定されているかどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。バケット名が必要です。")
}
// リージョンが指定されているかどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。リージョンが必要です。")
}
// デフォルトの構成を読み込み、認証情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// ソースバケット内のデータをレプリケートできるリージョンをクエリするリクエストを作成します。
request := &oss.GetBucketReplicationLocationRequest{
Bucket: oss.Ptr(bucketName),
}
// クエリ操作を実行します。
result, err := client.GetBucketReplicationLocation(context.TODO(), request)
if err != nil {
log.Fatalf("バケットレプリケーションロケーションの取得に失敗しました %v", err)
}
// リージョンに関する情報を表示します。
for _, location := range result.ReplicationLocation.Locations {
log.Printf("バケットレプリケーションロケーション: %s", location)
}
// RTC 機能を有効にできるリージョンを表示します。
for _, rtcLocation := range result.ReplicationLocation.LocationRTCConstraint.Locations {
log.Printf("バケットレプリケーションロケーション RTC ロケーション: %s", rtcLocation)
}
}
データレプリケーショントスクの進捗状況をクエリする
既存データレプリケーショントスクと増分データレプリケーショントスクの進捗状況をクエリできます。
既存データレプリケーショントスクの進捗状況はパーセンテージで表されます。既存データレプリケーションが有効になっているバケットについてのみ、既存データレプリケーショントスクの進捗状況をクエリできます。
増分データレプリケーショントスクの進捗状況は、特定の時点として表されます。その時点より前にソースバケットに保存されているデータがレプリケートされます。
次のコードは、バケット内の特定のレプリケーションルール ID を持つデータレプリケーショントスクの進捗状況をクエリする方法の例を示しています。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // バケットが配置されているリージョン。
bucketName string // バケットの名前。
)
// コマンドラインパラメータを初期化するために使用される init 関数を指定します。
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
}
func main() {
// コマンドラインパラメータを解析します。
flag.Parse()
// レプリケーションルールの ID を指定します。
var ruleId = "replication id"
// バケットの名前が指定されているかどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。バケット名が必要です。")
}
// リージョンが指定されているかどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。リージョンが必要です。")
}
// デフォルトの構成を読み込み、認証情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// データレプリケーショントスクの進捗状況をクエリするリクエストを作成します。
request := &oss.GetBucketReplicationProgressRequest{
Bucket: oss.Ptr(bucketName),
RuleId: oss.Ptr(ruleId), // レプリケーションルールの ID を指定します。
}
// クエリ操作を実行します。
result, err := client.GetBucketReplicationProgress(context.TODO(), request)
if err != nil {
log.Fatalf("バケットレプリケーションの進捗状況の取得に失敗しました %v", err)
}
// データレプリケーショントスクの進捗状況を表示します。
for _, repProgressRule := range result.ReplicationProgress.Rules {
log.Printf("ルール ID: %s", repProgressRule.ID)
log.Printf("ステータス: %s", repProgressRule.Status)
log.Printf("レプリケーション進捗ルール ターゲットバケット: %s", *repProgressRule.Destination.Bucket)
log.Printf("レプリケーション進捗ルール ターゲットロケーション: %s", *repProgressRule.Destination.Location)
log.Printf("レプリケーション進捗ルール ターゲット転送タイプ: %v", repProgressRule.Destination.TransferType)
log.Printf("レプリケーション進捗ルール 既存データオブジェクトレプリケーション: %s", *repProgressRule.HistoricalObjectReplication)
}
}
データレプリケーションを無効にする
指定したソースバケットに構成されているレプリケーションルールを削除することで、バケットのデータレプリケーションを無効にできます。
次のコードは、特定の ID を持つレプリケーションルールを削除する方法の例を示しています。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // バケットが配置されているリージョン。
bucketName string // バケットの名前。
)
// コマンドラインパラメータを初期化するために使用される init 関数を指定します。
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
}
func main() {
// コマンドラインパラメータを解析します。
flag.Parse()
// レプリケーションルールの ID を指定します。
var ruleId = "replication id"
// バケットの名前が指定されているかどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。バケット名が必要です。")
}
// リージョンが指定されているかどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。リージョンが必要です。")
}
// デフォルトの構成を読み込み、認証情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// バケットに構成されているデータレプリケーションルールを削除するリクエストを作成します。
request := &oss.DeleteBucketReplicationRequest{
Bucket: oss.Ptr(bucketName), // バケットの名前。
ReplicationRules: &oss.ReplicationRules{
IDs: []string{ruleId}, // レプリケーションルール ID のリスト。
},
}
// データレプリケーションルールを削除する操作を実行します。
result, err := client.DeleteBucketReplication(context.TODO(), request)
if err != nil {
log.Fatalf("バケットレプリケーションの削除に失敗しました %v", err)
}
// 結果を表示します。
log.Printf("バケットレプリケーションの削除結果: %#v\n", result)
}
関連情報
データレプリケーションを有効にするために呼び出すことができる API 操作の詳細については、「PutBucketReplication」をご参照ください。
既存の CRR ルールの RTC 機能を有効または無効にするための API 操作の詳細については、「PutBucketRTC」をご参照ください。
データレプリケーションルールをクエリするための API 操作の詳細については、「GetBucketReplication」をご参照ください。
データをレプリケートできるリージョンをクエリするための API 操作の詳細については、「GetBucketReplicationLocation」をご参照ください。
データレプリケーショントスクの進捗状況をクエリするための API 操作の詳細については、「GetBucketReplicationProgress」をご参照ください。
データレプリケーションを無効にするための API 操作の詳細については、「DeleteBucketReplication」をご参照ください。