您不提供您提供的授权机制.请使用AWS4-HMAC-SHA256

Ale*_*xey 113 ruby amazon-s3 amazon-web-services aws-sdk

AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.当我尝试将文件上传到新法兰克福地区的S3存储桶时出错.一切都适用于US Standard地区.

脚本:

backup_file = '/media/db-backup_for_dev/2014-10-23_02-00-07/slave_dump.sql.gz'
s3 = AWS::S3.new(
    access_key_id:     AMAZONS3['access_key_id'],
    secret_access_key: AMAZONS3['secret_access_key']
)

s3_bucket = s3.buckets['test-frankfurt']

# Folder and file name
s3_name = "database-backups-last20days/#{File.basename(File.dirname(backup_file))}_#{File.basename(backup_file)}"

file_obj = s3_bucket.objects[s3_name]
file_obj.write(file: backup_file)
Run Code Online (Sandbox Code Playgroud)

aws-sdk(1.56.0)

怎么解决?

谢谢.

Mic*_*bot 144

AWS4-HMAC-SHA256,也称为签名版本4("V4")是S3支持的两种认证方案之一.

所有地区都支持V4,但是美国标准¹,以及许多 - 但不是全部 - 其他地区,也支持另一个较旧的方案,即签名版本2("V2").

根据http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... 2014年1月之后部署的新S3区域将仅支持V4.

自2014年末推出法兰克福以来,它不支持V2,这就是这个错误暗示你正在使用的.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html解释了如何在各种SDK中启用V4,假设您使用的是具有该功能的SDK.

我推测某些旧版本的SDK可能不支持此选项,因此如果上述方法无效,您可能需要更新版本的SDK.


¹ US Standard是该地区的S3区域部署的前名称us-east-1.从最初撰写此答案开始, "Amazon S3将美国标准区域重命名为美国东部(弗吉尼亚北部)区域,以与AWS区域命名约定保持一致." 出于所有实际目的,它只是命名的变化.

  • 如果添加区域,问题就解决了 (4认同)
  • @"迈克尔 - sqlbot"我现在切换到"awscli".对于那些匆忙的人:yum install python-pip; pip install awscli; aws配置; aws --region = eu-central-1 s3 ls s3:// $ BUCKET等... (2认同)

mor*_*is4 57

有了节点,试试吧

var s3 = new AWS.S3( {
    endpoint: 's3-eu-central-1.amazonaws.com',
    signatureVersion: 'v4',
    region: 'eu-central-1'
} );
Run Code Online (Sandbox Code Playgroud)


小智 28

你应该设置signatureVersion: 'v4'config使用新的标志版本:

AWS.config.update({
    signatureVersion: 'v4'
});
Run Code Online (Sandbox Code Playgroud)

适用于JSsdk.

  • 拯救了我的一天!不确定为什么不更广泛地宣传此选项 (2认同)

Pen*_*esh 23

对于使用boto3(Python SDK)的人使用下面的代码

from botocore.client import Config


s3 = boto3.resource(
    's3',
    aws_access_key_id='xxxxxx',
    aws_secret_access_key='xxxxxx',
    config=Config(signature_version='s3v4')
)
Run Code Online (Sandbox Code Playgroud)

  • 解析 X-Amz-Credential 参数时出现错误 `AuthorizationQueryParametersErrorError; 'us-east-1' 区域是错误的;期待 'us-east-2'us-east-2` 所以我在上面的代码中添加了 `region_name='us-east-2'` (4认同)

小智 13

与PHP SDK类似的问题,这适用:

$s3Client = S3Client::factory(array('key'=>YOUR_AWS_KEY, 'secret'=>YOUR_AWS_SECRET, 'signature' => 'v4', 'region'=>'eu-central-1'));
Run Code Online (Sandbox Code Playgroud)

重要的是signatureregion


P.G*_*pta 8

Flask 代码 (boto3)

不要忘记导入配置。另外,如果您有自己的配置类,请更改其名称。

from botocore.client import Config

s3 = boto3.client('s3',config=Config(signature_version='s3v4'),region_name=app.config["AWS_REGION"],aws_access_key_id=app.config['AWS_ACCESS_KEY'], aws_secret_access_key=app.config['AWS_SECRET_KEY'])
s3.upload_fileobj(file,app.config["AWS_BUCKET_NAME"],file.filename)
url = s3.generate_presigned_url('get_object', Params = {'Bucket':app.config["AWS_BUCKET_NAME"] , 'Key': file.filename}, ExpiresIn = 10000)
Run Code Online (Sandbox Code Playgroud)


Sup*_*ova 7

我一直在使用Django,并且必须添加这些额外的配置变量才能使其正常工作。(除了https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html中提到的设置外)。

AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"
Run Code Online (Sandbox Code Playgroud)


小智 5

AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"
Run Code Online (Sandbox Code Playgroud)

这也节省了我冲浪 24 小时后的时间。