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 Standard
regionem.
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.
Odpowiedzi:
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 Standard
to dawna nazwa regionalnego wdrożenia S3 zlokalizowanego wus-east-1
regionie. 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.źródło
AWS4-HMAC-SHA256
zaimplementowali: github.com/s3tools/s3cmd/issues/402W przypadku węzła spróbuj
var s3 = new AWS.S3( { endpoint: 's3-eu-central-1.amazonaws.com', signatureVersion: 'v4', region: 'eu-central-1' } );
źródło
Należy ustawić
signatureVersion: 'v4'
naconfig
użycie nowej wersji znak:AWS.config.update({ signatureVersion: 'v4' });
Działa dla
JS
sdk.źródło
Dla osób używających
boto3
(Python SDK
) użyj poniższego kodufrom botocore.client import Config s3 = boto3.resource( 's3', aws_access_key_id='xxxxxx', aws_secret_access_key='xxxxxx', config=Config(signature_version='s3v4') )
źródło
AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2
więc dodałemregion_name='us-east-2'
do powyższego koduUżywałem Django i musiałem dodać te dodatkowe zmienne konfiguracyjne, aby to działało. (oprócz ustawień wymienionych w https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html ).
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"
źródło
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
signature
iregion
źródło
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.
źródło
W Javie musiałem ustawić właściwość
System.setProperty(SDKGlobalConfiguration.ENFORCE_S3_SIGV4_SYSTEM_PROPERTY, "true")
i dodaj region do instancji s3Client.
źródło
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')
źródło
W przypadku thumbor-aws, które używały konfiguracji boto, musiałem umieścić to w pliku
$AWS_CONFIG_FILE
Więc wszystko, co korzystało bezpośrednio z Boto bez zmian, może być przydatne
źródło
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");
źródło
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
signatureVersion
uż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' });
źródło
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); }
źródło
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') )
źródło
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)
źródło
W moim przypadku typ żądania był nieprawidłowy. Używałem GET (głupi) To musi być PUT.
źródło
Odpowiedź Supernova dla django / boto3 / django-storages działała ze mną:
po prostu dodaj je do swojego settings.py i odpowiednio zmień kod regionu
możesz sprawdzić regiony aws z: wprowadź opis linku tutaj
źródło
Czasami domyślna wersja nie zostanie zaktualizowana. Dodaj to polecenie
AWS_S3_SIGNATURE_VERSION = "s3v4"
w
settings.py
źródło
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 });
źródło
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ś
Kroki
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>```
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
twój zasobnik> uprawnienia> lista kontroli dostępu
dać publiczny dostęp
PS: Lista kontroli dostępu powinna powiedzieć
public
po tymTwó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.py
pliku 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"
źródło