如何使用Golang AWS SDK v2获取未签名的S3对象下载URL
获取AWS S3对象下载链接(SDK v2替代GetRequestObject方案)
AWS SDK v2确实移除了GetRequestObject方法,要获取S3对象的下载链接,分两种场景处理:
1. 公开可读的S3对象
如果对象所在存储桶或对象本身配置了公开可读权限,直接构造静态URL即可:
https://<你的桶名>.s3.<区域>.amazonaws.com/<对象键>
注意:对象键包含特殊字符(如空格、中文)时,需要进行URL编码,比如空格替换为%20。
2. 私有S3对象(生成预签名URL)
私有对象需要生成带临时权限的预签名URL,SDK v2可通过PresignClient实现:
完整代码示例
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/aws/aws-sdk-go-v2/aws/presigner" ) func main() { bucket := "your-bucket-name" key := "your-object-key" region := "your-region" // 示例:us-east-1 // 加载AWS配置 cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(region)) if err != nil { panic(fmt.Sprintf("加载配置失败: %v", err)) } // 创建S3客户端 s3Client := s3.NewFromConfig(cfg) // 创建预签名客户端 presignClient := presigner.NewPresignClient(s3Client) // 构造GetObject请求参数 input := &s3.GetObjectInput{ Bucket: aws.String(bucket), Key: aws.String(key), } // 生成预签名URL,设置过期时间(示例为15分钟) presignResult, err := presignClient.PresignGetObject(context.TODO(), input, func(opts *s3.PresignOptions) { opts.Expires = time.Duration(15) * time.Minute }) if err != nil { panic(fmt.Sprintf("生成预签名URL失败: %v", err)) } // 输出下载链接 fmt.Println("私有对象下载链接:", presignResult.URL) }
关键说明
- 预签名URL的过期时间可按需调整,最长不超过7天(受限于AWS IAM角色有效期)
- 确保运行代码的环境拥有
S3:GetObject权限 - 若使用自定义域名或S3加速端点,需在创建客户端时配置对应端点参数
内容的提问来源于stack exchange,提问作者AC.
相关产品推荐
相关产品推荐

