簡體   English   中英

如何在 NodeJS 中創建預簽名的 url 以從 AWS-s3 存儲桶下載文件 36 小時?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM