Mekanisme otorisasi yang Anda berikan tidak didukung. Silakan gunakan AWS4-HMAC-SHA256

130

Saya mendapatkan kesalahan AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.ketika saya mencoba mengunggah file ke ember S3 di wilayah Frankfurt baru. Semua berfungsi dengan baik dengan US Standardwilayah.

Naskah:

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)

Bagaimana memperbaikinya?

Terima kasih.

Alexey
sumber
1
Jawaban ini memecahkan masalah saya: stackoverflow.com/questions/34483795/…
Bahadir Tasdemir

Jawaban:

151

AWS4-HMAC-SHA256, juga dikenal sebagai Signature Version 4, ("V4") adalah salah satu dari dua skema otentikasi yang didukung oleh S3.

Semua wilayah mendukung V4, tetapi AS-Standar¹, dan banyak - tetapi tidak semua - wilayah lain, juga mendukung yang lain, skema yang lebih lama, Signature Version 2 ("V2").

Menurut http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... daerah S3 baru yang digunakan setelah Januari, 2014 hanya akan mendukung V4.

Karena Frankfurt diperkenalkan pada akhir 2014, itu tidak mendukung V2, yang merupakan kesalahan ini menyarankan Anda gunakan.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html menjelaskan cara mengaktifkan V4 di berbagai SDK, dengan asumsi Anda menggunakan SDK yang memiliki kemampuan itu.

Saya berspekulasi bahwa beberapa versi SDK yang lebih lama mungkin tidak mendukung opsi ini, jadi jika hal di atas tidak membantu, Anda mungkin memerlukan rilis SDK yang Anda gunakan.


¹ US Standardadalah nama lama untuk penyebaran regional S3 yang berbasis di us-east-1wilayah tersebut. Sejak saat jawaban ini awalnya ditulis, "Amazon S3 mengubah nama Wilayah Standar AS menjadi Wilayah Timur AS (N. Virginia) agar konsisten dengan konvensi penamaan wilayah AWS." Untuk semua tujuan praktis, itu hanya perubahan dalam penamaan.

Michael - sqlbot
sumber
Tunggul ini s3cmd-1.5.0-0.alpha3.fc20.noarch yang datang dengan Fedora 20. Dan tampaknya juga tunggul 1.5.0-rc1 , yang terbaru untuk saat ini.
David Tonhofer
1
@ DavidTonhofer yang sepertinya benar. Sepertinya pengembang s3cmd belum AWS4-HMAC-SHA256menerapkan: github.com/s3tools/s3cmd/issues/402
Michael - sqlbot
2
@ "Michael - sqlbot" baik saya beralih ke "awscli" untuk saat ini. Bagi mereka yang terburu-buru: yum install python-pip; pip install awscli; aws configure; aws --region = eu-central-1 s3 ls s3: // $ BUCKET dll ...
David Tonhofer
aws-sdk v2 tampaknya mendukung otentikasi "V4" AWS4-HMAC-SHA256 dengan baik ( masalah terkait )
Jeewes
thnx .. ini berguna buat saya
Manish Vadher
68

Dengan simpul, coba

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

Anda harus menetapkan signatureVersion: 'v4'di configuntuk menggunakan versi tanda baru:

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

Bekerja untuk JSSDK.

Denis Rizun
sumber
3
Selamatkan hari saya! Tidak yakin mengapa opsi ini tidak dipublikasikan
André Werlang
26

Untuk orang yang menggunakan boto3( Python SDK) gunakan kode di bawah ini

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
sumber
4
Saya mendapatkan kesalahan AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 Jadi saya menambahkan region_name='us-east-2' kode di atas
Aseem
13

Masalah serupa dengan PHP SDK, ini berfungsi:

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

Bit penting adalah signaturedanregion

Pascal
sumber
Apakah wilayah harus ditentukan?
Chirag Mehta
3

Di Jawa saya harus mengatur properti

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

dan tambahkan region ke instance s3Client.

s3Client.setRegion(Region.getRegion(Regions.EU_CENTRAL_1))
Script Game
sumber
3

Dengan boto3, ini adalah kodenya:

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

atau

s3_client = boto3.client('s3', region_name='eu-central-1')
Benoit
sumber
Anda memiliki s3_client dua kali?
MH
2

Untuk thumbor-aws, yang menggunakan konfigurasi boto, saya harus meletakkan ini ke $AWS_CONFIG_FILE

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

Jadi apapun yang digunakan boto langsung tanpa perubahan, ini mungkin bermanfaat

higuita
sumber
2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

ini juga menghemat waktu saya setelah berselancar selama 24 jam ..

Smartybrainy
sumber
Ini berfungsi dengan baik, Anda hanya perlu mengubah nama wilayah sesuai dengan milik Anda jika bukan "ap-south-1"
Devman
Tidak diperlukan perubahan kode! Atur kedua env vars ini dan boto akan berfungsi dengan baik
Stevko
1

Untuk Android SDK, setEndpoint menyelesaikan masalah, meskipun sudah usang.

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
sumber
1

Pada dasarnya kesalahannya adalah karena saya menggunakan aws-sdk versi lama dan saya memperbarui versi sehingga kesalahan ini terjadi.

dalam kasus saya dengan simpul js yang saya gunakan signatureVersiondi objek parmas seperti ini:

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

Lalu saya menaruh tanda tangan dari objek params dan bekerja seperti pesona:

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

Periksa AWS S3 Bucket Region Anda dan Pass Region yang tepat dalam Permintaan Koneksi.

Di My Senario saya telah menetapkan ' APSouth1 ' untuk Asia Pasifik (Mumbai)

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
sumber
1

Untuk Boto3, gunakan kode ini.

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
sumber
1

Dalam kasus saya, jenis permintaan salah. Saya menggunakan GET (bisu) Pasti PUT.

ManiKandan Selvanathan
sumber
Menyelamatkan hari saya, dalam kasus saya saya menggunakan POST.
Shahid Kamal
0

Kadang versi default tidak akan diperbarui. Tambahkan perintah ini

AWS_S3_SIGNATURE_VERSION = "s3v4"

di settings.py

gokul krishna
sumber
0

Coba kombinasi ini.

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
sumber
0

Kode untuk Flask (boto3)

Jangan lupa untuk mengimpor Config. Juga Jika Anda memiliki kelas konfigurasi Anda sendiri, maka ubah namanya.

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
sumber