是否需要在S3中公开音频文件以便在Alexa设备上播放

时间:2019-05-24 13:10:35

标签: alexa alexa-skills-kit

我正在做一项alexa技能,用户可以听我在S3中上传的音频,但是直到我将它们公开后,这些音频才能播放,有什么办法可以解决?为什么要求将文件公开,这有风险吗?

他们在javascript中提出了一种建议,他们在Utils软件包中提供了一个名为“ getS3PreSignedURL”的函数,它将使对象公开60秒,但是如果我的音频播放超过60秒并且我正在工作在Java上,我对javascript不太自信。 如果有人遇到类似问题,任何想法都会有所帮助。

2 个答案:

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