是否有必要在 S3 中制作音频文件 public 以便在 alexa 设备上播放
Is it neccesary to make audio files public in S3 in order to play on alexa devices
我正在制作一个 alexa 技能,用户可以在其中收听我在 S3 中上传的音频,但是这些在我制作它们之前不会播放 public,有什么办法可以解决这个问题吗?为什么要制作文件public,是不是有风险?
他们在 javascript 中建议了一种方法,他们在他们的 Utils 包中提供了一个 api 名称为 "getS3PreSignedURL" 的函数,它将使对象 public 用于60 秒,但如果我的音频播放超过 60 秒并且我正在 Java 上工作,我对 javascript 不太自信怎么办?
有没有人遇到过类似的问题,任何想法都会有所帮助。
见AWS S3 Public Object vs Private Object?
我认为这回答了您对风险的担忧以及其他一些选择。
您也许还可以找到一个参数来使该函数 return 更长 window - 顺便说一句,看起来它仍在验证您的用户使用该 link,而不是真正做到 public(任何人无需身份验证即可使用)。
如您所述,您可以使用预签名的 S3 url。 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;
}
}
请注意,此代码使用的是 node.js 的标准 AWS SDK。 S3 存储桶是从环境 process.env.S3_PERSISTENCE_BUCKET
中获取的,并且是一个施加 60 秒超时的存储桶。如果您将 Expires
属性 更改为超过 60 秒,如果您在 1 分钟后尝试,基本上将无法检索预签名的 url。但是,如果您在那里传递自己的存储桶(并将其分配给 bucketName
),该存储桶已正确配置为支持预签名 url 和大于 60 秒的超时,那么没有什么可以阻止您重用此代码(或 Java 中的等效代码),并获得预签名的 url 和您想要的任何到期时间。参数s3ObjectKey
是文件在桶中的相对路径。要在 Java 中执行此操作,您必须使用 this SDK instead。
我正在制作一个 alexa 技能,用户可以在其中收听我在 S3 中上传的音频,但是这些在我制作它们之前不会播放 public,有什么办法可以解决这个问题吗?为什么要制作文件public,是不是有风险?
他们在 javascript 中建议了一种方法,他们在他们的 Utils 包中提供了一个 api 名称为 "getS3PreSignedURL" 的函数,它将使对象 public 用于60 秒,但如果我的音频播放超过 60 秒并且我正在 Java 上工作,我对 javascript 不太自信怎么办? 有没有人遇到过类似的问题,任何想法都会有所帮助。
见AWS S3 Public Object vs Private Object?
我认为这回答了您对风险的担忧以及其他一些选择。
您也许还可以找到一个参数来使该函数 return 更长 window - 顺便说一句,看起来它仍在验证您的用户使用该 link,而不是真正做到 public(任何人无需身份验证即可使用)。
如您所述,您可以使用预签名的 S3 url。 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;
}
}
请注意,此代码使用的是 node.js 的标准 AWS SDK。 S3 存储桶是从环境 process.env.S3_PERSISTENCE_BUCKET
中获取的,并且是一个施加 60 秒超时的存储桶。如果您将 Expires
属性 更改为超过 60 秒,如果您在 1 分钟后尝试,基本上将无法检索预签名的 url。但是,如果您在那里传递自己的存储桶(并将其分配给 bucketName
),该存储桶已正确配置为支持预签名 url 和大于 60 秒的超时,那么没有什么可以阻止您重用此代码(或 Java 中的等效代码),并获得预签名的 url 和您想要的任何到期时间。参数s3ObjectKey
是文件在桶中的相对路径。要在 Java 中执行此操作,您必须使用 this SDK instead。