golang:使用 versionId 下载 S3 对象

问题描述 投票:0回答:1

我有一个存储在 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)
go amazon-s3 aws-sdk-go
1个回答
0
投票

我将代码转换为 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 存储桶中的版本化对象:

enter image description here

执行结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.