Предоставленный механизм авторизации не поддерживается. Используйте AWS4-HMAC-SHA256
Я получаю сообщение об ошибке AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.
, когда я пытаюсь загрузить файл в ведро S3 в новом регионе Франкфурта. Все работает правильно с областью US Standard
.
Script:
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)
Как это исправить?
Спасибо.
Ответы
Ответ 1
AWS4-HMAC-SHA256, также известный как Signature Version 4 ( "V4" ), является одной из двух схем аутентификации, поддерживаемых S3.
Все регионы поддерживают V4, но US-Standard & sup1; и многие, но не все - другие регионы, также поддерживают другую, более старую схему, Signature Version 2 ( "V2" ).
Согласно http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html... новые регионы S3, развернутые после января 2014 года, будут поддерживать только V4.
Поскольку Франкфурт был введен в конце 2014 года, он не поддерживает V2, и именно эта ошибка говорит о том, что вы используете.
http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html объясняет, как включить V4 в различных SDK, если вы используете SDK, который имеет эту возможность.
Я бы предположил, что некоторые старые версии SDK могут не поддерживать эту опцию, поэтому, если это не поможет, вам может потребоваться более новая версия SDK, который вы используете.
& sup1; US Standard
- это прежнее название регионального развертывания S3, которое базируется в области us-east-1
. Со времени, когда этот ответ был изначально написан,
"Amazon S3 переименовал в стандартный регион США в регион США (провинция Вирджиния), чтобы он соответствовал региональным соглашениям об именах AWS" . Для всех практических цели, это только изменение именования.
Ответ 2
С помощью node попробуйте
var s3 = new AWS.S3( {
endpoint: 's3-eu-central-1.amazonaws.com',
signatureVersion: 'v4',
region: 'eu-central-1'
} );
Ответ 3
Вы должны установить signatureVersion: 'v4'
в config
для использования новой версии знака:
AWS.config.update({
signatureVersion: 'v4'
});
Работает для JS
sdk.
Ответ 4
Для пользователей, использующих 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')
)
Ответ 5
Аналогичная проблема с PHP SDK, это работает:
$s3Client = S3Client::factory(array('key'=>YOUR_AWS_KEY, 'secret'=>YOUR_AWS_SECRET, 'signature' => 'v4', 'region'=>'eu-central-1'));
Важным битом является signature
и region
Ответ 6
Я использовал 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"
Ответ 7
В Java мне пришлось установить свойство
System.setProperty(SDKGlobalConfiguration.ENFORCE_S3_SIGV4_SYSTEM_PROPERTY, "true")
и добавьте область в экземпляр s3Client.
s3Client.setRegion(Region.getRegion(Regions.EU_CENTRAL_1))
Ответ 8
Для boto3 это код:
s3_client = boto3.resource('s3', region_name='eu-central-1')
или
s3_client = boto3.client('s3', region_name='eu-central-1')
Ответ 9
Для thumbor-aws, который использовал boto config, мне нужно было поместить это в $AWS_CONFIG_FILE
[default]
aws_access_key_id = (your ID)
aws_secret_access_key = (your secret key)
s3 =
signature_version = s3
Итак, все, что использовало boto непосредственно без изменений, может быть полезно
Ответ 10
Для 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");
Ответ 11
Иногда версия по умолчанию не обновляется. Добавьте эту команду
AWS_S3_SIGNATURE_VERSION = "s3v4"
в settings.py
Ответ 12
По сути, ошибка была в том, что я использовал старую версию aws-sdk и обновил версию, чтобы эта ошибка произошла.
в моем случае с узлом js я использовал signatureVersion
в объекте parmas следующим образом:
const AWS_S3 = new AWS.S3({
params: {
Bucket: process.env.AWS_S3_BUCKET,
signatureVersion: 'v4',
region: process.env.AWS_S3_REGION
}
});
Затем я поставил подпись из объекта params и работал как шарм:
const AWS_S3 = new AWS.S3({
params: {
Bucket: process.env.AWS_S3_BUCKET,
region: process.env.AWS_S3_REGION
},
signatureVersion: 'v4'
});