ela*_*son 5 python boto amazon-web-services
我正在为提供签名的上载URL的服务编写客户端。这对于较小的上载效果很好,但对于较大的上载效果不佳,而使用分段上传会受益匪浅。
授权文档建议我可以在URL或通过Authorization标头中使用提供的签名和访问密钥ID。我尝试使用标头方法开始分段上传,但是访问被拒绝。使用查询字符串方法时,我得到了不允许的方法(在这种情况下为POST)。
我正在使用boto生成URL。例如:
import boto
c = boto.connect_s3()
bucket = c.get_bucket('my-bucket')
key = boto.s3.key.Key(bucket, 'my-big-file.gz')
signed_url = key.generate_url(60 * 60, 'POST') # expires in an hour
Run Code Online (Sandbox Code Playgroud)
然后,当尝试使用签名的URL开始分段上传时,我正在执行以下操作:
import requests
url = signed_url + '&uploads'
resp = requests.post(url)
Run Code Online (Sandbox Code Playgroud)
这将返回不允许的方法。
这种策略可行吗?是否有更好的方法为特定资源提供有限的凭据,以允许进行大型分段上传?
更新资料
我设法找到一个更具体的错误,使我认为这是不可能的。不幸的是,我收到403,表示签名与请求不符。
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you
provided. Check your key and signing method.</Message>
<StringToSignBytes>.../StringToSignBytes>
<RequestId>...</RequestId>
<HostId>...</HostId>
<SignatureProvided>...</SignatureProvided>
<StringToSign>POST
1402941975
/my-sandbox/test-mp-upload.txt?uploads</StringToSign>
<AWSAccessKeyId>...</AWSAccessKeyId>
</Error>
Run Code Online (Sandbox Code Playgroud)
这使我认为我将无法使用签名的URL,因为签名不匹配。
更新
我已经决定对分段上传使用签名的URL是不合理的。尽管我怀疑这是技术上的可能性,但它并不实际。原因是签名的URL要求URL,标头和请求方法都完全匹配才能正常工作。由于分段上传需要初始化上载,上载每个部分并完成(或取消)上载,因此为每个步骤生成URL会有些痛苦。
相反,我发现可以创建一个联合令牌来提供对存储桶中特定密钥的读/写访问。最终变得更加实用和简单,因为我可以立即使用boto,就像我有凭据一样。
| 归档时间: |
|
| 查看次数: |
1336 次 |
| 最近记录: |