Механізм авторизації, який ви надали, не підтримується. Будь ласка, використовуйте AWS4-HMAC-SHA256


130

Я отримую помилку, 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)

Як це виправити?

Дякую.


1
Відповідь на це питання вирішити мою проблему: stackoverflow.com/questions/34483795 / ...
Бахадир Tasdemir

Відповіді:


151

AWS4-HMAC-SHA256, також відомий як Підпис Версії 4, ("V4") є однією з двох схем аутентифікації, підтримуваних S3.

Усі регіони підтримують V4, але US-Standard¹, і багато - але не всі - інші регіони, також підтримують іншу, більш стару схему, Підпис Версії 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, який ви використовуєте.


¹ US Standard- колишня назва регіонального розгортання S3, що базується в us-east-1регіоні. З часу, коли ця відповідь була спочатку написана, "Amazon S3 перейменував Стандартний регіон США на Східний (штат Н. Вірджинія) регіон, щоб відповідати регіональним конвенціям про іменування". Для всіх практичних цілей це лише зміна імен.


Це пеньки s3cmd-1.5.0-0.alpha3.fc20.noarch, який поставляється з Fedora 20. І, мабуть, також пеньки 1.5.0-rc1 , остання на даний момент.
Девід Тонхофер

1
@DavidTonhofer, що здається правильним. Схоже, розробники s3cmd ще не AWS4-HMAC-SHA256запровадили: github.com/s3tools/s3cmd/isissue/402
Michael - sqlbot

2
@ "Michael - sqlbot" добре, я перейшов на "awscli". Для тих, хто поспішає: yum встановити python-pip; pip встановити awscli; налаштування aws; aws --region = eu-central-1 s3 ls s3: // $ BUCKET etc.…
David Tonhofer

aws-sdk v2, здається, добре підтримує автентифікацію AWS4-HMAC-SHA256 "V4" (пов'язаний випуск )
Jeewes

thnx .. це корисно для мене
Manish Vadher

68

За допомогою вузла спробуйте

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

34

Ви повинні встановити signatureVersion: 'v4'в configвикористовувати нову версію знака:

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

Працює для JSsdk.


3
Врятував мій день! Не впевнений, чому цей варіант не оприлюднений
Андре Верланг

26

Для людей, які використовують 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')
)

4
Я отримую помилку AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 Тому я додав region_name='us-east-2' в коді вище
Асім

13

Аналогічна проблема з PHP SDK, це працює:

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

Важливий біт - це signatureтаregion


Чи потрібно вказати регіон?
Chirag Mehta

13

Я використовую 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"

Або попередню версію boto3 версії 1.4.4:

AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

3

У Java мені довелося встановити властивість

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

і додайте область до екземпляра s3Client.

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

3

З boto3 це код:

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

або

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

у вас є s3_client двічі?
MH

2

Для великих пальців, які використовували конфігурацію boto, мені потрібно було поставити це на $AWS_CONFIG_FILE

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

Тож все, що використовувало boto безпосередньо без змін, це може бути корисним


2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

це також заощадило мій час після серфінгу протягом 24 годин ..


Це чудово працює, вам просто потрібно змінити назву регіону відповідно до вашого, якщо його не "ap-south-1"
Devman

Не потрібно змінювати кодування! Встановіть ці два env vars і boto буде працювати
нормально

1

Для 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");

1

В основному помилка була в тому, що я використовував стару версію 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
  }
});

Потім я поставив підпис із парам-предмета і працював як шарм:

const AWS_S3 = new AWS.S3({
  params: {
    Bucket: process.env.AWS_S3_BUCKET,
    region: process.env.AWS_S3_REGION
  },
  signatureVersion: 'v4'
});

1

Перевірте свій регіон з відра AWS S3 і Передайте відповідний регіон у запиті підключення.

У своєму сенаріо я встановив " APSouth1 " для Азіатсько-Тихого океану (Мумбаї)

using (var client = new AmazonS3Client(awsAccessKeyId, awsSecretAccessKey, RegionEndpoint.APSouth1))
{
    GetPreSignedUrlRequest request1 = new GetPreSignedUrlRequest
    {
        BucketName = bucketName,
        Key = keyName,
        Expires = DateTime.Now.AddMinutes(50),
    };
    urlString = client.GetPreSignedURL(request1);
}

1

Для Boto3 використовуйте цей код.

import boto3
from botocore.client import Config


s3 = boto3.resource('s3',
        aws_access_key_id='xxxxxx',
        aws_secret_access_key='xxxxxx',
        region_name='us-south-1',
        config=Config(signature_version='s3v4')
        )


0

Іноді версія за замовчуванням не буде оновлена. Додайте цю команду

AWS_S3_SIGNATURE_VERSION = "s3v4"

в settings.py


0

Спробуйте це поєднання.

const s3 = new AWS.S3({
  endpoint: 's3-ap-south-1.amazonaws.com',       // Bucket region
  accessKeyId: 'A-----------------U',
  secretAccessKey: 'k------ja----------------soGp',
  Bucket: 'bucket_name',
  useAccelerateEndpoint: true,
  signatureVersion: 'v4',
  region: 'ap-south-1'             // Bucket region
});

0

Код для колби (boto3)

Не забудьте імпортувати Config. Також якщо у вас є власний клас конфігурацій, то змініть його ім'я.

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.