Podany przez Ciebie mechanizm autoryzacji nie jest obsługiwany. Użyj AWS4-HMAC-SHA256

135

AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.Podczas próby przesłania pliku do zasobnika S3 w nowym regionie Frankfurtu pojawia się błąd . Wszystko działa poprawnie z US Standardregionem.

Scenariusz:

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)

Jak to naprawić?

Dziękuję Ci.

Alexey
źródło
1
Ta odpowiedź rozwiązała mój problem: stackoverflow.com/questions/34483795/ ...
Bahadir Tasdemir

Odpowiedzi:

155

AWS4-HMAC-SHA256, znany również jako Signature Version 4 („V4”) to jeden z dwóch schematów uwierzytelniania obsługiwanych przez S3.

Wszystkie regiony obsługują V4, ale US-Standard¹ i wiele - ale nie wszystkie - inne regiony obsługują również inny, starszy schemat, Signature Version 2 („V2”).

Według http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... nowe regiony S3 wdrożone po styczniu 2014 będą obsługiwać tylko V4.

Ponieważ Frankfurt został wprowadzony pod koniec 2014 roku, nie obsługuje V2, co sugeruje ten błąd.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html wyjaśnia, jak włączyć V4 w różnych pakietach SDK, zakładając, że używasz zestawu SDK, który ma taką możliwość.

Spekuluję, że niektóre starsze wersje SDK mogą nie obsługiwać tej opcji, więc jeśli powyższe nie pomoże, możesz potrzebować nowszej wersji SDK, którego używasz.


¹ US Standardto dawna nazwa regionalnego wdrożenia S3 zlokalizowanego w us-east-1regionie. Od czasu, gdy ta odpowiedź została pierwotnie napisana, „Amazon S3 zmienił nazwę Standardowego Regionu USA na Region Wschodni Stanów Zjednoczonych (Północna Wirginia), aby zachować zgodność z regionalnymi konwencjami nazewnictwa AWS”. Ze względów praktycznych jest to tylko zmiana w nazewnictwie.

Michael - sqlbot
źródło
Ten pniak s3cmd-1.5.0-0.alpha3.fc20.noarch, który jest dostarczany z Fedorą 20. I najwyraźniej także pnie 1.5.0-rc1 , na razie najnowszy.
David Tonhofer
1
@DavidTonhofer wydaje się słuszne. Wygląda na to, że programiści s3cmd jeszcze nie AWS4-HMAC-SHA256zaimplementowali: github.com/s3tools/s3cmd/issues/402
Michael - sqlbot
2
@ "Michael - sqlbot" na razie przełączyłem się na "awscli". Dla tych, którzy się spieszą: yum install python-pip; pip install awscli; aws configure; aws --region = eu-central-1 s3 ls s3: // $ BUCKET itp ...
David Tonhofer
Wygląda na to, że aws-sdk v2 ładnie obsługuje uwierzytelnianie AWS4-HMAC-SHA256 „V4” (powiązany problem )
Jeewes
dzięki .. to jest dla mnie przydatne
Manish Vadher
72

W przypadku węzła spróbuj

var s3 = new AWS.S3( {
    endpoint: 's3-eu-central-1.amazonaws.com',
    signatureVersion: 'v4',
    region: 'eu-central-1'
} );
morris4
źródło
36

Należy ustawić signatureVersion: 'v4'na configużycie nowej wersji znak:

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

Działa dla JSsdk.

Denis Rizun
źródło
3
Uratowałem mój dzień! Nie jestem pewien, dlaczego ta opcja nie jest bardziej nagłośniona
André Werlang
27

Dla osób używających boto3( Python SDK) użyj poniższego kodu

from botocore.client import Config


s3 = boto3.resource(
    's3',
    aws_access_key_id='xxxxxx',
    aws_secret_access_key='xxxxxx',
    config=Config(signature_version='s3v4')
)
Penkey Suresh
źródło
4
Otrzymuję błąd, AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 więc dodałem region_name='us-east-2' do powyższego kodu
Aseem
13

Podobny problem z PHP SDK, to działa:

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

Ważne jest to, że signatureiregion

Pascal
źródło
Czy wymagane jest określenie regionu?
Chirag Mehta
4
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

to również zaoszczędziło mi czasu po surfowaniu przez 24 godziny.

Smartybrainy
źródło
To działa świetnie, wystarczy zmienić nazwę regionu na swoją, jeśli nie jest to „ap-south-1”
Mathews Musukuma
Żadne zmiany w kodowaniu nie są konieczne! Ustaw te dwie
zmienne
3

W Javie musiałem ustawić właściwość

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

i dodaj region do instancji s3Client.

s3Client.setRegion(Region.getRegion(Regions.EU_CENTRAL_1))
GameScripting
źródło
3

W przypadku boto3 jest to kod:

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

lub

s3_client = boto3.client('s3', region_name='eu-central-1')
Benoit
źródło
masz s3_client dwa razy?
PolarBear10
2

W przypadku thumbor-aws, które używały konfiguracji boto, musiałem umieścić to w pliku $AWS_CONFIG_FILE

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

Więc wszystko, co korzystało bezpośrednio z Boto bez zmian, może być przydatne

higuita
źródło
1

W przypadku zestawu SDK systemu Android setEndpoint rozwiązuje problem, chociaż jest przestarzały.

CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                context, "identityPoolId", Regions.US_EAST_1);
AmazonS3 s3 = new AmazonS3Client(credentialsProvider);
s3.setEndpoint("s3.us-east-2.amazonaws.com");
Ian Darke
źródło
1

Zasadniczo błąd był spowodowany tym, że używałem starej wersji aws-sdk i zaktualizowałem wersję, więc ten błąd wystąpił.

w moim przypadku z node js, którego signatureVersionużywałem w obiekcie Parmas w następujący sposób:

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

Potem umieściłem podpis z obiektu params i zadziałałem jak czar:

const AWS_S3 = new AWS.S3({
  params: {
    Bucket: process.env.AWS_S3_BUCKET,
    region: process.env.AWS_S3_REGION
  },
  signatureVersion: 'v4'
});
Salahudin Malik
źródło
1

Sprawdź region wiadra AWS S3 i podaj odpowiedni region w żądaniu połączenia.

W My Senario ustawiłem „ APSouth1 ” dla Azji i Pacyfiku (Bombaj)

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);
}
Ravi Oza
źródło
1

W przypadku Boto3 użyj tego kodu.

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')
        )
Pushplata
źródło
1

Kod dla Flask (boto3)

Nie zapomnij zaimportować Config. Jeśli masz własną klasę konfiguracyjną, zmień jej nazwę.

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)
P.Gupta
źródło
1

W moim przypadku typ żądania był nieprawidłowy. Używałem GET (głupi) To musi być PUT.

ManiKandan Selvanathan
źródło
Uratowałem mój dzień, w moim przypadku korzystałem z POST.
Shahid Kamal
1

Odpowiedź Supernova dla django / boto3 / django-storages działała ze mną:

AWS_S3_REGION_NAME = "ap-south-1"

Lub poprzednia wersja boto3 1.4.4:

AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = „s3v4”

po prostu dodaj je do swojego settings.py i odpowiednio zmień kod regionu

możesz sprawdzić regiony aws z: wprowadź opis linku tutaj

Rezan Moh
źródło
0

Czasami domyślna wersja nie zostanie zaktualizowana. Dodaj to polecenie

AWS_S3_SIGNATURE_VERSION = "s3v4"

w settings.py

gokul krishna
źródło
0

Wypróbuj tę kombinację.

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
});
Ankit Kumar Rajpoot
źródło
0

Utknąłem na 3 dni iw końcu po przeczytaniu mnóstwa blogów i odpowiedzi udało mi się skonfigurować Amazon AWS S3 Bucket.

Po stronie AWS

Zakładam, że już to zrobiłeś

  1. Utworzono wiadro s3
  2. Utworzono użytkownika w IAM

Kroki

  1. Skonfiguruj ustawienia CORS

    masz wiadro> uprawnienia> konfiguracja CORS

    <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    </CORSConfiguration>```
    
    
  2. Wygeneruj zasady zasobnika

twój zasobnik> uprawnienia> zasady zasobnika

Powinien być podobny do tego

 {
     "Version": "2012-10-17",
     "Id": "Policy1602480700663",
     "Statement": [
         {
             "Sid": "Stmt1602480694902",
             "Effect": "Allow",
             "Principal": "*",
             "Action": "s3:GetObject",
             "Resource": "arn:aws:s3:::harshit-portfolio-bucket/*"
         }
     ]
 }
PS: Bucket policy should say `public` after this 
  1. Skonfiguruj listę kontroli dostępu

twój zasobnik> uprawnienia> lista kontroli dostępu

dać publiczny dostęp

PS: Lista kontroli dostępu powinna powiedzieć publicpo tym

  1. Odblokuj dostęp publiczny

Twój zasobnik> uprawnienia> Zablokuj dostęp publiczny

Edytuj i wyłącz wszystkie opcje

** Na marginesie, jeśli pracujesz na django, dodaj następujące linie do settings.pypliku swojego projektu **

#S3 BUCKETS CONFIG

AWS_ACCESS_KEY_ID = '****not to be shared*****'
AWS_SECRET_ACCESS_KEY = '*****not to be shared******'
AWS_STORAGE_BUCKET_NAME = 'your-bucket-name'

AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

# look for files first in aws 
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

# In India these settings work
AWS_S3_REGION_NAME = "ap-south-1"
AWS_S3_SIGNATURE_VERSION = "s3v4"

Harshit Gangwar
źródło