有没有一种使用AWS签名URL进行分段上传的方法?

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,就像我有凭据一样。

ela*_*son 2

要回答我自己的问题,最好的选择是使用安全令牌服务生成一组临时凭据。可以提供策略描述来将凭证限制为特定存储桶和密钥。