问题描述
我正在尝试为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"});