在传递参数之前,S3签名的URL已过期 [英] S3 Signed Url's expiring before argument passed
问题描述
我正在尝试为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
此外,这里还有几个次要的编码问题:
- 所有AWS方法都有一个.Promise()选项来返回Promise,因此无需使用回调,也无需手动创建Promise对象
- 虽然
getSignedUrl
方法提供了一个异步选项,但操作本身是同步的,因此您只需运行const url = s3.getSignedUrl(...)
这篇关于在传递参数之前,S3签名的URL已过期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!