使用带有指定存储类的boto3生成签名的S3 url

时间:2019-01-02 23:08:17

标签: amazon-web-services amazon-s3 boto3 boto

我可以使用 SELECT GROUP_CONCAT(CONCAT('{ "id": ' ,id, ', "number": "', number, '" } \r')) FROM nodejs into @result; SET @q = CONCAT('[ ', @result, ' ]'); SELECT @q INTO OUTFILE 'e:/json_data.json'; generate_presigned_url()成功地将文件上传到S3,而无需指定存储类。

一旦我尝试指定存储类,就会收到错误消息。

generate_presigned_post()

失败

  

我们计算出的请求签名与您的签名不匹配   提供。检查您的密钥和签名方法。

import boto3
from botocore.client import Config

s3_client = boto3.client(service_name='s3',config=Config(signature_version='s3v4'))
s3_client.generate_presigned_url(ClientMethod='put_object',Params={'Bucket':bucket,'Key':'test.txt', 'StorageClass':'INTELLIGENT_TIERING'})

失败

  

根据政策无效:额外的输入字段:StorageClass

我已经尝试过使用“ Storage-Class”,“ x-amz-storage-class”以及具有相同结果的各种不同键名的后一种方法。

我要去哪里错了?

更新:更多信息

我不相信我有任何权限问题,因为这可行:

import boto3
from botocore.client import Config

s3_client = boto3.client(service_name='s3',config=Config(signature_version='s3v4')
parts=s3_client.generate_presigned_post(Bucket=bucket,Key='test.txt', Fields={'StorageClass':'INTELLIGENT_TIERING'})
files = {'file':open('test.txt')}
response=requests.post(parts['url'], data=parts['fields'], files=files)

此外,如果我将s3_client.put_object(Bucket=bucket,Key='test.txt', StorageClass='INTELLIGENT_TIERING', Body=binary_data) 替换为generate_presigned_url(),则会遇到与INTELLIGENT_TIERING相同的签名失配错误。似乎不是新类不受支持的问题。

2 个答案:

答案 0 :(得分:1)

Per this comment

  

通过将'StorageClass':'STANDARD_IA'添加到您要使用的参数中   包括它作为签名的一部分作为签名标头,这仅仅是   S3如何序列化存储类。所有已签名的标头都需要   使用预先签名的url时与请求一起发送。在这   如果您需要在PUT中包含以下标头   请求:

     

headers = {'x-amz-storage-class':'STANDARD_IA'}

当调用通过generate_presigned_url生成的url时,我没有在客户端中包含标头“ x-amz-storage-class”,因为我认为该URL包含了S3所需的所有信息。添加它可以解决此问题。

答案 1 :(得分:-1)

您的AWS IAM权限很可能会阻止定义存储类的功能:

  

默认情况下,s3:PutObject使用STANDARD存储类存储对象,但是您可以使用x-amz-storage-class请求标头指定其他存储类。

     

在授予s3:PutObject权限时,可以使用s3:x-amz-storage-class条件键来限制存储上载对象时要使用的存储类。有关存储类的更多信息,请参见存储类。

https://docs.aws.amazon.com/AmazonS3/latest/dev/amazon-s3-policy-keys.html#example-storage-class-condition-key

您是否可以共享为S3存储桶上传设置的IAM权限?

假设您有权访问IAM权限,则可能会发现添加了如下限制:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::examplebucket/*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-storage-class": [
                        "STANDARD"
                    ]
                }
            }
        }
    ]
}