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