amazon-s3 - 从 Lambda 函数生成预签名 S3 URL 时为 "Access key

我正在尝试从 Lambda 函数中生成预签名 URL,以获取现有的 S3 对象。

(Lambda 函数运行一个 ExpressJS 应用程序,并在其中一个路由上调用生成 URL 的代码。)

不过,当我访问生成的 URL 时,我收到错误“您提供的 AWS 访问 key ID 不存在于我们的记录中。”,Google 没有帮助我:

<Error>
<Code>InvalidAccessKeyId</Code>
<Message>The AWS Access Key Id you provided does not exist in our records.</Message>
<AWSAccessKeyId>AKIAJ4LNLEBHJ5LTJZ5A</AWSAccessKeyId>
<RequestId>DKQ55DK3XJBYGKQ6</RequestId>
<HostId>IempRjLRk8iK66ncWcNdiTV0FW1WpGuNv1Eg4Fcq0mqqWUATujYxmXqEMAFHAPyNyQQ5tRxto2U=</HostId>
</Error>

Lambda 函数是通过 AWS SAM 定义的并通过预定义的 S3CrudPolicy 授予存储桶访问权限模板:

ExpressLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: ExpressJSApp
      Description: Main website request handler
      CodeUri: ../lambda.zip
      Handler: lambda.handler
      [SNIP]
      Policies:
        - S3CrudPolicy:
            BucketName: my-bucket-name

URL 是通过 AWS SDK 生成的:

const router = require('express').Router();
const AWS = require('aws-sdk');

router.get('/', (req, res) => {

    const s3 = new AWS.S3({
        region: 'eu-west-1',
        signatureVersion: 'v4'
    });
    const params = {
        'Bucket': 'my-bucket-name',
        'Key': 'my-file-name'
    };
    s3.getSignedUrl('getObject', params, (error, url) => {
        res.send(`<p><a href="${url}">${url}</a></p>`)
    });
});

怎么了?从 Lambda 函数中调用 getSignedUrl() 时是否需要显式传递凭据?函数的执行角色不提供这些吗?我是不是找错树了?

最佳答案

tldr;确保在您的请求中具有正确的 signature_v4 header /表单数据顺序。

我遇到了完全相同的问题。

我不确定这是否是每个遇到问题的人的解决方案,但我了解到以下内容:

如果您未使用正确顺序的安全 header ,则可能会出现错误消息和其他误导性错误消息。在我的例子中,我使用端点创建一个预签名的 url,用于发布文件和上传文件。在这种情况下,您需要确保表单数据中的安全相关数据顺序正确。对于 signatureVersion 's3v3',它是:

  • key
  • x-amz-算法
  • x-amz-凭证
  • x-amz-日期
  • 政策
  • x-amz-安全 token
  • x-amz-签名

在对预签名 URL 发出 POST 请求的特殊情况下,要上传文件,请务必在安全数据之后拥有您的文件。

之后,请求按预期工作。

关于amazon-s3 - 从 Lambda 函数生成预签名 S3 URL 时为 "Access key does not exist",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68578605/

相关文章:

java - 具有路径变量的 URL 模式的 Spring 过滤器

python - 使用 gunicorn 和 Nginx 部署时,Django 应用程序未在生产日志

amazon-web-services - Elasticsearch - 不断出现 "429 To

qt - 如何在 QLineEdit 中设置插入符号闪烁光标的颜色

c++ - 什么是 list 文件?

gitlab - Helm 在尝试添加 Gitlab 注册表时说 404

reactjs - React Signalr 访问状态变量

javascript - Cypress :找不到模块:错误:无法解析 'cypress-wait-

c# - 无法将 Dictionary> 转换为 IRea

html - 如何强制 Chrome 在网站上显示最新的图像更改