无法从AWS S3下载:访问被拒绝



所以我在EC2上托管了一个web应用程序,用户可以从S3上传/下载照片。EC2和S3在同一区域中。

凭据:在正式文档之后,凭据应由我创建并关联到EC2的IAM角色(具有s3fullAccess权限)自动提供。

问题:用户(从浏览器)无法下载照片,但可以成功上传。下载链接是由aws-sdkgetSignedUrl()方法生成的。

错误消息

InvalidAccessKeyId:您提供的AWS访问密钥Id在我们的记录中不存在。

首先,access key似乎是正确的,因为用户可以成功上传内容。

我的猜测是,由于用户点击浏览器中的链接进行下载,EC2和S3之间没有交互,因此下载时不使用IAM角色。但是signedDownloadUrl不是用EC2凭据生成的吗?并且在查询字符串中总共提供了访问密钥对。所以我的猜测可能是错误的。。

欢迎提出任何建议/想法。

编辑

我没有创建IAM用户,只有IAM角色。不知道这是否重要。

ASIA...是IAM角色的一组临时凭据中的临时访问密钥id。(角色凭据总是临时的。)AKIA...是IAM用户。

这里的问题是,凭证附带的x-amz-security-token没有在生成S3签名URL的签名过程中使用,因此它不会出现在签名URL中。。。但它需要在那里才能发挥作用。

如果使用临时安全凭据[…]对请求进行签名,则必须通过添加x-amz-security-token标头在请求中包含相应的安全令牌。

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#UsingTemporarySecurityCredentials

如果您不包括x-amz-security-token,系统会认为它应该在IAM ussr数据库中查找访问密钥id,但在那里找不到,这会导致InvalidAccessKeyId:您提供的AWS访问密钥id在我们的记录中不存在错误。

请注意,您不能简单地将其添加到已生成的URL中。需要将其纳入签署过程。

最新更新