如何通过Golang直接从AWS S3复制文件到Azure Blob存储?
AWS S3到Azure Blob的Golang直接跨云复制实现
核心逻辑
要跳过本地中转节省时间和成本,核心是用S3预签名GET URL配合Azure Blob的UploadBlobFromURL接口,让Azure存储服务直接从S3拉取数据,全程不需要本地下载上传。
依赖安装
先安装所需的Golang SDK包:
go get github.com/aws/aws-sdk-go-v2/{aws,config,service/s3} go get github.com/Azure/azure-sdk-for-go/sdk/{azidentity,storage/azblob}
完整代码示例
package main import ( "context" "fmt" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" ) func main() { // 替换为你的实际配置参数 s3Bucket := "your-s3-bucket-name" s3ObjKey := "your-s3-object-key" azStorageAccount := "your-azure-storage-account" azContainer := "your-azure-container" azTargetBlob := "target-blob-name" // 1. 生成S3对象的预签名URL ctx := context.Background() // 加载AWS默认配置(支持环境变量、~/.aws/credentials等方式) awsCfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("us-east-1")) // 替换为S3桶所在区域 if err != nil { panic(fmt.Sprintf("加载AWS配置出错: %v", err)) } s3Client := s3.NewFromConfig(awsCfg) presignClient := s3.NewPresignClient(s3Client) presignResp, err := presignClient.PresignGetObject(ctx, &s3.GetObjectInput{ Bucket: aws.String(s3Bucket), Key: aws.String(s3ObjKey), }, func(opt *s3.PresignOptions) { opt.Expires = time.Hour * 1 // 设置URL有效期,大文件可适当延长 }) if err != nil { panic(fmt.Sprintf("生成S3预签名URL失败: %v", err)) } // 2. 初始化Azure Blob客户端 azCred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { panic(fmt.Sprintf("获取Azure凭证失败: %v", err)) } azBlobClient, err := azblob.NewClient(fmt.Sprintf("https://%s.blob.core.windows.net", azStorageAccount), azCred, nil) if err != nil { panic(fmt.Sprintf("创建Azure Blob客户端失败: %v", err)) } // 3. 触发直接复制 _, err = azBlobClient.UploadBlobFromURL(ctx, azContainer, azTargetBlob, presignResp.URL, nil) if err != nil { panic(fmt.Sprintf("跨云复制失败: %v", err)) } fmt.Println("文件已成功从S3复制到Azure Blob!") }
注意事项
- 权限要求:
- AWS侧:生成预签名URL的身份需要拥有
s3:GetObject权限 - Azure侧:使用的凭证需要拥有目标容器的
Storage Blob Data Contributor或写入权限
- AWS侧:生成预签名URL的身份需要拥有
- 大文件处理:如果S3对象超过100MiB,需要拆分成分块循环调用
PutBlockFromURL,最后用PutBlockList完成拼接,可参考Azure SDK的分块上传逻辑实现 - URL有效期:要确保预签名URL的有效期覆盖整个复制过程,避免中途失效
内容的提问来源于stack exchange,提问作者omer blechman
相关产品推荐
相关产品推荐

