【发布时间】:2013-09-23 22:44:51
【问题描述】:
这是我的 previous question 关于使用实例配置文件签署政策文件的后续行动。
我正在开发一个系统,允许直接拖放上传到 S3 存储桶;首先向包含文件元数据的服务器发出 AJAX 请求。验证后,我的服务器会使用用于完成上传的表单参数进行响应。
设置基于浏览器的上传的过程已经很好地解释了here,并且在我的本地测试环境中一切正常。
但是,一旦我的应用程序部署在 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']);
这个调用给了我一组新的凭据,但是当我使用它时它给出了与上面相同的错误。
我希望有人以前做过这个,可以告诉我我错过了什么愚蠢的事情:)
【问题讨论】:
标签: php file-upload amazon-web-services amazon-s3 amazon-ec2