Nodejs एडब्ल्यूएस एसडीके एस 3 प्रस्तुत URL उत्पन्न करता है


112

मैं एक निर्धारित S3 URL जनरेट करने के लिए NodeJS AWS SDK का उपयोग कर रहा हूं। डॉक्स एक निर्धारित URL जनरेट करने का एक उदाहरण देता है

यहाँ मेरा सटीक कोड है (संवेदनशील जानकारी के साथ छोड़ा गया):

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 उत्पन्न करता है वह इस तरह दिखता है:

https://bucket-name.s3-us-west-2.amazonaws.com/file-name.pdf?AWSAccessKeyId=[access-key-omitted]&Expires=1470666057&Signature=[signature-omitted]

मैं उस URL को अपने ब्राउज़र में कॉपी कर रहा हूं और निम्नलिखित प्रतिक्रिया प्राप्त कर रहा हूं:

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

मुझे पता है कि बाल्टी मौजूद है। जब मैं एडब्ल्यूएस वेब जीयूआई के माध्यम से इस आइटम पर नेविगेट करता हूं और उस पर डबल क्लिक करता हूं, तो यह यूआरएल के साथ ऑब्जेक्ट को खोलता है और ठीक काम करता है:

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]

इसलिए मुझे विश्वास है कि मैं एसडीके का उपयोग कर रहा हूं, मैं कुछ गलत कर रहा हूं।


1
अपने जनरेट किए गए URL को ध्यान से देखें। NoSuchBucketइसका मतलब https://>>>here<<<.s3-us-west-2.amazonaws.comहै कि URL में दिखाया गया बकेट नाम मौजूद नहीं है। आपकी हस्ताक्षर करने की प्रक्रिया, नीति, अनुमतियां, कुंजी या रहस्य में कुछ भी इस विशेष त्रुटि को उत्पन्न नहीं कर सकता है।
माइकल - sqlbot


@ डस्टिन कितना सुरक्षित है अगर एसीसी में कुंजी को उजागर किया गया है और प्रत्येक फ़ंक्शन कॉल पर url बदलता है
कैलाश योगेश्वर

SecretAccessKey को किसी सार्वजनिक स्थान पर रखना सुरक्षित नहीं है, जैसे URL और हाँ मेरा मानना ​​है कि URL हर बार बदलता है। @kailashyogeshwar
डस्टिन

5
उन लोगों के लिए जो यहां आए जैसे मैंने किया और मुझे सटीक उत्तर नहीं मिला, यही मेरी जरूरत थी। उपरोक्त प्रत्येक URL में एक अलग हस्ताक्षर संस्करण का उपयोग किया जा रहा है। S3 इंस्टेंस बनाने से पहले हस्ताक्षर संस्करण सेट करें या S3 के कॉन्फ़िगरेशन पर सेट करें। new AWS.S3({ signatureVersion: 'v4' })हस्ताक्षर संस्करण को बल देता है। यह SSE KMS एन्क्रिप्टेड ऑब्जेक्ट के साथ मेरे लिए एक आवश्यकता थी।
एरिक ई।

जवाबों:


99

डस्टिन,

आपका कोड सही है, निम्नलिखित की जांच करें:

  1. आपकी बकेट एक्सेस पॉलिसी।

  2. आपकी एपीआई कुंजी के माध्यम से आपकी बाल्टी की अनुमति।

  3. आपकी एपीआई कुंजी और रहस्य।

  4. आपका बकेट नाम और कुंजी।


92
शर्म की बात है, मैं अपने बाल्टी नाम में एक टाइपो था।
डस्टिन

36
क्लासिक। हम में से सबसे अच्छे के साथ भी होता है।
व्लाड ए। इओन्सकु

2

मेरे पास एक उपयोग का मामला था जहां नोड.जेएस का उपयोग किया गया था; मैं s3 से ऑब्जेक्ट प्राप्त करना चाहता था और इसे कुछ अस्थायी स्थान पर डाउनलोड करना चाहता था और फिर इसे थर्ड-पार्टी सर्विस के रूप में संलग्न करता था! इस तरह मैंने कोड को तोड़ दिया:

  1. साइन 3 से url प्राप्त करें
  2. ऑब्जेक्ट प्राप्त करने के लिए आराम कॉल करें
  3. स्थानीय स्थान पर लिखें

यह किसी की भी मदद कर सकता है; यदि समान उपयोग का मामला है; लिंक के नीचे chekout ; https://medium.com/@prateekgawarle183/fetch-file-from-aws-s3-using-pre-signed-url-and-store-it-into-local-system-879194bfdcf4


-1

इस फ़ंक्शन को वादे के साथ आज़माएं।

const AWS = require("aws-sdk");
const s3 = new AWS.S3({
  accessKeyId: 'AK--------------6U',
  secretAccessKey: 'kz---------------------------oGp',
  Bucket: 'bucket-name'
});

const getSingedUrl = async () => {    
  const params = {
    Bucket: 'bucket_name',
    Key: 'file-name.pdf',
    Expires: 60 * 5
  };

  try {
    const url = await new Promise((resolve, reject) => {
      s3.getSignedUrl('getObject', params, (err, url) => {
        err ? reject(err) : resolve(url);
      });
    });
    console.log(url)
  } catch (err) {
    if (err) {
      console.log(err)
    }
  }
}


getSingedUrl()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.