【发布时间】:2020-01-03 14:38:18
【问题描述】:
我有一些从 S3 请求对象的代码。如果它不存在,则会引发一个异常,其中包含消息...
The specified key does not exist.
创建对象后,如果随后将其删除,则重新请求对象时不会引发相同的异常。相反,它说访问被拒绝。
这是为什么?有没有办法删除一个不被 S3 记住的对象?已禁用存储桶上的版本控制。
我正在使用分配给分配给 EC2 实例的角色的策略。如果我删除策略上的权限集并重新创建它,那么问题就会被重置。
此外,如果我将策略设置为所有资源和所有操作,则不会发生此问题。
【问题讨论】:
-
有趣。您确定您使用的是相同(或等效)的凭据吗?这就是事情的运作方式,afaik。如果对象不存在,您将获得以下两种响应之一:AccessDenied 如果您无权列出该对象,NoSuchKey 如果您有权列出该对象(尽管它可能需要 head,而不是 list,我不是 100% 确定)。前者的原因是为了防止未经授权的攻击者确定对象的存在。
-
当您在 s3 中创建对象时,您将始终拥有它,并且它还会被复制到其他可用区域,出现访问被拒绝的唯一原因是:1. 您的 iam 角色确实没有附加正确的策略 2. 您使用了错误的凭据或配置文件但是如果您删除它,那么您将拥有最终的一致性,这意味着即使您删除了该对象它可能仍然存在一段时间,这就是为什么 s3 有什么叫eventual consistency
-
如果你只是等待几分钟然后重试,AccessDenied会被NoSuchKey代替吗?
-
@jarmod 十分钟后仍然拒绝访问。
-
您从未说明您为实例配置文件使用的角色授予了哪些特定的 S3 权限。如前所述,如果它们不包含
s3:ListBucket,那么对不存在对象的请求将返回access denied,而不是大多数人期望的404响应。如果向角色添加管理员权限解决了您的问题,那么您没有正确设置 S3 权限
标签: amazon-web-services amazon-s3