迁移至AWS Golang SDK v2后,如何获取S3存储使用量?
解决AWS Golang SDK v2调用NetApp StorageGrid存储用量端点的问题
你可以通过SDK v2底层的rest.NewRequest构造自定义请求,来调用NetApp StorageGrid的存储用量端点,无需遍历所有对象。具体实现如下:
核心思路
AWS SDK v2虽未提供顶层的自定义请求创建方法,但可利用其底层REST客户端构造请求,指定x-ntap-sg-usage查询参数,实现和SDK v1一致的功能。
代码示例
package main import ( "context" "fmt" "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/transport/rest" ) func main() { // 加载配置,替换为你的StorageGrid端点和认证信息 cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithEndpointResolverWithOptions(aws.EndpointResolverWithOptionsFunc( func(service, region string, options ...interface{}) (aws.Endpoint, error) { return aws.Endpoint{ URL: "https://your-storagegrid-instance-url", }, nil })), config.WithCredentialsProvider(aws.NewCredentialsCache( aws.StaticCredentialsProvider{ Value: aws.Credentials{ AccessKeyID: "your-access-key", SecretAccessKey: "your-secret-key", }, })), ) if err != nil { panic(fmt.Errorf("加载配置失败: %v", err)) } // 创建S3客户端 s3Client := s3.NewFromConfig(cfg) // 构造自定义REST请求 req, err := rest.NewRequest(rest.POST, "/", nil) if err != nil { panic(fmt.Errorf("构造请求失败: %v", err)) } // 指定存储用量查询参数 req.URL.RawQuery = "x-ntap-sg-usage" // 发送请求并解析响应 var usageResponse struct { TotalUsage int64 `json:"totalUsage"` // 字段需匹配StorageGrid API返回结构 // 可根据需要添加其他字段,如bucketUsage等 } _, err = s3Client.Client.Send(context.TODO(), req, func(r *rest.Response) error { return r.UnmarshalJSON(&usageResponse) }) if err != nil { panic(fmt.Errorf("发送请求失败: %v", err)) } fmt.Printf("账户总存储用量: %d bytes\n", usageResponse.TotalUsage) }
注意事项
- 确保配置正确的StorageGrid端点、访问密钥和密钥,认证方式需与你的StorageGrid实例一致
- 响应结构体的字段需要严格匹配NetApp StorageGrid API的返回格式,可参考官方文档调整
- 该方法性能与SDK v1的自定义请求一致,无需遍历对象,适合大型存储桶场景
内容的提问来源于stack exchange,提问作者aristov
相关产品推荐
相关产品推荐

