所以我在EC2上托管一个网络应用程序,让用户从S3上传/下载照片。 EC2和S3位于同一区域。
凭据:在官方文档之后,凭据应由我创建并与EC2关联的IAM角色(具有s3fullAccess
权限)自动提供。
问题:用户(来自浏览器)无法下载照片,但可以成功上传照片。下载链接是由aws-sdk
getSignedUrl()
方法生成的。
错误消息:
InvalidAccessKeyId:您提供的AWS访问密钥ID不存在于我们的记录中。
首先,access key
似乎正确,因为用户可以成功上传内容。
我的猜测是,由于用户点击浏览器中的链接进行下载,因此EC2和S3之间没有交互,因此下载时不使用IAM角色。但是,使用EC2凭据生成的signedDownloadUrl
是不是?并且在查询字符串中提供了完全提供的访问密钥对。所以我的猜测可能是错的..
任何建议/想法都表示赞赏。
修改
我没有创建IAM用户,只有IAM角色。不知道这是否重要。
答案 0 :(得分:1)
ASIA...
是来自IAM角色的一组临时凭证的临时访问密钥ID。 (角色凭据始终临时。)AKIA...
是IAM用户。
此处的问题是,在生成S3签名网址的签名过程中未使用随附凭据的x-amz-security-token
,因此它不会出现在已签名的网址中......但它需要为此工作。
如果您使用临时安全凭证[...]签署请求,则必须在请求中添加相应的安全令牌,方法是添加
x-amz-security-token
标题。
如果您不包含x-amz-security-token
,系统会假定它应该在IAM ussr数据库中查找access-key-id,并且在那里找不到它,这会导致 InvalidAccessKeyId:您提供的AWS访问密钥ID在我们的记录中不存在错误。
请注意,您无法将其添加到已生成的网址中。它需要纳入签署过程。