如何解决如何在 NodeJS 中创建预签名 url 以从 AWS-s3 存储桶下载文件 36 小时?
我现在的 aws-lambda 代码是:
'use strict';
const AWS = require('aws-sdk');
class AwsS3Repository {
constructor() {
this.s3 = new AWS.S3();
}
async getSignedUrl ({ bucketName,Key,Expires }) {
const params = {
Bucket: "bucket_name",Key: "key_name",Expires: 60 * 60 * 36,}
return this.s3.getSignedUrl('getobject',params);
}
}
module.exports = AwsS3Repository;
在它工作时,过期时间会忽略参数“过期”,而是在似乎不到一小时的时间内过期。
我在 AWS docs 中读到您需要使用 STS 创建有效期为 36 小时的链接,因此我在 AWS 中为我的 lambda 函数创建了一个具有可信策略的 STS,所以我'可以使用 STS.assume,如您在此示例中所见:
const AWS = require('aws-sdk');
// Set the region
AWS.config.update({region: 'REGION'});
var roletoAssume = {RoleArn: 'my_role',RoleSessionName: 'session1',DurationSeconds: 900,};
var roleCreds;
// Create the STS service object
var sts = new AWS.STS({apiVersion: '2011-06-15'});
//Assume Role
sts.assumeRole(roletoAssume,function(err,data) {
if (err) console.log(err,err.stack);
else{
roleCreds = {accessKeyId: data.Credentials.AccessKeyId,secretAccessKey: data.Credentials.SecretAccessKey,sessionToken: data.Credentials.SessionToken};
stsGetCallerIdentity(roleCreds);
}
});
//Get Arn of current identity
function stsGetCallerIdentity(creds) {
var stsParams = {credentials: creds };
// Create STS service object
var sts = new AWS.STS(stsParams);
sts.getCallerIdentity({},data) {
if (err) {
console.log(err,err.stack);
}
else {
console.log(data.Arn);
}
});
}
但是,我仍然不明白我将如何使用 STS 创建预签名 url。
解决方法
如果您阅读 getSignedUrl 的文档,您会看到过期时间是以秒为单位指定的,而不是以小时为单位:
Expires (Integer) — 默认值:900 — 预签名 URL 操作到期的秒数。默认为 15 分钟。
,我通过创建一个有权在我的 S3 存储桶中创建签名 url 的 IAM 角色并通过 AWS 中的信任策略选项将其设置为信任我的 lambda 来解决该问题,然后更新 AWS-SDK 配置以使用 IAM 凭证由 sts.assumeRole 方法返回。
async assumeRole() {
const roleToAssume = {
RoleArn: 'my-sts-role-in-aws',RoleSessionName: 'session1',DurationSeconds: 900,};
const sts = new AWS.STS({ apiVersion: '2011-06-15' });
const roleCreds = await sts.assumeRole(roleToAssume).promise()
AWS.config.update({
accessKeyId: roleCreds.accessKeyId,secretAccessKey: roleCreds.secretAccessKey,sessionToken: roleCreds.sessionToken,region: 'us-east-1',signatureVersion: 'v4'
});
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。