データレプリケーションは、オブジェクトとその操作 (作成、上書き、削除など) を、ソースバケットからターゲットバケットにほぼリアルタイムで非同期かつ自動的にレプリケーションします。Object Storage Service (OSS) は、クロスリージョンレプリケーション (CRR) と同一リージョンレプリケーション (SRR) をサポートしています。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得します。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「クライアントの設定 (Go SDK V1)」をご参照ください。
デフォルトでは、Alibaba Cloud アカウントにはデータレプリケーションの権限があります。Resource Access Management (RAM) ユーザーとして、または STS によって提供される一時的なアクセス認証情報を使用してデータレプリケーション操作を実行する場合は、必要な権限が必要です。
データレプリケーションを有効にするには、
oss:PutBucketReplication権限が必要です。レプリケーション時間管理 (RTC) を有効または無効にするには、
oss:PutBucketRtc権限が必要です。データレプリケーションルールをクエリするには、
oss:GetBucketReplication権限が必要です。利用可能なターゲットリージョンをクエリするには、
oss:GetBucketReplicationLocation権限が必要です。データレプリケーションの進捗を表示するには、
oss:GetBucketReplicationProgress権限が必要です。データレプリケーションを無効にするには、
oss:DeleteBucketReplication権限が必要です。
サンプル
データレプリケーションの有効化
データレプリケーションを有効にする前に、ソースバケットとターゲットバケットの両方でバージョン管理が無効になっているか、両方で有効になっていることを確認してください。
次のコードは、データレプリケーションを有効にする方法を示しています。この例では、データは中国 (杭州) リージョンの srcexamplebucket バケットから、同じリージョンまたは異なるリージョンにある destexamplebucket バケットにレプリケーションされます。
package main
import (
"encoding/xml"
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// OSSClient インスタンスを作成します。
// yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンの場合は、必要に応じてエンドポイントを設定します。
// yourRegion をバケットのリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンの場合は、必要に応じてリージョンを設定します。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 署名バージョンを設定します。
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// ソースバケットの名前を指定します。
srcbucketName := "srcexamplebucket"
// データをレプリケーションするターゲットバケットを指定します。
destBucketName := "destexamplebucket"
// レプリケーションするオブジェクトのプレフィックス (prefix_1、prefix_2 など) を指定します。プレフィックスを指定すると、プレフィックスに一致するオブジェクトのみがターゲットバケットにレプリケーションされます。
// ソースバケットからすべてのオブジェクトをターゲットバケットにレプリケーションする場合は、Prefix を設定しないでください。
prefix1 := "prefix_1"
prefix2 := "prefix_2"
// Key Management Service (KMS) を使用したサーバー側暗号化 (SSE) キーの ID を指定します。Status を Enabled に設定する場合は、この要素を指定する必要があります。
keyId := "c4d49f85-ee30-426b-a5ed-95e9139d"
// SSE-KMS を使用して暗号化されたオブジェクトをレプリケーションするかどうかを指定します。
source := "Enabled"
prefixSet := oss.ReplicationRulePrefix{Prefix: []*string{&prefix1, &prefix2}}
// クロスリージョンレプリケーションルールを設定する際に、レプリケーション時間管理 (RTC) を有効にします。
enabled := "enabled"
reqReplication := oss.PutBucketReplication{
Rule: []oss.ReplicationRule{
{
PrefixSet: &prefixSet,
// オブジェクトの作成および更新操作をソースバケットからターゲットバケットにレプリケーションします。
Action: "PUT",
RTC: &enabled,
Destination: &oss.ReplicationRuleDestination{
Bucket: destBucketName,
Location: "oss-cn-hangzhou",
TransferType: "oss_acc",
},
HistoricalObjectReplication: "disabled",
SyncRole: "aliyunramrole",
EncryptionConfiguration: &keyId,
SourceSelectionCriteria: &source,
},
},
}
xmlBody, err := xml.Marshal(reqReplication)
if err != nil {
log.Fatalf("Failed to marshal XML for PutBucketReplication: %v", err)
}
err = client.PutBucketReplication(srcbucketName, string(xmlBody))
if err != nil {
log.Fatalf("Failed to put bucket replication: %v", err)
}
log.Println("Put Bucket Replication Success!")
}
データレプリケーションルールのクエリ
次のコードは、examplebucket バケットのデータレプリケーションルールをクエリする方法を示しています。
package main
import (
"encoding/xml"
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// OSSClient インスタンスを作成します。
// yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンの場合は、必要に応じてエンドポイントを設定します。
// yourRegion をバケットのリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンの場合は、必要に応じてリージョンを設定します。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 署名バージョンを設定します。
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// ソースバケットの名前を指定します。
bucketName := "srcexamplebucket"
// データレプリケーション設定を取得します。
stringData, err := client.GetBucketReplication(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket replication: %v", err)
}
// XML 応答を解析します。
var repResult oss.GetBucketReplicationResult
err = xml.Unmarshal([]byte(stringData), &repResult)
if err != nil {
log.Fatalf("Failed to unmarshal XML response: %v", err)
}
// データレプリケーションルールを出力します。
for _, rule := range repResult.Rule {
log.Printf("Rule Id: %s", rule.ID)
if rule.RTC != nil {
log.Printf("Rule RTC: %s", *rule.RTC)
}
if rule.PrefixSet != nil {
for _, prefix := range rule.PrefixSet.Prefix {
log.Printf("Rule Prefix: %s", *prefix)
}
}
log.Printf("Rule Action: %s", rule.Action)
log.Printf("Rule Destination Bucket: %s", rule.Destination.Bucket)
log.Printf("Rule Destination Location: %s", rule.Destination.Location)
log.Printf("Rule Destination TransferType: %s", rule.Destination.TransferType)
log.Printf("Rule Status: %s", rule.Status)
log.Printf("Rule Historical Object Replication: %s", rule.HistoricalObjectReplication)
if rule.SyncRole != "" {
log.Printf("Rule SyncRole: %s", rule.SyncRole)
}
}
}
レプリケーション時間管理 (RTC) の設定
次のコードは、既存のクロスリージョンレプリケーションルールに対してレプリケーション時間管理 (RTC) を有効または無効にする方法を示しています。
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// OSSClient インスタンスを作成します。
// yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンの場合は、必要に応じてエンドポイントを設定します。
// yourRegion をバケットのリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンの場合は、必要に応じてリージョンを設定します。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 署名バージョンを設定します。
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// ソースバケットの名前を指定します。
bucketName := "srcexamplebucket"
// RTC を有効にします。
enabled := "enabled"
// クロスリージョンレプリケーションルールの ID を指定します。
id := "564df6de-7372-46dc-b4eb-10f****"
// PutBucketRTC リクエストを構築します。
rtc := oss.PutBucketRTC{
RTC: &enabled,
ID: id,
}
err = client.PutBucketRTC(bucketName, rtc)
if err != nil {
log.Fatalf("Failed to put bucket RTC: %v", err)
}
log.Println("Put Bucket RTC Success!")
}
利用可能なターゲットリージョンのクエリ
次のコードは、examplebucket バケットからデータをレプリケーションできるターゲットリージョンのリストをクエリする方法を示しています。
package main
import (
"encoding/xml"
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// OSSClient インスタンスを作成します。
// yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンの場合は、必要に応じてエンドポイントを設定します。
// yourRegion をバケットのリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンの場合は、必要に応じてリージョンを設定します。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 署名バージョンを設定します。
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// ソースバケットの名前を指定します。
bucketName := "srcexamplebucket"
// ソースバケット内のデータをレプリケーションできるターゲットリージョンをクエリします。
stringData, err := client.GetBucketReplicationLocation(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket replication location: %v", err)
}
// XML 応答を解析します。
var repLocation oss.GetBucketReplicationLocationResult
err = xml.Unmarshal([]byte(stringData), &repLocation)
if err != nil {
log.Fatalf("Failed to unmarshal XML response: %v", err)
}
// ターゲットリージョン情報を出力します。
for _, location := range repLocation.Location {
log.Printf("Bucket Replication Location: %s", location)
}
// 転送タイプ情報を出力します。
for _, transferType := range repLocation.LocationTransferType {
log.Printf("Bucket Replication Location Transfer Type Location: %s", transferType.Location)
log.Printf("Bucket Replication Location Transfer Type Type: %s", transferType.TransferTypes)
}
// RTC ロケーション情報を出力します。
for _, rtcLocation := range repLocation.RTCLocation {
log.Printf("Bucket Replication Location RTC Location: %s", rtcLocation)
}
log.Println("Get Bucket Replication Location Success!")
}
データレプリケーションタスクの進捗のクエリ
データレプリケーションの進捗は、既存データのレプリケーションの進捗と増分データのレプリケーションの進捗に分かれています。
既存データのレプリケーションの進捗は、パーセンテージで表されます。これは、既存データのレプリケーションが有効になっているバケットにのみ適用されます。
増分データのレプリケーションの進捗は、特定の時点によって示されます。これは、この時点より前に書き込まれたデータがレプリケーションされたことを意味します。
次のコードは、examplebucket バケット内の特定のルール ID のデータレプリケーションタスクの進捗をクエリする方法を示しています。
package main
import (
"encoding/xml"
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// OSSClient インスタンスを作成します。
// yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンの場合は、必要に応じてエンドポイントを設定します。
// yourRegion をバケットのリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンの場合は、必要に応じてリージョンを設定します。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 署名バージョンを設定します。
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// ソースバケットの名前を指定します。
bucketName := "srcexamplebucket"
ruleId := "564df6de-7372-46dc-b4eb-10f****"
// データレプリケーションの進捗をクエリします。
stringData, err := client.GetBucketReplicationProgress(bucketName, ruleId)
if err != nil {
log.Fatalf("Failed to get bucket replication progress: %v", err)
}
// XML 応答を解析します。
var repProgress oss.GetBucketReplicationProgressResult
err = xml.Unmarshal([]byte(stringData), &repProgress)
if err != nil {
log.Fatalf("Failed to unmarshal XML response: %v", err)
}
// データレプリケーションの進捗情報を出力します。
for _, repProgressRule := range repProgress.Rule {
log.Printf("Rule Id: %s", repProgressRule.ID)
if repProgressRule.PrefixSet != nil {
for _, prefix := range repProgressRule.PrefixSet.Prefix {
log.Printf("Rule Prefix: %s", *prefix)
}
}
log.Printf("Replication Progress Rule Action: %s", repProgressRule.Action)
log.Printf("Replication Progress Rule Destination Bucket: %s", repProgressRule.Destination.Bucket)
log.Printf("Replication Progress Rule Destination Location: %s", repProgressRule.Destination.Location)
log.Printf("Replication Progress Rule Destination TransferType: %s", repProgressRule.Destination.TransferType)
log.Printf("Replication Progress Rule Status: %s", repProgressRule.Status)
log.Printf("Replication Progress Rule Historical Object Replication: %s", repProgressRule.HistoricalObjectReplication)
if repProgressRule.Progress != nil && repProgressRule.Progress.HistoricalObject != "" {
log.Printf("Replication Progress Rule Progress Historical Object: %s", repProgressRule.Progress.HistoricalObject)
}
log.Printf("Replication Progress Rule Progress NewObject: %s", repProgressRule.Progress.NewObject)
}
log.Println("Get Bucket Replication Progress Success!")
}
データレプリケーションの無効化
ソースバケットのレプリケーションルールを削除することで、ソースバケットとターゲットバケット間のレプリケーション関係を無効にできます。
次のコードは、examplebucket バケット内の特定のルール ID のレプリケーションルールを削除する方法を示しています。
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// OSSClient インスタンスを作成します。
// yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンの場合は、必要に応じてエンドポイントを設定します。
// yourRegion をバケットのリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンの場合は、必要に応じてリージョンを設定します。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 署名バージョンを設定します。
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// ソースバケットの名前を指定します。
srcbucketName := "yourSourceBucket"
// GetBucketReplication 操作によって返されるデータレプリケーションルールの ID を指定します。
ruleID := "e047ce28-6806-4131-b1da-30142116****"
// データレプリケーションを無効にします。
err = client.DeleteBucketReplication(srcbucketName, ruleID)
if err != nil {
log.Fatalf("Failed to delete bucket replication: %v", err)
}
log.Println("Delete Bucket Replication Success!")
}
関連ドキュメント
データレプリケーションを有効にする API 操作の詳細については、「PutBucketReplication」をご参照ください。
既存のクロスリージョンレプリケーションルールに対してレプリケーション時間管理 (RTC) を有効または無効にする API 操作の詳細については、「PutBucketRTC」をご参照ください。
データレプリケーションルールをクエリする API 操作の詳細については、「GetBucketReplication」をご参照ください。
利用可能なターゲットリージョンをクエリする API 操作の詳細については、「GetBucketReplicationLocation」をご参照ください。
データレプリケーションの進捗をクエリする API 操作の詳細については、「GetBucketReplicationProgress」をご参照ください。
データレプリケーションを無効にする API 操作の詳細については、「DeleteBucketReplication」をご参照ください。