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

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心
  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见Go初始化
  • 要开启数据复制,您必须有oss:PutBucketReplication;要查看数据复制规则,您必须有oss:GetBucketReplication权限;要查看可复制的目标地域,您必须有oss:GetBucketReplicationLocation权限;要查看数据复制进度,您必须有oss:GetBucketReplicationProgress权限;要关闭数据复制,您必须有oss:DeleteBucketReplication权限。具体操作,请参见为RAM用户授权自定义的权限策略

开启数据复制

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

以下代码用于开启数据复制,将华东1(杭州)地域下的srcexamplebucket中的数据复制到相同或不同地域下的destexamplebucket。

package main

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

func HandleError(err error) {
    fmt.Println("Error:", err)
    os.Exit(-1)
}
// 开启数据复制。
func main()  {
    // yourEndpoint填写源Bucket对应的Endpoint,以杭州为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    if err != nil {
        HandleError(err)
    }
    // 填写源Bucket名称。
    srcbucketName := "srcexamplebucket"

    // 指定仅复制规则创建后新写入的数据,不复制源Bucket的历史数据。
    putXml := `<?xml version="1.0" encoding="UTF-8"?>
    <ReplicationConfiguration>
      <Rule>
        <PrefixSet>
            <! --指定待复制Object的前缀prefix_1和prefix_2。指定Prefix后,只有匹配该Prefix的Object才会复制到目标Bucket。-->
            <! --如果您需要将源Bucket中的所有Object复制到目标Bucket,则无需设置Prefix。
            <Prefix>prefix_1</Prefix>
            <Prefix>prefix_2</Prefix>
        </PrefixSet>
        <! --指定可以被复制到目标Bucket的操作。默认值为ALL,表示源Bucket的所有操作都会复制到目标Bucket。-->
        <Action>ALL</Action>
        <Destination>
            <! --指定数据要复制到的目标Bucket。-->
            <Bucket>destexamplebucket</Bucket>
            <! --指定目标Bucket所在的Region。-->
            <! --如果您希望开启跨区域复制,则源Bucket与目标Bucket必须处于不同的地域。如果您希望开启同地域复制,则源Bucket与目标Bucket必须处于相同的地域。-->
            <Location>oss-cn-beijing</Location>
            <! --指定数据复制时使用的数据传输链路。此处设置为oss_acc,表示使用了传输加速链路。-->
            <TransferType>oss_acc</TransferType>
        </Destination>
        <! --默认复制历史数据。此处设置为disabled,表示禁止复制历史数据。-->
        <HistoricalObjectReplication>disabled</HistoricalObjectReplication>
        <! --指定授权OSS进行数据复制的角色名称。如果指定使用SSE-KMS加密目标对象,则必须指定该元素。-->
        <SyncRole>aliyunramrole</SyncRole>
        <SourceSelectionCriteria>
          <SseKmsEncryptedObjects>
            <! --指定OSS是否复制通过SSE-KMS加密创建的对象。-->
            <Status>Enabled</Status>
          </SseKmsEncryptedObjects>
        </SourceSelectionCriteria>
        <EncryptionConfiguration>
            <! --指定SSE-KMS密钥ID。如果指定Status为Enabled,则必须指定该元素。-->
           <ReplicaKmsKeyID>c4d49f85-ee30-426b-a5ed-95e9139d****</ReplicaKmsKeyID>
       </EncryptionConfiguration>
     </Rule>
   </ReplicationConfiguration>`

    err = client.PutBucketReplication(srcbucketName,putXml)
    if err != nil {
        HandleError(err)
    }
}            

查看数据复制规则

以下代码用于查看examplebucket的数据复制规则。

package main

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

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

// 查看数据复制配置。
func main()  {
    // yourEndpoint填写源Bucket对应的Endpoint,以杭州为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    if err != nil {
        HandleError(err)
        os.Exit(-1)
    }

    // 填写源Bucket名称。
    srcbucketName := "examplebucket"
    result,err := client.GetBucketReplication(srcbucketName)
    if err != nil {
        HandleError(err)
        os.Exit(-1)
    }
    fmt.Println(result)
}
            

查看可复制的目标地域

以下代码用于查看examplebucket的数据可复制的目标地域列表。

package main

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

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

// 查看源Bucket可复制到的目标地域。
func main()  {
    // yourEndpoint填写源Bucket对应的Endpoint。以杭州为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    if err != nil {
        HandleError(err)
    }

    // 填写源Bucket名称。
    srcbucketName := "examplebucket"    
    result,err := client.GetBucketReplicationLocation(srcbucketName)
    if err != nil {
        HandleError(err)
    }

    fmt.Println(result)
}            

查看数据复制进度

数据复制进度分为历史数据复制进度和新写入数据复制进度。

  • 历史数据复制进度用百分比表示,仅对开启了历史数据复制的存储空间有效。
  • 新写入数据复制进度用新写入数据的时间点表示,代表这个时间点之前的数据已复制完成。

以下代码用于查看examplebucket中指定规则ID的数据复制进度。

package main

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

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

// 查看数据复制进度。
func main()  {
    // yourEndpoint填写源Bucket对应的Endpoint。以杭州为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    if err != nil {
        HandleError(err)
    }

    // 填写源Bucket名称。
    srcbucketName := "examplebucket"
    // 填写GetBucketReplication接口返回的数据复制规则ID。
    result,err := client.GetBucketReplicationProgress(srcbucketName,"e047ce28-6806-4131-b1da-30142116****")
    if err != nil {
        HandleError(err)
    }

    fmt.Println(result)
}

关闭数据复制

通过删除存储空间的复制规则,您可以关闭源存储空间到目标存储空间的数据复制关系。

以下代码用于删除examplebucket中指定规则ID的数据复制关系。

package main

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

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

// 关闭数据复制。
func main()  {
    // yourEndpoint填写源Bucket对应的Endpoint。以杭州为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    if err != nil {
        HandleError(err)
    }

    // 填写源Bucket名称。
    srcbucketName := "yourSourceBucket"
    // 填写GetBucketReplication接口返回的数据复制规则ID。
    err = client.DeleteBucketReplication(srcbucketName,"e047ce28-6806-4131-b1da-30142116****")
    if err != nil {
        HandleError(err)
    }
}

相关文档