AWS S3 签名 url - X-Amz-Security-Token 过期太早

Str*_*Hat 6 amazon-s3 amazon-web-services aws-cloudformation pre-signed-url aws-lambda

我处于这种情况,我需要一个预签名的网址才能生存一个月左右。由于签名 v4 无法提供此功能,因此我决定暂时使用 V2。

我已将过期时间设置为 1 个月,但由于某种原因它会在 1 天后过期?(不知道具体到期时间,可能是同一天)

<Code>ExpiredToken</Code>
<Message>The provided token has expired.</Message>
Run Code Online (Sandbox Code Playgroud)

当我进一步深入研究时,问题似乎出在 X-Amz-Security-Token 上,它过期得太早了。但我不知道如何为此标头设置值?(找不到任何相关信息)

设置:它是一个 lambda 函数,可生成签名 url 以从 S3 获取文件。一切都是通过云信息来完成的。并使用 JavaScript SDK 完成

    const s3 = new AWS.S3({
    signatureVersion: 'v2',
    region: 'eu-west-1'
});

const bucketParam = {
    Bucket: 'test-bucket',
    Key: 'testFile-1111-2222',
    Expires: 2592000
};
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激

Dan*_*iel 6

我相信 Lambda 使用的 IAM 角色正在使用临时凭证,该凭证在链接之前过期。根据 AWS 的说法,您需要使用 IAM 用户和签名版本 = 4 生成预签名 URL,以使链接在 7 天后过期:

要创建有效期最长为 7 天的预签名 URL,请首先为您正在使用的 SDK 指定 IAM 用户凭证(访问密钥和秘密访问密钥)。然后,使用 AWS 签名版本 4 生成预签名 URL。

请参阅为什么我的 Amazon S3 存储桶的预签名 URL 在我指定的过期时间之前过期?更多细节

您应该尝试创建一个 IAM 用户来生成这些 URL,并实际使用其凭证并在 Lambda 函数中承担其角色(使用 STS)以生成 URL。并且不要忘记使用signatureVersion='s3v4'.

希望这可以帮助


Den*_*ger 1

策略“到期”字段不能比“x-amz-date”字段晚超过 7 天。

我没有找到解决这个问题的方法。这似乎被破坏了或者至少没有记录。解决方法似乎是在未来设置“x-amz-date”。虽然不直观,但这似乎是允许的,这使您能够在将来进一步设置到期时间。