我可以使用 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
相同的签名失配错误。似乎不是新类不受支持的问题。
答案 0 :(得分:1)
通过将'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条件键来限制存储上载对象时要使用的存储类。有关存储类的更多信息,请参见存储类。
您是否可以共享为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"
]
}
}
}
]
}