Nodejs AWS SDK S3 Tạo URL được chỉ định


112

Tôi đang sử dụng NodeJS AWS SDK để tạo URL S3 được chỉ định trước. Tài liệu đưa ra một ví dụ về việc tạo một URL được chỉ định trước .

Đây là mã chính xác của tôi (đã bỏ qua thông tin nhạy cảm):

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 tạo ra trông giống như sau:

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

Tôi đang sao chép URL đó vào trình duyệt của mình và nhận được phản hồi sau:

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

Tôi biết cái xô tồn tại. Khi tôi điều hướng đến mục này thông qua AWS Web GUI và nhấp đúp vào nó, nó sẽ mở đối tượng có URL và hoạt động tốt:

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]

Vì vậy, tôi tin rằng tôi phải làm gì đó sai với cách tôi sử dụng SDK.


1
Kiểm tra URL đã tạo của bạn một cách cẩn thận. NoSuchBucketcó nghĩa là tên nhóm được hiển thị https://>>>here<<<.s3-us-west-2.amazonaws.comtrong URL không tồn tại. Không có gì trong quy trình ký, chính sách, quyền, khóa hoặc bí mật của bạn có thể tạo ra lỗi cụ thể này.
Michael - sqlbot

8
Liên kết đến ví dụ tài liệu đã được chuyển đến docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/…
Joël

@Dustin có an toàn không nếu TRUY CẬP chính được tiếp xúc trong url và làm thay đổi url trên mỗi cuộc gọi chức năng
Kailash yogeshwar

Không an toàn khi đặt secretAccessKey ở nơi công cộng, chẳng hạn như URL và vâng, tôi tin rằng URL luôn thay đổi. @kailashyogeshwar
Dustin

5
Đối với những người đến đây như tôi đã làm và không nhận được câu trả lời chính xác, đây là những gì tôi cần. Có một phiên bản chữ ký khác đang được sử dụng trong mỗi URL ở trên. Đặt phiên bản chữ ký trước khi tạo phiên bản S3 hoặc đặt trong cấu hình của S3. new AWS.S3({ signatureVersion: 'v4' })buộc Phiên bản Chữ ký 4. Đây là yêu cầu đối với tôi với đối tượng được mã hóa SSE KMS.
Eric E.

Câu trả lời:


98

Dustin,

Mã của bạn là chính xác, hãy kiểm tra kỹ phần sau:

  1. Chính sách truy cập nhóm của bạn.

  2. Quyền nhóm của bạn thông qua khóa API của bạn.

  3. Khóa API và bí mật của bạn.

  4. Tên nhóm và khóa của bạn.


91
Thật đáng xấu hổ, tôi đã mắc lỗi đánh máy trong tên nhóm của mình.
Dustin

36
Cổ điển. Chuyện xảy ra với thứ tốt nhất của chúng tôi.
Vlad A. Ionescu

2

Tôi có một trường hợp sử dụng khi sử dụng node.js; Tôi muốn lấy đối tượng từ s3 và tải nó xuống một số vị trí tạm thời và sau đó cung cấp cho nó dưới dạng tệp đính kèm cho dịch vụ của bên thứ ba! Đây là cách tôi đã phá mã:

  1. lấy url đã ký từ s3
  2. thực hiện cuộc gọi nghỉ ngơi để lấy đối tượng
  3. viết nó vào vị trí địa phương

Nó có thể giúp ích cho bất kỳ ai; nếu có cùng một trường hợp sử dụng; chekout liên kết dưới đây ; https://medium.com/@prateekgawarle183/fetch-file-from-aws-s3-using-pre-signed-url-and-store-it-into-local-system-879194bfdcf4


-1

Hãy thử chức năng này với lời hứa.

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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.