生成预签名 URL 以上传到 S3 存储桶

Meh*_*ran 1 amazon-s3 amazon-web-services pre-signed-url

我正在尝试为 AWS 上的 S3 存储桶生成一个预先签名的 URL 以上传文件,如下所示:

$ aws s3 presign s3://mybucket/somefolder/
Run Code Online (Sandbox Code Playgroud)

然后我使用该 URL 上传文件:

$ curl "https://mybucket.s3.amazonaws.com/somefolder/?AWSAccessKeyId=***&Signature=***&Expires=***"  --upload-file "./file"
Run Code Online (Sandbox Code Playgroud)

但随后它会打印出一个 XML 错误:

<?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>
  <AWSAccessKeyId>***********</AWSAccessKeyId>
  <StringToSign>PUT


    ************
    /mybucket/somefolder/</StringToSign>
  <SignatureProvided>**************</SignatureProvided>
  <StringToSignBytes>**************</StringToSignBytes>
  <RequestId>************</RequestId>
  <HostId>************</HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

[更新]

好的,所以我必须在预签名 URL 中指定对象名称。所以我做了,但我仍然面临同样的错误信息:

$ aws s3 presign s3://mybucket/someobject
Run Code Online (Sandbox Code Playgroud)

进而:

$ curl "https://mybucket.s3.amazonaws.com/someobject?AWSAccessKeyId=***&Signature=***&Expires=***"  --upload-file "./file"
Run Code Online (Sandbox Code Playgroud)

我会得到与以前完全相同的错误。为了确保这不是权限问题,我像这样测试了它:

$ aws s3 cp ./file s://mybucket/
Run Code Online (Sandbox Code Playgroud)

并且文件被复制了!有什么建议?

[更新]

我什至使用存储桶中实际存在的对象进行了测试,并成功下载了它。但我仍然无法写入对象,只能读取。

yk1*_*125 5

看起来 cli 命令aws s3 presign仅适用于 GetObject。参数'get_object'源代码中硬编码。(见第 671 行)

您可以使用其他 SDK(例如 boto3)为 PutObject 创建预签名 URL。确保设置客户端方法'put_object'

  • @Teebu 是的。刚才在github上查了代码,参数还在。 (2认同)