您提供的授权机制不受支持。 请使用AWS4-HMAC-SHA256

我收到错误AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256. 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) 

aws-sdk(1.56.0)

如何解决它?

谢谢。

AWS4-HMAC-SHA256也称为签名版本4(“V4”),是S3支持的两种authenticationscheme之一。

所有地区都支持V4,但是美国标准¹以及其他许多(但不是全部)其他地区也支持另一个更老的scheme – 签名版本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,假设您使用的是具有该function的SDK。;

我会推测一些旧版本的SDK可能不支持这个选项,所以如果上面的内容没有帮助,你可能需要一个更新的SDK版本。


¹ US StandardUS Standard us-east-1地区的S3地区部署的前身名称。 自从这个答案最初是这样写的时候, “亚马逊S3将美国标准地区重新命名为美国东部(弗吉尼亚北部)地区,以便与AWS地区性命名惯例保持一致。” 对于所有的实际目的,这只是命名上的一个变化。

用节点,试试

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

您应该在config设置signatureVersion: 'v4'以使用新标志版本:

 AWS.config.update({ signatureVersion: 'v4' }); 

适用于JS sdk。

对于使用boto3Python 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') ) 

与PHP SDK类似的问题,这个工作:

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

重要的是signatureregion

在Java中,我必须设置一个属性

 System.setProperty(SDKGlobalConfiguration.ENFORCE_S3_SIGV4_SYSTEM_PROPERTY, "true") 

并将该区域添加到s3Client实例。

 s3Client.setRegion(Region.getRegion(Regions.EU_CENTRAL_1)) 

对于使用boto config的thumbor-aws,我需要把它放到$AWS_CONFIG_FILE

 [default] aws_access_key_id = (your ID) aws_secret_access_key = (your secret key) s3 = signature_version = s3 

所以任何直接使用boto而没有改变的东西,这可能是有用的

对于Android SDK,setEndpoint解决了这个问题,虽然它已被弃用。

 CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider( context, "identityPoolId", Regions.US_EAST_1); AmazonS3 s3 = new AmazonS3Client(credentialsProvider); s3.setEndpoint("s3.us-east-2.amazonaws.com"); 

用boto3,这是代码:

 s3_client = boto3.resource('s3', region_name='eu-central-1') 

 s3_client = boto3.client('s3', region_name='eu-central-1')