Saya telah mencari di web selama lebih dari dua hari sekarang, dan mungkin telah melihat sebagian besar skenario dan solusi yang didokumentasikan secara online, tetapi sejauh ini tidak ada yang berhasil untuk saya.
Saya menggunakan AWS SDK untuk PHP V2.8.7 yang berjalan di PHP 5.3.
Saya mencoba menghubungkan ke bucket S3 saya dengan kode berikut:
// Create a `Aws` object using a configuration file
$aws = Aws::factory('config.php');
// Get the client from the service locator by namespace
$s3Client = $aws->get('s3');
$bucket = "xxx";
$keyname = "xxx";
try {
$result = $s3Client->putObject(array(
'Bucket' => $bucket,
'Key' => $keyname,
'Body' => 'Hello World!'
));
$file_error = false;
} catch (Exception $e) {
$file_error = true;
echo $e->getMessage();
die();
}
//
File config.php saya adalah sebagai berikut:
<?php
return array(
// Bootstrap the configuration file with AWS specific features
'includes' => array('_aws'),
'services' => array(
// All AWS clients extend from 'default_settings'. Here we are
// overriding 'default_settings' with our default credentials and
// providing a default region setting.
'default_settings' => array(
'params' => array(
'credentials' => array(
'key' => 'key',
'secret' => 'secret'
)
)
)
)
);
Ini menghasilkan kesalahan berikut:
Tanda tangan permintaan yang kami hitung tidak cocok dengan tanda tangan yang Anda berikan. Periksa kunci dan metode penandatanganan Anda.
Saya sudah memeriksa kunci akses dan rahasia saya setidaknya 20 kali, menghasilkan yang baru, menggunakan metode berbeda untuk menyampaikan informasi (yaitu profil dan memasukkan kredensial dalam kode) tetapi tidak ada yang berfungsi saat ini.
sumber
secret
tinggi), dan menggunakannya untuk menghitung tanda tangan berdasarkan kunci akses Anda, stempel waktu saat ini, ditambah banyak faktor lainnya. Lihat docs.aws.amazon.com/general/latest/gr/… . Ini adalah longshot, tetapi mengingat bahwa mereka menyertakan stempel waktu, mungkin waktu lingkungan lokal Anda tidak aktif?Content-Length
) dalam metadata objek. (Versi panjang: kami secara langsung meneruskan aliran input dari JavaHttpServletRequest
ke klien S3, dan meneruskanrequest.getContentLength()
sebagaiContent-Length
melalui metadata; ketika servlet (secara acak) menerima permintaan potongan (Transfer-Encoding: chunked
),getContentLength()
kembali-1
- yang menyebabkanputObject
gagal (secara acak). Tidak jelas; tapi jelas kesalahan kami karena kami melewati ukuran objek yang salah.)Jawaban:
Setelah dua hari debugging, saya akhirnya menemukan masalahnya ...
Kunci yang saya tetapkan ke objek dimulai dengan periode yaitu
..\images\ABC.jpg
, dan ini menyebabkan terjadinya kesalahan.Saya berharap API memberikan pesan kesalahan yang lebih bermakna dan relevan, sayangnya, saya harap ini akan membantu orang lain di luar sana!
sumber
+
di kunci saya.Content-Type
tajuk dalam permintaan file unggahan sayaSaya mendapatkan kesalahan ini dengan kredensial yang salah. Saya pikir ada karakter yang tidak terlihat ketika saya menempelkannya pada awalnya.
sumber
key_hash_lala/key_hash_continues
dan memilih hanya satu bagian. Sayangnya, seberapa sulit memberi tahu pengguna "kata sandi salah, bung!"?Saya mengalami masalah yang sama ketika mencoba menyalin objek dengan beberapa karakter UTF8. Di bawah ini adalah contoh JS:
Dipecahkan dengan mengenkode CopySource dengan
encodeURIComponent()
sumber
Kesalahan ini tampaknya terjadi terutama jika ada spasi sebelum atau sesudah kunci rahasia Anda
sumber
Sebenarnya di Java saya mendapatkan kesalahan yang sama. Setelah menghabiskan 4 jam untuk men-debug apa yang saya temukan bahwa masalahnya ada di meta data di Objek S3 karena ada ruang saat duduk kontrol cache di file s3. Ruang ini diizinkan di 1.6. * versi tetapi di 1.11. * itu tidak diizinkan dan dengan demikian melemparkan kesalahan ketidakcocokan tanda tangan
sumber
Content-Length
dalam metadataBagi saya, saya menggunakan aksios dan dengan tuli mengirimkan header
jadi saya mengubah untuk mengirim:
dan juga harus menambahkan Jenis Konten ini ke tanda tangan AWS
sumber
Jika tidak ada solusi lain yang disebutkan berfungsi untuk Anda, coba gunakan
perintah ini akan membuka serangkaian opsi yang menanyakan kunci, wilayah, dan format keluaran.
Semoga ini membantu!
sumber
Dalam versi aws-php-sdk sebelumnya, sebelum metode dihentikan
S3Client::factory()
, Anda diizinkan untuk menempatkan bagian dari jalur file, atauKey
seperti yang disebut dalamS3Client->putObject()
parameter , pada parameter bucket. Saya memiliki manajer file dalam penggunaan produksi, menggunakan v2 SDK. Karena metode pabrik masih berfungsi, saya tidak mengunjungi kembali modul ini setelah memperbarui ke~3.70.0
. Hari ini saya menghabiskan bagian yang lebih baik dari dua jam men-debug mengapa saya mulai menerima kesalahan ini, dan itu berakhir karena parameter yang saya lewati (yang dulu berfungsi):Saya harus memindahkan
catsinhats
porsi jalur bucket / key saya keKey
parameter, seperti ini:Apa yang saya yakini sedang terjadi adalah bahwa
Bucket
nama tersebut sekarang sedang dikodekan URL. Setelah pemeriksaan lebih lanjut tentang pesan persis yang saya terima dari SDK, saya menemukan ini:Terjadi kesalahan saat menjalankan
PutObject
padahttps://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png
Kesalahan HTTP AWS: Kesalahan klien:
PUT https://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png
mengakibatkan403 Forbidden
Ini menunjukkan bahwa
/
I berikan keBucket
parameter saya telah melaluiurlencode()
dan sekarang%2F
.Cara kerja Tanda Tangan cukup rumit, tetapi masalahnya bermuara pada keranjang dan kunci digunakan untuk menghasilkan tanda tangan terenkripsi. Jika keduanya tidak sama persis pada klien pemanggil, dan di dalam AWS, maka permintaan akan ditolak dengan 403. Pesan kesalahan sebenarnya menunjukkan masalah:
Jadi, saya
Key
salah karena sayaBucket
salah.sumber
Saya mengalami kesalahan yang sama di nodejs. Tetapi menambahkan
signatureVersion
konstruktor s3 membantu saya:sumber
Dalam kasus saya, saya menggunakan
s3.getSignedUrl('getObject')
ketika saya perlu menggunakans3.getSignedUrl('putObject')
(karena saya menggunakan PUT untuk mengunggah file saya), itulah sebabnya tanda tangannya tidak cocok.sumber
Untuk set Python - signature_version s3v4
sumber
Saya baru saja mengalami ini mengunggah gambar ke S3 menggunakan AWS SDK dengan React Native. Ternyata itu disebabkan oleh
ContentEncoding
parameter.Menghapus parameter itu "memperbaiki" masalah.
sumber
Saya memiliki masalah yang sama. Saya memiliki metode default, PUT diatur untuk menentukan URL yang telah ditandatangani sebelumnya tetapi mencoba melakukan GET. Kesalahan ini terjadi karena ketidakcocokan metode.
sumber
Saya mengalami kesalahan yang serupa, tetapi bagi saya tampaknya itu disebabkan oleh penggunaan kembali pengguna IAM untuk bekerja dengan S3 di dua lingkungan Elastic Beanstalk yang berbeda. Saya menangani gejala tersebut dengan membuat pengguna IAM dengan izin yang sama untuk setiap lingkungan dan itu membuat kesalahan hilang.
sumber
Dalam kasus saya, saya mengurai url S3 ke dalam komponennya.
Sebagai contoh:
Diurai menjadi:
Memiliki bagian jalur yang berisi awalan '/' gagal dalam permintaan.
sumber
Masalah lain yang mungkin mungkin terjadi karena nilai meta mengandung karakter non US-ASCII. Bagi saya, ini membantu UrlEncode nilai saat menambahkannya ke putRequest:
request.Metadata.Add(AmzMetaPrefix + "artist", HttpUtility.UrlEncode(song.Artist)); request.Metadata.Add(AmzMetaPrefix + "title", HttpUtility.UrlEncode(song.Title));
sumber
Saya menyelesaikan masalah ini dengan mengubah izin publik pada bucket AWS s3 saya dan dengan menambahkan konfigurasi CORS di bawah ke pengaturan bucket saya.
Lihat dokumentasi AWS s3 untuk info lebih lanjut.
sumber
Sering kali ini terjadi karena kunci yang salah (AWS_SECRET_ACCESS_KEY). Harap verifikasi silang AWS_SECRET_ACCESS_KEY Anda. Semoga berhasil ...
sumber
Saya mendapat kesalahan ini saat mencoba menyalin objek. Saya memperbaikinya dengan mengenkode copySource. Ini sebenarnya dijelaskan dalam dokumentasi metode:
sumber
Dalam kasus saya, saya menggunakan S3 (huruf besar) sebagai nama layanan saat membuat permintaan menggunakan tukang pos dalam metode Otorisasi tanda tangan AWS
sumber
Setelah men-debug dan menghabiskan banyak waktu, dalam kasus saya, masalahnya adalah dengan access_key_id dan secret_access_key, cukup periksa kembali kredensial Anda atau buat yang baru jika memungkinkan dan pastikan Anda meneruskan kredensial di params.
sumber
Dalam kasus saya, nama bucket salah, itu termasuk bagian pertama dari kunci (bucketxxx / keyxxx) - tidak ada yang salah dengan tanda tangannya.
sumber
Dalam kasus saya (python) gagal karena saya memiliki dua baris kode ini di file, diwarisi dari kode yang lebih lama
http.client.HTTPConnection._http_vsn = 10 http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'
sumber
Saya menemukan ini dalam gambar Docker, dengan titik akhir S3 non-AWS, saat menggunakan
awscli
versi terbaru yang tersedia untuk peregangan Debian, yaitu versi 1.11.13.Mengupgrade ke CLI versi 1.16.84 menyelesaikan masalah.
Untuk menginstal CLI versi terbaru dengan Dockerfile berdasarkan image regangan Debian, alih-alih:
Menggunakan:
sumber
Saya harus mengatur
sebelumnya dengan ruby aws sdk v2 (mungkin ada yang mirip dengan ini di bahasa lain juga)
sumber
Saya tidak tahu apakah ada yang datang ke masalah ini saat mencoba menguji URL yang dikeluarkan di browser tetapi jika Anda menggunakan
Postman
dan mencoba menyalin url yang dihasilkan dari AWS dariRAW
tab, karena keluar dari garis miring terbalik Anda akan mendapatkan kesalahan di atas .Gunakan
Pretty
tab untuk menyalin dan menempel url untuk melihat apakah itu benar-benar berfungsi.Saya mengalami masalah ini baru-baru ini dan solusi ini menyelesaikan masalah saya. Ini untuk tujuan pengujian untuk melihat apakah Anda benar-benar mengambil data melalui url.
Jawaban ini adalah referensi bagi mereka yang mencoba menghasilkan unduhan, tautan sementara dari AWS atau secara umum membuat URL dari AWS untuk digunakan.
sumber
Masalah dalam kasus saya adalah URL API Gateway yang digunakan untuk mengonfigurasi Amplify yang memiliki garis miring ekstra di bagian akhir ...
Url yang ditanyakan tampak seperti
https://....amazonaws.com/myapi//myendpoint
. Saya menghapus garis miring ekstra di conf dan berhasil.Bukan pesan kesalahan paling eksplisit dalam hidup saya.
sumber
Dalam kasus saya, saya menelepon
s3request.promise().then()
tidak akurat yang menyebabkan dua eksekusi permintaan terjadi ketika hanya satu panggilan dilakukan.Yang saya maksud adalah bahwa saya melakukan iterasi melalui 6 objek tetapi 12 permintaan dibuat (Anda dapat memeriksa dengan masuk ke konsol atau jaringan debug di browser)
Karena stempel waktu untuk permintaan kedua, yang tidak diinginkan, tidak cocok dengan tanda pertama yang menghasilkan masalah ini.
sumber
Dapatkan kesalahan ini saat mengupload dokumen ke CloudSearch melalui Java SDK. Masalahnya karena karakter khusus dalam dokumen yang akan diunggah. Kesalahan "Tanda tangan permintaan yang kami hitung tidak cocok dengan tanda tangan yang Anda berikan. Periksa Kunci Akses Rahasia AWS dan metode penandatanganan." sangat menyesatkan.
sumber
membuat kunci akses baru berhasil untuk saya.
sumber