Sağladığınız yetkilendirme mekanizması desteklenmiyor. Lütfen AWS4-HMAC-SHA256 kullanın


130

AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.Yeni Frankfurt bölgesinde S3 klasörüne dosya yüklemeyi denediğimde hata alıyorum . Hepsi US Standardbölge ile düzgün çalışır .

Senaryo:

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)

Nasıl düzeltilir?

Teşekkür ederim.


1
Bu cevap benim sorunum çözüldü stackoverflow.com/questions/34483795/...
Bahadır Taşdemir

Yanıtlar:


151

İmza Sürüm 4 olarak da bilinen AWS4-HMAC-SHA256 ("V4"), S3 tarafından desteklenen iki kimlik doğrulama düzeninden biridir.

Tüm bölgeler V4'ü destekler, ancak ABD Standardını¹ destekler ve diğer bölgelerin çoğu - ancak tümü değil - aynı zamanda daha eski olan İmza Sürüm 2'yi ("V2") destekler.

Http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html'ye göre ... Ocak 2014'ten sonra dağıtılan yeni S3 bölgeleri yalnızca V4'ü destekleyecektir.

Frankfurt, 2014'ün sonlarında tanıtıldığından, V2'yi desteklemiyor, bu da bu hatanın kullandığınızı gösteriyor.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html , bu özelliğe sahip bir SDK kullandığınızı varsayarak, çeşitli SDK'larda V4'ü nasıl etkinleştireceğinizi açıklar.

SDK'ların bazı eski sürümlerinin bu seçeneği desteklemeyebileceğini tahmin ediyorum, bu nedenle yukarıdakiler yardımcı olmazsa, kullandığınız SDK'nın daha yeni bir sürümüne ihtiyacınız olabilir.


¹ US Standard, bölgede bulunan S3 bölgesel dağıtımının eski adıdır us-east-1. Bu yanıt ilk yazıldığından beri, "Amazon S3, AWS bölgesel adlandırma kurallarıyla tutarlı olması için ABD Standart Bölgesini ABD Doğu (K.Virginia) Bölgesi olarak yeniden adlandırdı." Tüm pratik amaçlar için, bu yalnızca isimlendirmede bir değişikliktir.


Bu, Fedora 20 ile birlikte gelen s3cmd-1.5.0-0.alpha3.fc20.noarch'ı destekliyor. Ve görünüşe göre şimdilik en sonuncusu olan 1.5.0 -rc1'i de destekliyor .
David Tonhofer

1
Doğru görünüyor @DavidTonhofer. Görünüşe göre s3cmd geliştiricileri AWS4-HMAC-SHA256henüz uygulamamışlar: github.com/s3tools/s3cmd/issues/402
Michael - sqlbot

2
@ "Michael - sqlbot" Pekala, şimdilik "awscli" ye geçtim. Acelesi olanlar için: yum install python-pip; pip install awscli; aws configure; aws --region = eu-central-1 s3 ls s3: // $ BUCKET vb ...
David Tonhofer

aws-sdk v2, AWS4-HMAC-SHA256 "V4" kimlik doğrulamasını güzelce destekliyor gibi görünüyor (ilgili sorun )
Jeewes

thnx .. bu benim için yararlı
Manish Vadher

68

Düğümle deneyin

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

34

Sen koymalıdır signatureVersion: 'v4'içinde configyeni oturum sürümünü kullanmak için:

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

JSSDK için çalışıyor .


3
Günümü kurtardım! Bu seçeneğin neden daha fazla duyurulmadığından emin değilim
André Werlang

26

boto3( Python SDK) Kullanan kişiler için aşağıdaki kodu kullanın

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
Hata alıyorum AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 Bu yüzden region_name='us-east-2' yukarıdaki koda
ekledim

13

PHP SDK ile benzer sorun, bu çalışır:

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

Önemli olan, signatureveregion


Bölge belirtilmesi gerekiyor mu?
Chirag Mehta


3

Java'da bir özellik ayarlamam gerekiyordu

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

ve bölgeyi s3Client örneğine ekleyin.

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

3

Boto3 ile kod budur:

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

veya

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

s3_client'in iki kez mi var?
MH

2

Boto yapılandırmasını kullanan thumbor-aws için bunu $AWS_CONFIG_FILE

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

Yani botoyu doğrudan değiştirmeden kullanan her şey, bu yararlı olabilir.


2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

bu da 24 Saat sörf yaptıktan sonra zamanımı kurtardı ..


Bu harika çalışıyor, "ap-south-1" değilse bölge adını sizinkine uyacak şekilde değiştirmeniz
yeterlidir

Kod değişikliği gerekmez! Bu iki
ortamı

1

Android SDK için setEndpoint, kullanımdan kaldırılmış olmasına rağmen sorunu çözer.

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

1

Temel olarak hata, aws-sdk'nin eski sürümünü kullanmam ve sürümü güncellediğim için bu hatanın oluşmasıydı.

node js ile durumumda signatureVersionparmas nesnesinde şu şekilde kullanıyordum:

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

Sonra params nesnesinden bir imza attım ve çekicilik gibi çalıştım:

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

1

AWS S3 Kepçe Kontrol Bölgesi ve Bağlantı İsteği düzgün Bölge geçirin.

Senaryomda , Asya Pasifik (Mumbai) için ' APSouth1'i ayarladım

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 için bu kodu kullanın.

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

Bazen varsayılan sürüm güncellenmeyecektir. Bu komutu ekleyin

AWS_S3_SIGNATURE_VERSION = "s3v4"

içinde settings.py


0

Bu kombinasyonu deneyin.

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

Flask Kodu (boto3)

Config'i içe aktarmayı unutmayın. Ayrıca kendi yapılandırma sınıfınız varsa, adını değiştirin.

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)

0

Django / boto3 / django-storages için süpernova cevabı benimle çalıştı:

AWS_S3_REGION_NAME = "ap-south-1"

Veya boto3 1.4.4 sürümünden önce:

AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

sadece bunları settings.py dosyanıza ekleyin ve bölge kodunu buna göre değiştirin

aws bölgelerini şuradan kontrol edebilirsiniz: bağlantı açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.