নোডেজস এডাব্লুএস এসডিকে এস 3 প্রেসারযুক্ত ইউআরএল উত্পন্ন করে


120

আমি প্রেসিডেন্ট এস 3 ইউআরএল তৈরি করতে নোডজেএস এডাব্লুএস এসডিকে ব্যবহার করছি। দস্তাবেজগুলি পূর্বনির্ধারিত ইউআরএল তৈরির উদাহরণ দেয়

এখানে আমার সঠিক কোড (সংবেদনশীল তথ্য বাদ দেওয়া সহ):

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]

সুতরাং আমাকে বিশ্বাস করতে পরিচালিত হয় যে আমি এসডিকে কীভাবে ব্যবহার করছি তাতে অবশ্যই আমার কিছু ভুল হতে হবে।


4
আপনার উত্পন্ন URL টি যত্ন সহকারে পরীক্ষা করুন। NoSuchBucketমানে https://>>>here<<<.s3-us-west-2.amazonaws.comইউআরএল-এ প্রদর্শিত বালতির নামটি বিদ্যমান নেই। আপনার স্বাক্ষর প্রক্রিয়া, নীতি, অনুমতি, কী বা গোপন কোনও কিছুই এই বিশেষ ত্রুটি তৈরি করতে পারে না।
মাইকেল - sqlbot

8
ডক উদাহরণ লিঙ্ক সরানো হয়েছে docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/...
জোএল

@ দুস্টিন এটি কতটা নিরাপদ যদি অ্যাকসেস কীটি ইউআরএলে প্রকাশিত হয় এবং প্রতিটি ফাংশন কলটিতে ইউআরএল পরিবর্তন করে
কৈলাশ যোগেশ্বর

সিক্রেটঅ্যাক্সেসকে কে কোনও সর্বজনীন জায়গায় রাখতে নিরাপদ নয় যেমন ইউআরএল এবং হ্যাঁ আমি বিশ্বাস করি যে প্রতিবার ইউআরএল পরিবর্তিত হয়। @ কৈলাশয়েগেশ্বর
ডাস্টিন

5
যারা এখানে এসেছেন তাদের মতো আমি যেমন করেছি এবং সঠিক উত্তরটি পাইনি, এটি আমার প্রয়োজন। উপরের প্রতিটি ইউআরএলতে আলাদা স্বাক্ষর সংস্করণ ব্যবহৃত হচ্ছে। এস 3 ইনস্ট্যান্স তৈরির আগে স্বাক্ষর সংস্করণ সেট করুন বা এস 3 এর কনফিগারেশনে সেট করুন। new AWS.S3({ signatureVersion: 'v4' })স্বাক্ষর সংস্করণ 4 জোর করে This
এরিক ই।

উত্তর:


104

ডাস্টিন,

আপনার কোড সঠিক, নিম্নলিখিত ডাবল চেক করুন:

  1. আপনার বালতি অ্যাক্সেস নীতি।

  2. আপনার এপিআই কী এর মাধ্যমে আপনার বালতি অনুমতি।

  3. আপনার এপিআই কী এবং গোপন।

  4. আপনার বালতি নাম এবং কী।


96
বিব্রতকরভাবে, আমার বালতির নামে একটি টাইপো ছিল।
ডাস্টিন

37
ক্লাসিক। আমাদের শ্রেষ্ঠ হবে।
ভ্লাদ এ। আইনেস্কু

4

যেহেতু এই প্রশ্নটি খুব জনপ্রিয় এবং সবচেয়ে জনপ্রিয় উত্তরটি বলেছে যে আপনার কোডটি সঠিক, তবে কোডটিতে কিছুটা সমস্যা রয়েছে যা হতাশার সমস্যার কারণ হতে পারে। সুতরাং, এখানে একটি কাজের কোড

    AWS.config.update({ 
        accessKeyId: ':)))',
        secretAccessKey: ':DDDD',
        region: 'ap-south-1',
        signatureVersion: 'v4'
    });

    const s3 = new AWS.S3()
    const myBucket = ':)))))'
    const myKey = ':DDDDDD'
    const signedUrlExpireSeconds = 60 * 5

    const url = s3.getSignedUrl('getObject', {
        Bucket: myBucket,
        Key: myKey,
        Expires: signedUrlExpireSeconds
    });

    console.log(url);

লক্ষণীয় পার্থক্য হ'ল কনফিগার আপডেটের পরে s3 অবজেক্ট তৈরি করা হয়, এটি ব্যতীত কনফিগারটি কার্যকর হয় না এবং উত্পন্ন url কাজ করে না।


2

নোড.জেএস ব্যবহার করার ক্ষেত্রে আমার একটি ব্যবহারের কেস ছিল; আমি এস 3 থেকে অবজেক্ট পেতে এবং এটি কিছু অস্থায়ী জায়গায় ডাউনলোড করতে এবং তারপরে এটি তৃতীয় পক্ষের পরিষেবাতে সংযুক্তি হিসাবে দিতে চেয়েছিলাম! এইভাবে আমি কোডটি ভঙ্গ করেছি:

  1. এস 3 থেকে স্বাক্ষরিত url পান get
  2. আপত্তি পেতে বিশ্রাম কল করুন
  3. স্থানীয় অবস্থান এ লিখুন

এটি কাউকে সাহায্য করতে পারে; যদি একই ব্যবহারের কেস থাকে; নিচে chekout লিংক ; https://medium.com/@prateekgawarle183/fetch-file-from-aws-s3- using-pre-sided-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()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.