这是我之前关于使用实例配置文件签署策略文档的问题的后续内容。
我正在开发一个允许直接拖放上传到 S3 存储桶的系统;首先向包含文件元数据的服务器发出 AJAX 请求。验证后,我的服务器会使用用于完成上传的表单参数进行响应。
设置基于浏览器的上传的过程在这里得到了很好的解释,并且在我的本地测试环境中一切正常。
但是,一旦我的应用程序部署在 EC2 实例上,当浏览器尝试上传文件时,我会看到此错误:
<Error>
<Code>InvalidAccessKeyId</Code>
<Message>The AWS Access Key Id you provided does not exist in our records.</Message>
<RequestId>...</RequestId>
<HostId>...</HostId>
<AWSAccessKeyId>ASIAxxxyyyzzz</AWSAccessKeyId>
</Error>
这里的值ASIAxxxyyyzzz
来自于从元数据服务获取的实例角色凭证;似乎这些凭据不能在 EC2 之外用于促进基于浏览器的上传。
我还查看了Security Token Service以通过执行以下操作生成另一组临时凭据:
$token = $sts->assumeRole(array(
'RoleArn' => 'arn:aws:iam::xyz:role/mydomain.com',
'RoleSessionName' => 'uploader',
));
$credentials = new Credentials($token['Credentials']['AccessKeyId'], $token['Credentials']['SecretAccessKey']);
该调用为我提供了一组新凭据,但是当我使用它时,它给出了与上述相同的错误。
我希望有人以前做过这个并且可以告诉我我错过了什么愚蠢的事情:)