微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 NodeJS 中创建预签名 url 以从 AWS-s3 存储桶下载文件 36 小时?

如何解决如何在 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 举报,一经查实,本站将立刻删除。