我正在做一项alexa技能,用户可以听我在S3中上传的音频,但是直到我将它们公开后,这些音频才能播放,有什么办法可以解决?为什么要求将文件公开,这有风险吗?
他们在javascript中提出了一种建议,他们在Utils软件包中提供了一个名为“ getS3PreSignedURL”的函数,它将使对象公开60秒,但是如果我的音频播放超过60秒并且我正在工作在Java上,我对javascript不太自信。 如果有人遇到类似问题,任何想法都会有所帮助。
答案 0 :(得分:1)
请参见AWS S3 Public Object vs Private Object?
我认为这可以回答您对风险的担忧以及其他一些选择。
您也许还可以找到一个参数,以使该函数返回更长的窗口-顺便说一句,看起来它仍在验证用户使用该链接,而不是将其真正公开(可供没有身份验证)。
答案 1 :(得分:0)
正如您提到的,您可以使用S3预签名网址。 Alexa Hosted Skills中使用的限制为60秒,但这是在S3端强制执行的。您可以配置自己的S3存储桶以支持此操作并设置自定义超时。如果您使用Alexa托管技能检查文件util.js
,您将看到类似以下内容:
const AWS = require('aws-sdk');
const s3SigV4Client = new AWS.S3({
signatureVersion: 'v4'
});
module.exports = {
getS3PreSignedUrl(s3ObjectKey) {
const bucketName = process.env.S3_PERSISTENCE_BUCKET;
const s3PreSignedUrl = s3SigV4Client.getSignedUrl('getObject', {
Bucket: bucketName,
Key: s3ObjectKey,
Expires: 60*1 // the Expires is capped for 1 minute
});
console.log(`Util.s3PreSignedUrl: ${s3ObjectKey} URL ${s3PreSignedUrl}`);
return s3PreSignedUrl;
}
}
请注意,此代码正在将标准AWS开发工具包用于node.js。 S3存储桶是从环境process.env.S3_PERSISTENCE_BUCKET
中提取的,它具有60秒的超时时间。如果将Expires
属性更改为60秒以上,则基本上无法检索预签名的url。但是,如果您在此处传递自己的存储桶(并将其分配给bucketName
),并且该存储桶已正确配置为支持预签名的url和超过60秒的超时,则不会阻止您重用此代码(或Java中的等效代码) ),并获取带有任何所需过期时间的预签名网址。参数s3ObjectKey
是存储桶中文件的相对路径。为此,您必须使用Java this SDK instead。