You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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或写入权限
  • 大文件处理:如果S3对象超过100MiB,需要拆分成分块循环调用PutBlockFromURL,最后用PutBlockList完成拼接,可参考Azure SDK的分块上传逻辑实现
  • URL有效期:要确保预签名URL的有效期覆盖整个复制过程,避免中途失效

内容的提问来源于stack exchange,提问作者omer blechman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 11:27:30