在传递参数之前,S3签名的URL已过期 [英] S3 Signed Url's expiring before argument passed

查看:0
本文介绍了在传递参数之前,S3签名的URL已过期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为S3存储桶对象生成签名URL,最大过期时间为604800秒或7天。然而,在测试后,我发现这些链接在24小时内到期。在做一些深入调查时,我发现这篇文章声称,只有当AWS-SDK获得IAM用户授权并且S3库使用AWS Signature v4时,7天过期才可用。

我肯定在使用v4:exports.getS3 = () => new AWS.S3({region : 'us-east-1', signatureVersion: 'v4'})

另外,据我所知,在没有任何其他操作的情况下使用SDK时,通过Serverless部署的lambdas应该默认为我的IAM用户凭据:const AWS = require('aws-sdk')

这是前面提到的文章:https://aws.amazon.com/premiumsupport/knowledge-center/presigned-url-s3-bucket-expiration/

我还定义了委派给我的用户的IAM角色以启用对S3的访问iamRoleStatements: - Effect: Allow Action: - dynamodb:* Resource: "*" - Effect: Allow Action: - ssm:* Resource: "*" - Effect: Allow Action: - s3:* Resource: "*"

我已验证这不是传递错误参数那么愚蠢的事情exports.getSignedURL = (key,bucket,method,expiration) =>{ console.log(`GETTING SIGNED URL WITH EXPIRATION ${expiration}`) return new Promise((resolve, reject) => { exports.getS3().getSignedUrl(method,{ Bucket: bucket, Key : key, Expires : expiration },(err,url)=>err?reject(err):resolve(url)) }); }

有没有人遇到过这个问题,或者知道是什么原因导致了我的问题?我是否遗漏了某些配置?

推荐答案

使用serverless部署的Lambda函数不会默认使用您的iam用户凭据。它们使用您在serverless.yml中提供的IAM角色/策略,以及由serverless

自动生成的基本CloudWatch Logs权限 问题是您的Lambda函数使用来自STS的临时凭据(通过假定的IAM角色)来生成预签名的URL。该URL将在临时会话令牌过期时过期(如果您明确指示较早的超时,则会更早过期)。

如果您使用IAM用户凭据,而不是通过IAM角色使用临时凭据,则可以将有效期延长至7天(使用签名v4)或end of epoch(使用potentially deprecated签名v2)。因此,您需要为Lambda函数提供IAM用户凭据,可能是通过环境变量、AWS参数存储或AWS Secrets Manager。

有关详细信息,请参阅Why is my presigned URL for an Amazon S3 bucket expiring before the expiration time that I specified?

此外,这里还有几个次要的编码问题:

  • 所有AWS方法都有一个.Promise()选项来返回Promise,因此无需使用回调,也无需手动创建Promise对象
  • 虽然getSignedUrl方法提供了一个异步选项,但操作本身是同步的,因此您只需运行const url = s3.getSignedUrl(...)

这篇关于在传递参数之前,S3签名的URL已过期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆