Go數(shù)據(jù)復(fù)制
數(shù)據(jù)復(fù)制是以異步(近實時)方式將源Bucket中的文件(Object)以及對Object的創(chuàng)建、更新和刪除等操作自動復(fù)制到目標(biāo)Bucket。OSS支持跨區(qū)域復(fù)制(Cross-Region Replication)和同區(qū)域復(fù)制(Same-Region Replication)。
注意事項
本文以華東1(杭州)外網(wǎng)Endpoint為例。如果您希望通過與OSS同地域的其他阿里云產(chǎn)品訪問OSS,請使用內(nèi)網(wǎng)Endpoint。關(guān)于OSS支持的Region與Endpoint的對應(yīng)關(guān)系,請參見OSS訪問域名、數(shù)據(jù)中心、開放端口。
本文以從環(huán)境變量讀取訪問憑證為例。如何配置訪問憑證,請參見配置訪問憑證。
本文以O(shè)SS域名新建OSSClient為例。如果您希望通過自定義域名、STS等方式新建OSSClient,請參見初始化。
阿里云賬號默認擁有數(shù)據(jù)復(fù)制的相關(guān)權(quán)限。如果您希望通過RAM用戶或者STS的方式執(zhí)行數(shù)據(jù)復(fù)制相關(guān)操作,例如:
開啟數(shù)據(jù)復(fù)制,您必須擁有
oss:PutBucketReplication
權(quán)限。開啟或關(guān)閉數(shù)據(jù)復(fù)制時間控制(RTC)功能,您必須擁有
oss:PutBucketRtc
權(quán)限。查看數(shù)據(jù)復(fù)制規(guī)則,您必須擁有
oss:GetBucketReplication
權(quán)限。查看可復(fù)制的目標(biāo)地域,您必須擁有
oss:GetBucketReplicationLocation
權(quán)限。查看數(shù)據(jù)復(fù)制進度,您必須擁有
oss:GetBucketReplicationProgress
權(quán)限。關(guān)閉數(shù)據(jù)復(fù)制,您必須擁有
oss:DeleteBucketReplication
權(quán)限
示例代碼
開啟數(shù)據(jù)復(fù)制
開啟數(shù)據(jù)復(fù)制前,請確保源存儲空間與目標(biāo)存儲空間同時處于非版本化或已啟用版本控制狀態(tài)。
以下代碼用于開啟數(shù)據(jù)復(fù)制,將華東1(杭州)地域下的srcexamplebucket中的數(shù)據(jù)復(fù)制到相同或不同地域下的destexamplebucket。
package main
import (
"encoding/xml"
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 指定源Bucket名稱。
srcbucketName := "srcexamplebucket"
// 指定數(shù)據(jù)要復(fù)制到的目標(biāo)Bucket。
destBucketName := "destexamplebucket"
// 指定待復(fù)制Object的前綴prefix_1和prefix_2。指定Prefix后,只有匹配該Prefix的Object才會復(fù)制到目標(biāo)Bucket。
// 如果您需要將源Bucket中的所有Object復(fù)制到目標(biāo)Bucket,則無需設(shè)置Prefix。
prefix1 := "prefix_1"
prefix2 := "prefix_2"
// 指定SSE-KMS密鑰ID。如果指定Status為Enabled,則必須指定該元素。
keyId := "c4d49f85-ee30-426b-a5ed-95e9139d"
// 指定OSS是否復(fù)制通過SSE-KMS加密創(chuàng)建的對象。
source := "Enabled"
prefixSet := oss.ReplicationRulePrefix{Prefix: []*string{&prefix1, &prefix2}}
// 在配置跨區(qū)域復(fù)制規(guī)則時,開啟數(shù)據(jù)復(fù)制時間控制(RTC)功能。
enabled := "enabled"
reqReplication := oss.PutBucketReplication{
Rule: []oss.ReplicationRule{
{
PrefixSet: &prefixSet,
//指定可以被復(fù)制到目標(biāo)Bucket的操作。默認值為ALL,表示源Bucket的所有操作都會復(fù)制到目標(biāo)Bucket。
Action: "ALL",
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!")
}
查看數(shù)據(jù)復(fù)制規(guī)則
以下代碼用于查看examplebucket的數(shù)據(jù)復(fù)制規(guī)則。
package main
import (
"encoding/xml"
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫源Bucket名稱。
bucketName := "srcexamplebucket"
// 獲取數(shù)據(jù)復(fù)制配置
stringData, err := client.GetBucketReplication(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket replication: %v", err)
}
// 解析XML響應(yīng)
var repResult oss.GetBucketReplicationResult
err = xml.Unmarshal([]byte(stringData), &repResult)
if err != nil {
log.Fatalf("Failed to unmarshal XML response: %v", err)
}
// 打印數(shù)據(jù)復(fù)制規(guī)則
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)
}
}
}
設(shè)置數(shù)據(jù)復(fù)制時間控制(RTC)
以下代碼用于為已有的跨區(qū)域復(fù)制規(guī)則開啟或關(guān)閉數(shù)據(jù)復(fù)制時間控制(RTC)功能。
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫源Bucket名稱。
bucketName := "srcexamplebucket"
// 開啟RTC。
enabled := "enabled"
// 填寫跨區(qū)域復(fù)制規(guī)則ID。
id := "564df6de-7372-46dc-b4eb-10f****"
// 構(gòu)建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!")
}
查看可復(fù)制的目標(biāo)地域
以下代碼用于查看examplebucket的數(shù)據(jù)可復(fù)制的目標(biāo)地域列表。
package main
import (
"encoding/xml"
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫源Bucket名稱。
bucketName := "srcexamplebucket"
// 查看源Bucket可復(fù)制到的目標(biāo)地域。
stringData, err := client.GetBucketReplicationLocation(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket replication location: %v", err)
}
// 解析XML響應(yīng)
var repLocation oss.GetBucketReplicationLocationResult
err = xml.Unmarshal([]byte(stringData), &repLocation)
if err != nil {
log.Fatalf("Failed to unmarshal XML response: %v", err)
}
// 打印目標(biāo)地域信息
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!")
}
查看數(shù)據(jù)復(fù)制進度
數(shù)據(jù)復(fù)制進度分為歷史數(shù)據(jù)復(fù)制進度和新寫入數(shù)據(jù)復(fù)制進度。
歷史數(shù)據(jù)復(fù)制進度用百分比表示,僅對開啟了歷史數(shù)據(jù)復(fù)制的存儲空間有效。
新寫入數(shù)據(jù)復(fù)制進度用新寫入數(shù)據(jù)的時間點表示,代表這個時間點之前的數(shù)據(jù)已復(fù)制完成。
以下代碼用于查看examplebucket中指定規(guī)則ID的數(shù)據(jù)復(fù)制進度。
package main
import (
"encoding/xml"
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫源Bucket名稱。
bucketName := "srcexamplebucket"
ruleId := "564df6de-7372-46dc-b4eb-10f****"
// 查看數(shù)據(jù)復(fù)制進度。
stringData, err := client.GetBucketReplicationProgress(bucketName, ruleId)
if err != nil {
log.Fatalf("Failed to get bucket replication progress: %v", err)
}
// 解析XML響應(yīng)
var repProgress oss.GetBucketReplicationProgressResult
err = xml.Unmarshal([]byte(stringData), &repProgress)
if err != nil {
log.Fatalf("Failed to unmarshal XML response: %v", err)
}
// 打印數(shù)據(jù)復(fù)制進度信息
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!")
}
關(guān)閉數(shù)據(jù)復(fù)制
通過刪除存儲空間的復(fù)制規(guī)則,您可以關(guān)閉源存儲空間到目標(biāo)存儲空間的數(shù)據(jù)復(fù)制關(guān)系。
以下代碼用于刪除examplebucket中指定規(guī)則ID的數(shù)據(jù)復(fù)制關(guān)系。
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫源Bucket名稱。
srcbucketName := "yourSourceBucket"
// 填寫GetBucketReplication接口返回的數(shù)據(jù)復(fù)制規(guī)則ID。
ruleID := "e047ce28-6806-4131-b1da-30142116****"
// 關(guān)閉數(shù)據(jù)復(fù)制。
err = client.DeleteBucketReplication(srcbucketName, ruleID)
if err != nil {
log.Fatalf("Failed to delete bucket replication: %v", err)
}
log.Println("Delete Bucket Replication Success!")
}
相關(guān)文檔
關(guān)于開啟數(shù)據(jù)復(fù)制的API接口說明,請參見PutBucketReplication。
關(guān)于為已有的跨區(qū)域復(fù)制規(guī)則開啟或關(guān)閉數(shù)據(jù)復(fù)制時間控制(RTC)功能的API接口說明,請參見PutBucketRTC。
關(guān)于查看數(shù)據(jù)復(fù)制規(guī)則的API接口說明,請參見GetBucketReplication。
關(guān)于查看可復(fù)制的目標(biāo)地域的API接口說明,請參見GetBucketReplicationLocation。
關(guān)于查看數(shù)據(jù)復(fù)制進度的API接口說明,請參見GetBucketReplicationProgress。
關(guān)于關(guān)閉數(shù)據(jù)復(fù)制的API接口說明,請參見DeleteBucketReplication。