s3 SignedUrl x-amz-security-token

Iva*_*nov 8 amazon-s3 amazon-web-services

const AWS = require('aws-sdk');

export function main (event, context, callback) {
  const s3 = new AWS.S3();
  const data = JSON.parse(event.body);`

  const s3Params = {
    Bucket: process.env.mediaFilesBucket,
    Key: data.name,
    ContentType: data.type,
    ACL: 'public-read',
  };

  const uploadURL = s3.getSignedUrl('putObject', s3Params);

  callback(null, {
    statusCode: 200,
    headers: {
      'Access-Control-Allow-Origin': '*'
    },
    body: JSON.stringify({ uploadURL: uploadURL }),
  })
}
Run Code Online (Sandbox Code Playgroud)

当我在本地测试它时,它工作正常,但在部署它后 x-amz-security-token,然后我得到拒绝访问的响应。我怎样才能摆脱这个 x-amz-security-token?

Sea*_*lan 11

我遇到了同样的问题。使用一切正常,serverless-offline但是当我部署到 Lambda 时,我开始收到AccessDenied有关 URL 的问题。在比较serverless-offline部署和 AWS 部署之间返回的 URL 时,我注意到唯一的区别是X-Amz-Security-Token在 URL 中包含作为查询字符串参数的 。经过一番挖掘,我发现分配的令牌是基于 lambda 函数所具有的假定角色。我所要做的就是为该角色授予适当的 S3 策略并且它起作用了。

  • 到目前为止,这不是最佳实践,但我与 Lambda 一起使用的角色的 S3FullAccess 解决了我的问题。 (3认同)

小智 3

我刚刚解决了一个非常相似的问题,可能与你的问题相同。我说可能是因为您没有说明部署对您来说意味着什么。我假设您正在部署到 Lambda,但您可能不会,这可能适用,也可能不适用,但如果您使用临时凭证,这将适用。

我最初使用了上面使用的方法,但后来使用 npm 模块aws-signature-v4来查看它是否不同,并且得到了与您相同的错误。

您将需要令牌,当您使用临时凭据签署请求时需要它。在 Lambda 的情况下,凭证位于运行时,包括您需要传递的会话令牌,在其他地方也很可能也是如此,但我不确定我已经有几年没有使用 ec2 了。

埋藏在文档中(抱歉我找不到说明的地方)指出某些服务要求使用其他规范查询参数来处理 session_token。我正在使用的模块将其添加到最后,正如 sig v4 指令似乎暗示的那样,所以我修改了它,使令牌是规范的并且可以工作。

我们更新了 aws-signature-v4 模块的实时版本以反映此更改,现在它可以很好地用于签署您的 s3 请求。

这里讨论签名

我会使用我所做的模块,因为我感觉 sdk 由于某种原因做了错误的事情。

使用示例(这包含在多部分上传中,因此包含部分编号和上传 ID):

function createBaseUrl( bucketName, uploadId, partNumber, objectKey ) {
  let url = sig4.createPresignedS3URL( objectKey, {
    method: "PUT",
    bucket: bucketName,
    expires: 21600,
    query: `partNumber=${partNumber}&uploadId=${uploadId}`
  });
  return url;
}
Run Code Online (Sandbox Code Playgroud)