OSS data replication automatically synchronizes objects — including create, overwrite, and delete operations — from a source bucket to a destination bucket. Two modes are available: cross-region replication (CRR) replicates data across regions, and same-region replication (SRR) replicates data within the same region.
Prerequisites
Before you begin, make sure you have:
The OSS Go SDK V2 installed (
github.com/aliyun/alibabacloud-oss-go-sdk-v2)Access credentials stored in environment variables. For setup instructions, see Configure access credentials.
The required permissions. Alibaba Cloud accounts have replication permissions by default. RAM users and Security Token Service (STS) temporary credentials require explicit grants:
Operation Required permission Enable data replication oss:PutBucketReplicationEnable or disable RTC oss:PutBucketRtcView replication rules oss:GetBucketReplicationView destination regions oss:GetBucketReplicationLocationView replication task progress oss:GetBucketReplicationProgressDisable data replication oss:DeleteBucketReplication
The examples in this topic use the China (Hangzhou) region (cn-hangzhou) with a public endpoint. To access OSS from other Alibaba Cloud services in the same region, use an internal endpoint instead. For supported regions and endpoints, see OSS regions and endpoints.Query destination regions
List the regions to which data can be replicated from a bucket.
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
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
flag.Parse()
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := oss.NewClient(cfg)
request := &oss.GetBucketReplicationLocationRequest{
Bucket: oss.Ptr(bucketName),
}
result, err := client.GetBucketReplicationLocation(context.TODO(), request)
if err != nil {
log.Fatalf("failed to get bucket replication location %v", err)
}
for _, location := range result.ReplicationLocation.Locations {
log.Printf("Bucket replication location: %s", location)
}
for _, rtcLocation := range result.ReplicationLocation.LocationRTCConstraint.Locations {
log.Printf("Bucket replication location (RTC supported): %s", rtcLocation)
}
}Query replication task progress
OSS tracks two types of replication progress:
Historical data replication: expressed as a percentage. Available only when historical object replication is enabled for the rule.
Incremental data replication: expressed as a point in time. Objects stored in the source bucket before this timestamp have been replicated.
This example queries progress for a replication rule identified by its rule 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
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
flag.Parse()
var ruleId = "replication id"
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := oss.NewClient(cfg)
request := &oss.GetBucketReplicationProgressRequest{
Bucket: oss.Ptr(bucketName),
RuleId: oss.Ptr(ruleId),
}
result, err := client.GetBucketReplicationProgress(context.TODO(), request)
if err != nil {
log.Fatalf("failed to get bucket replication progress %v", err)
}
for _, rule := range result.ReplicationProgress.Rules {
log.Printf("Rule ID: %s", rule.ID)
log.Printf("Status: %s", rule.Status)
log.Printf("Destination bucket: %s", *rule.Destination.Bucket)
log.Printf("Destination location: %s", *rule.Destination.Location)
log.Printf("Transfer type: %v", rule.Destination.TransferType)
log.Printf("Historical object replication: %s", *rule.HistoricalObjectReplication)
}
}API reference
| Operation | API reference |
|---|---|
| Enable data replication | PutBucketReplication |
| Enable or disable RTC | PutBucketRTC |
| Query replication rules | GetBucketReplication |
| Query destination regions | GetBucketReplicationLocation |
| Query replication task progress | GetBucketReplicationProgress |
| Disable data replication | DeleteBucketReplication |