在参数传递之前,S3 Signed Url即将到期

时间:2019-09-04 15:12:15

标签: amazon-web-services amazon-s3 aws-lambda serverless-framework

我正在尝试为S3存储桶对象生成一个已签名的URL,最长到期时间为604800秒或7天。但是,经过测试,我发现链接会在24小时内失效。进行一些挖掘时,我发现这篇文章声称只有在IAM用户授权aws-sdk且s3库正在使用AWS Signature v4的情况下,才有7天有效期。

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

另外,据我所知,在不使用任何其他操作的情况下使用sdk时,通过无服务器部署的lambda应该默认为我的IAM用户凭据:

以下是上述文章:https://aws.amazon.com/premiumsupport/knowledge-center/presigned-url-s3-bucket-expiration/

我还定义了委派给我的用户的IAM角色,以允许访问s3 const AWS = require('aws-sdk')

我已经证实这不像传递错误的参数iamRoleStatements: - Effect: Allow Action: - dynamodb:* Resource: "*" - Effect: Allow Action: - ssm:* Resource: "*" - Effect: Allow Action: - s3:* Resource: "*"

那样愚蠢

有人遇到此问题或有任何想法可能导致我的问题吗?我缺少一些配置吗?

1 个答案:

答案 0 :(得分:1)

据我所知,用serverless部署的Lambda函数并不默认为您的IAM用户凭据。他们使用您在serverless.yml中提供的IAM角色/策略,以及由serverless

自动生成的基本CloudWatch Logs权限

问题是您的Lambda函数正在使用来自STS的临时凭据(通过假定的IAM角色)来生成预签名的URL。该网址将在临时会话令牌过期时(或在您明确指示更早的超时时过期)时过期。

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

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

此外,这里还有一些次要的编码问题:

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