Go数据复制

数据复制是以异步(近实时)方式将源Bucket中的文件(Object)以及对Object的创建、更新和删除等操作自动复制到目标Bucket。OSS支持跨区域复制(Cross-Region Replication)和同区域复制(Same-Region Replication)。

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的RegionEndpoint的对应关系,请参见OSS地域和访问域名

  • 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证

  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见初始化

  • 阿里云账号默认拥有数据复制的相关权限。如果您希望通过RAM用户或者STS的方式执行数据复制相关操作,例如:

    • 开启数据复制,您必须拥有oss:PutBucketReplication权限。

    • 开启或关闭数据复制时间控制(RTC)功能,您必须拥有oss:PutBucketRtc权限。

    • 查看数据复制规则,您必须拥有oss:GetBucketReplication权限。

    • 查看可复制的目标地域,您必须拥有oss:GetBucketReplicationLocation权限。

    • 查看数据复制进度,您必须拥有oss:GetBucketReplicationProgress权限。

    • 关闭数据复制,您必须拥有oss:DeleteBucketReplication权限

示例代码

开启数据复制

重要

开启数据复制前,请确保源存储空间与目标存储空间同时处于非版本化或已启用版本控制状态。

以下代码用于开启数据复制,将华东1(杭州)地域下的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填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	// yourRegion填写Bucket所在地域,以华东1(杭州)为例,填写为cn-hangzhou。其它Region请按实际情况填写。
	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)
	}

	// 指定源Bucket名称。
	srcbucketName := "srcexamplebucket"
	// 指定数据要复制到的目标Bucket。
	destBucketName := "destexamplebucket"
	// 指定待复制Object的前缀prefix_1和prefix_2。指定Prefix后,只有匹配该Prefix的Object才会复制到目标Bucket。
	// 如果您需要将源Bucket中的所有Object复制到目标Bucket,则无需设置Prefix。
	prefix1 := "prefix_1"
	prefix2 := "prefix_2"
	// 指定SSE-KMS密钥ID。如果指定Status为Enabled,则必须指定该元素。
	keyId := "c4d49f85-ee30-426b-a5ed-95e9139d"
	// 指定OSS是否复制通过SSE-KMS加密创建的对象。
	source := "Enabled"
	prefixSet := oss.ReplicationRulePrefix{Prefix: []*string{&prefix1, &prefix2}}
	// 在配置跨区域复制规则时,开启数据复制时间控制(RTC)功能。
	enabled := "enabled"
	reqReplication := oss.PutBucketReplication{
		Rule: []oss.ReplicationRule{
			{
				PrefixSet: &prefixSet,
				// 将源Bucket内Object的新增、更新操作复制到目标Bucket。
				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填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	// yourRegion填写Bucket所在地域,以华东1(杭州)为例,填写为cn-hangzhou。其它Region请按实际情况填写。
	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)
	}

	// 填写源Bucket名称。
	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填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	// yourRegion填写Bucket所在地域,以华东1(杭州)为例,填写为cn-hangzhou。其它Region请按实际情况填写。
	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)
	}

	// 填写源Bucket名称。
	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填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	// yourRegion填写Bucket所在地域,以华东1(杭州)为例,填写为cn-hangzhou。其它Region请按实际情况填写。
	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)
	}

	// 填写源Bucket名称。
	bucketName := "srcexamplebucket"

	// 查看源Bucket可复制到的目标地域。
	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填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	// yourRegion填写Bucket所在地域,以华东1(杭州)为例,填写为cn-hangzhou。其它Region请按实际情况填写。
	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)
	}

	// 填写源Bucket名称。
	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填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	// yourRegion填写Bucket所在地域,以华东1(杭州)为例,填写为cn-hangzhou。其它Region请按实际情况填写。
	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)
	}

	// 填写源Bucket名称。
	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!")
}

相关文档