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

时间:2017-01-13 05:02:35

标签: amazon-web-services amazon-s3 amazon-ec2

所以我在EC2上托管一个网络应用程序,让用户从S3上传/下载照片。 EC2和S3位于同一区域。

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

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

错误消息

  

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

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

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

任何建议/想法都表示赞赏。

修改

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

1 个答案:

答案 0 :(得分:1)

ASIA... 是来自IAM角色的一组临时凭证的临时访问密钥ID。 (角色凭据始终临时。)AKIA...是IAM用户。

此处的问题是,在生成S3签名网址的签名过程中未使用随附凭据的x-amz-security-token,因此它不会出现在已签名的网址中......但它需要为此工作。

  

如果您使用临时安全凭证[...]签署请求,则必须在请求中添加相应的安全令牌,方法是添加x-amz-security-token标题。

     

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

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

请注意,您无法将其添加到已生成的网址中。它需要纳入签署过程。