![](/img/trans.png)
[英]Nodejs - React download file from s3 bucket using pre-signed url
[英]How can I create a pre-signed url to download a file from an AWS-s3 Bucket for 36 hours in NodeJS?
我現在的 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;
雖然它正在工作,但到期時間忽略了參數“expires”,而是在似乎不到一小時的時間內到期。
我在AWS 文檔中讀到您需要使用 STS 創建有效期為 36 小時的鏈接,因此我在 AWS 中為我的 lambda function 創建了一個具有可信策略的 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({}, function(err, data) {
if (err) {
console.log(err, err.stack);
}
else {
console.log(data.Arn);
}
});
}
但是,我仍然不明白我將如何使用 STS 來創建預簽名的 url。
如果您閱讀getSignedUrl的文檔,您會看到到期時間以秒為單位,而不是以小時為單位:
Expires (Integer) — 默認值:900 — 預簽名的 URL 操作到期的秒數。默認為 15 分鍾。
我通過創建一個 IAM 角色來解決該問題,該角色有權在我的 S3 存儲桶中創建簽名的 url,並通過 AWS 中的信任策略選項將其設置為信任我的 lambda,然后更新 AWS-SDK 配置以使用由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'
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.