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.


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.


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'
} );

34

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

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

Bekerja untuk JSSDK.


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')
)

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


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))

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')

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


2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

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


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");

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'
});

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);
}

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')
        )


0

Kadang versi default tidak akan diperbarui. Tambahkan perintah ini

AWS_S3_SIGNATURE_VERSION = "s3v4"

di settings.py


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
});

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.