s3预签名的url Javascript代码未返回完整url

问题描述

我正在尝试为s3存储桶中的文件生成预签名的url,这样我站点用户将没有指向实际文件链接。我一直在尝试使用以下代码

const AWS = require('aws-sdk');
const s3 = new AWS.S3()
    AWS.config.update({accessKeyId: 'AKIAVXSBEXAMPLE',secretAccessKey: 'EXAMPLE5ig8MDGZD8p8iTj7t3KEXAMPLE'})

    // Tried with and without this. Since s3 is not region-specific,I don't
    // think it should be necessary.
    AWS.config.update({region: 'eu-west-2'})

    const myBucket = 'bucketexample'
    const myKey = 'example.png'
    const signedUrlExpireSeconds = 60 * 5

    const url = s3.getSignedUrl('getobject',{
        Bucket: myBucket,Key: myKey,Expires: signedUrlExpireSeconds
    })
    setTimeout(function(){ console.log("url",url); },3000);
    console.log("url:",url)

但是它返回的全部是:“ https://s3.amazonaws.com/”

我也尝试使用此代码

const AWS = require('aws-sdk');
var s3 = new AWS.S3();
    var params = {Bucket: 'bucketexample',Key: 'example.png'};
    s3.getSignedUrl('putObject',params,function (err,url) {
       console.log('The URL is',url);
    });

不返回任何内容。有谁知道为什么他们不返回有效的网址?

解决方法

我遇到了类似的问题。当AWS开发工具包返回https://s3.amazonaws.com/时,是由于机器没有适当的权限。这可能令人沮丧,我认为AWS应该返回描述性错误消息,而不仅仅是返回错误的URL。

我建议您为计算机配置AWS凭证或在AWS中为其赋予角色。尽管您应该能够像在代码片段中那样通过代码输入凭据,但是无论出于何种原因,这对我也不起作用。

对我有用的是更新计算机的默认AWS凭证或为已部署的服务器添加适当的角色。

,

我遇到了类似的问题,就像我使用时一样,我得到的签名 URL 不完整:

    let url = await s3.getSignedUrl("getObject",{
  Bucket: bucket,Key: s3FileLocation,Expires: ttlInSeconds,});

然后我改用了 Promise 函数:

// 我在里面使用了它和异步函数

let url = await s3.getSignedUrlPromise("getObject",{ 桶:桶, 键:s3FileLocation, 过期时间:ttlInSeconds, });

它返回了完整的签名 URL。

/** 注意:

如果您在尝试使用签名 URL 访问对象时收到此消息。

    <Error>
<Code>InvalidArgument</Code>
<Message>Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4.</Message>

然后在初始化 s3 时使用它:

const s3 = new AWS.S3({"signatureVersion":"v4"});