Saya menggunakan NodeJS AWS SDK untuk menghasilkan URL S3 presigned. Dokumen memberikan contoh menghasilkan URL yang telah ditetapkan sebelumnya .
Ini kode persis saya (dengan info sensitif dihilangkan):
const AWS = require('aws-sdk')
const s3 = new AWS.S3()
AWS.config.update({accessKeyId: 'id-omitted', secretAccessKey: 'key-omitted'})
// Tried with and without this. Since s3 is not region-specific, I don't
// think it should be necessary.
// AWS.config.update({region: 'us-west-2'})
const myBucket = 'bucket-name'
const myKey = 'file-name.pdf'
const signedUrlExpireSeconds = 60 * 5
const url = s3.getSignedUrl('getObject', {
Bucket: myBucket,
Key: myKey,
Expires: signedUrlExpireSeconds
})
console.log(url)
URL yang dihasilkan terlihat seperti ini:
https://bucket-name.s3-us-west-2.amazonaws.com/file-name.pdf?AWSAccessKeyId=[access-key-omitted]&Expires=1470666057&Signature=[signature-omitted]
Saya menyalin URL itu ke browser saya dan mendapatkan tanggapan berikut:
<Error>
<Code>NoSuchBucket</Code>
<Message>The specified bucket does not exist</Message>
<BucketName>[bucket-name-omitted]</BucketName>
<RequestId>D1A358D276305A5C</RequestId>
<HostId>
bz2OxmZcEM2173kXEDbKIZrlX508qSv+CVydHz3w6FFPFwC0CtaCa/TqDQYDmHQdI1oMlc07wWk=
</HostId>
</Error>
Saya tahu ember itu ada. Saat saya menavigasi ke item ini melalui AWS Web GUI dan mengklik dua kali di atasnya, ini akan membuka objek dengan URL dan berfungsi dengan baik:
https://s3-us-west-2.amazonaws.com/[bucket-name-omitted]/[file-name-omitted].pdf?X-Amz-Date=20160808T141832Z&X-Amz-Expires=300&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Signature=[signature-omitted]&X-Amz-Credential=ASIAJKXDBR5CW3XXF5VQ/20160808/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=Host&x-amz-security-token=[really-long-key]
Jadi saya dibuat percaya bahwa saya pasti melakukan sesuatu yang salah dengan cara saya menggunakan SDK.
NoSuchBucket
berarti nama keranjang yang ditampilkanhttps://>>>here<<<.s3-us-west-2.amazonaws.com
di URL tidak ada. Tidak ada dalam proses penandatanganan, kebijakan, izin, kunci, atau rahasia Anda yang dapat menghasilkan kesalahan khusus ini.new AWS.S3({ signatureVersion: 'v4' })
memaksa Signature Versi 4. Ini adalah persyaratan bagi saya dengan objek terenkripsi SSE KMS.Jawaban:
Dustin,
Kode Anda benar, periksa kembali berikut ini:
Kebijakan akses keranjang Anda.
Izin keranjang Anda melalui kunci API Anda.
Kunci dan rahasia API Anda.
Nama dan kunci keranjang Anda.
sumber
Saya memiliki kasus penggunaan di mana menggunakan node.js; Saya ingin mendapatkan objek dari s3 dan mendownloadnya ke beberapa lokasi sementara dan kemudian memberikannya sebagai lampiran ke layanan pihak ketiga! Beginilah cara saya memecahkan kode:
Ini dapat membantu siapa pun; jika ada kasus penggunaan yang sama; chekout link di bawah ini ; https://medium.com/@prateekgawarle183/fetch-file-from-aws-s3-using-pre-signed-url-and-store-it-into-local-system-879194bfdcf4
sumber
Karena pertanyaan ini sangat populer dan jawaban paling populer adalah mengatakan kode Anda benar, tetapi ada sedikit masalah dalam kode yang mungkin menyebabkan masalah yang membuat frustrasi. Jadi, inilah kode yang berfungsi
sumber
Coba fungsi ini dengan janji.
sumber