我有一个存储在 S3 中的对象,该对象有多个版本,我想使用 Go 下载该对象的特定版本,我正在使用 AWS SDK:https://github.com/aws/aws-sdk-go
我可以从 S3 下载对象,而无需提供 versionId,即对象的最新版本。但是当我提供 versionId 时,我收到访问被拒绝错误
实施如下:
sess, err := session.NewSession(&aws.Config{
Region: aws.String(AWSRegion),
})
if err != nil {
fmt.Println("Error creating session:", err)
return nil, err
}
// Create an S3 service client
svc := s3.New(sess)
// Download the object
resp, err := svc.GetObject(&s3.GetObjectInput{
Bucket: aws.String(AWSBucketName),
Key: aws.String(objKeyPath),
})
if err != nil {
fmt.Println("Error downloading object:", err)
return nil, err
}
respBytes, _ := io.ReadAll(resp.Body)
上面的代码工作完全正常,因为未提供 versionId,但是当我执行提供 versionId 的以下代码时,出现访问被拒绝错误:
sess, err := session.NewSession(&aws.Config{
Region: aws.String(AWSRegion),
})
if err != nil {
fmt.Println("Error creating session:", err)
return nil, err
}
// Create an S3 service client
svc := s3.New(sess)
// Download the object
resp, err := svc.GetObject(&s3.GetObjectInput{
Bucket: aws.String(AWSBucketName),
Key: aws.String(objKeyPath),
VersionId: aws.String(versionId),
})
if err != nil {
fmt.Println("Error downloading object:", err)
return nil, err
}
respBytes, _ := io.ReadAll(resp.Body)
我将代码转换为 lambda 函数,并能够在 aws 上成功执行。
package main
import (
"context"
"fmt"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
func bootstrap(ctx context.Context, event events.S3Event) {
sess := session.Must(session.NewSession())
svc := s3.New(sess)
bucket := "stackoverflowbuc"
key := "1706052153610.jpg"
// Specify the version ID of the object that we want to fetch
versionID := "ymJ0sde62voGEKnW4JNlrYlyKkCvHex9"
params := &s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
VersionId: aws.String(versionID),
}
// Fetch the object with the specified version ID
resp, err := svc.GetObject(params)
if err != nil {
fmt.Println("Error fetching object:", err)
return
}
body := resp.Body
defer body.Close()
fmt.Println("Object fetched successfully with version ID:", versionID)
}
func main() {
lambda.Start(bootstrap)
}
以下是我的 s3 存储桶中的版本化对象:
执行结果: