【问题标题】:Delete Object from S3 after Upload with SDK使用 SDK 上传后从 S3 中删除对象
【发布时间】:2022-04-04 00:56:28
【问题描述】:

如果我从仪表板上传一个对象,我可以使用 aws-sdk-go 将其删除,但如果我使用 aws-sdk-go 上传,我无法从 AWS S3 删除对象并且我没有错误。

这是我的存储桶策略:

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity ..."
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::storage.test.com/*"
        },
        {
            "Sid": "2",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::361908204985:user/caio"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:DeleteObject",
                "s3:DeleteObjectVersion"
            ],
            "Resource": "arn:aws:s3:::storage.test.com/*"
        }
    ]
}

我用这个代码上传文件:

_, err := s.client.PutObject(&s3.PutObjectInput{
    Body:          file,
    Bucket:        s.bucket,
    Key:           "test/foo/a.png",
    ACL:           aws.String("private"),
})

然后我使用以下代码删除文件:

_, err := s.client.DeleteObject(&s3.DeleteObjectInput{
    Bucket: s.bucket,
    Key:    aws.String("test/foo/a.png"),
})

为什么删除操作失败?

【问题讨论】:

  • 我不相信这甚至可以编译。 s3.PutObjectInput.Key 应该是 *string 类型,但您分配的是 stringi don't have error - 在哪里?没有编译错误? s.client.DeleteObject... 不返回错误?
  • 是的,它可以编译。我没有编译错误并且代码工作正常,但是如果我尝试删除使用此代码上传的文件,它不会返回错误,但不会从 S3 中删除该文件。
  • 似乎 S3 实际上并没有立即删除该对象。您的 DeleteObject(...) 调用可能成功,但该对象只是被“标记”为删除,可能需要一些额外的时间才能删除。我会注销响应(您忽略的第一个返回变量)以查看您返回的内容。在此处阅读更多信息docs.aws.amazon.com/sdk-for-go/api/service/s3/#S3.DeleteObject
  • 感谢@Snarf,我进行了测试...

标签: go amazon-s3 aws-sdk


【解决方案1】:

这是我的代码供您参考。我正在使用aws-sdk-go-v2
确保您的 IAM 用户拥有足够的 S3 权限。

import(
    "context"
    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/feature/s3/manager"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/credentials"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

func configS3() *s3.Client {

    creds := credentials.NewStaticCredentialsProvider(os.Getenv("S3_ACCESS_KEY_ID"), os.Getenv("S3_SECRET_ACCESS_KEY"), "")
    
    cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithCredentialsProvider(creds), config.WithRegion(os.Getenv("S3_REGION")))

    if err != nil {
        log.Fatal(err)
    } 

    return s3.NewFromConfig(cfg)

}

func DeleteImageFromS3(echoCtx echo.Context) error {
    
    awsClient := configS3()

    input := &s3.DeleteObjectInput{
        Bucket: aws.String("mybucket"),
        Key:    aws.String("pic.jpg"),
    }

    _, err := awsClient.DeleteObject(context.TODO(), input)

    if err != nil {

        fmt.Println("Got an error deleting item:")
        fmt.Println(err)
        return 

    }

    return echoCtx.JSON(http.StatusOK, "Object Deleted Successfully")

}

参考:https://aws.github.io/aws-sdk-go-v2/docs/code-examples/s3/deleteobject/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-06
    • 2014-01-09
    • 2011-12-29
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多