【问题标题】:How to Get Signed S3 Url in AWS-SDK JS Version 3?如何在 AWS-SDK JS 版本 3 中获取签名的 S3 Url?
【发布时间】:2020-10-18 03:39:56
【问题描述】:

我正在关注 Trivikr 的 proposed solution 添加对 s3.getSignedUrl api 的支持,该 API 目前在较新的 v3 中不可用。我正在尝试创建一个签名的 url 来从存储桶中获取一个对象。

为方便起见,代码添加如下:

const { S3, GetObjectCommand } = require("@aws-sdk/client-s3"); // 1.0.0-gamma.2 version
const { S3RequestPresigner } = require("@aws-sdk/s3-request-presigner"); // 0.1.0-preview.2 version
const { createRequest } = require("@aws-sdk/util-create-request"); // 0.1.0-preview.2 version
const { formatUrl } = require("@aws-sdk/util-format-url"); // 0.1.0-preview.1 //version
const fetch = require("node-fetch");

(async () => {
 try {

  const region = "us-east-1";
  const Bucket = `SOME_BUCKET_NAME`;
  const Key = `SOME_KEY_VALUE`;
  const credentials = {
      accessKeyId: ACCESS_KEY_HERE,
      secretAccessKey: SECRET_KEY_HERE,
      sessionToken: SESSION_TOKEN_HERE
  };

  const S3Client = new S3({ region, credentials, signatureVersion: 'v4' });

  console.log('1'); // for quick debugging

  const signer = new S3RequestPresigner({ ...S3Client.config });

  console.log('2') 

  const request = await createRequest(
      S3Client,
      new GetObjectCommand({ Key, Bucket })
  );

  console.log('3');

  let signedUrl = formatUrl(await signer.presign(request));

  console.log(signedUrl);
  
  let response = await fetch(signedUrl);
  console.log("Response", response);

 }catch(e) {
    console.error(e);
 }

我成功创建了S3Clientsigner,但是在创建request 时,出现以下错误:

clientStack.concat(...).filter 不是函数

我做错了什么?

另请注意,我使用webpack 进行捆绑

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-sdk-js aws-sdk-nodejs


    【解决方案1】:

    只需在 TypeScript 中添加我的示例:

    import { S3Client, GetObjectCommand, S3ClientConfig } from '@aws-sdk/client-s3';
    import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
    
    
    const s3Configuration: S3ClientConfig = {
        credentials: {
            accessKeyId: '<ACCESS_KEY_ID>',
            secretAccessKey: '<SECRET_ACCESS_KEY>'
        },
        region: '<REGION>',
    };
    const s3 = new S3Client(s3Configuration);
    const url = await getSignedUrl(s3, new GetObjectCommand({Bucket: '<BUCKET>', Key: '<KEY>' }), { expiresIn: 15 * 60 }); // expires in seconds
    console.log('Presigned URL: ', url);
    

    【讨论】:

    • 非常感谢,Tri。这到底是在哪里记录的?
    • 这是几天前正式发布的新模块化 aws-sdk。在我写这个问题的时候,它处于测试阶段。您可以在github页面上查看信息
    • 非常感谢,@Waleed93。对于其他人here is a link 文档。
    • 谢谢,我在他们的文档中找不到 GetObjectCommand 的参数
    【解决方案2】:

    已解决

    我最终通过安装beta 版本而不是preview(默认)版本成功地制作了签名网址

    【讨论】:

      猜你喜欢
      • 2022-07-22
      • 2021-07-21
      • 2022-10-20
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 2019-05-13
      相关资源
      最近更新 更多