【问题标题】:"Access key does not exist" when generating pre-signed S3 URL from Lambda function从 Lambda 函数生成预签名 S3 URL 时出现“访问密钥不存在”
【发布时间】:2021-07-29 15:17:45
【问题描述】:

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

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

但是,当我访问生成的 URL 时,我收到一个错误“您提供的 AWS 访问密钥 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 开发工具包生成的:

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() 时是否需要显式传递凭据?函数的执行角色不提供这些吗?我是不是找错树了?

【问题讨论】:

    标签: amazon-s3 aws-lambda


    【解决方案1】:

    我建议使用 getSignedUrlPromise。很少有aws服务操作,你必须通过promise,否则会抛出奇怪的错误。

    
    router.get('/', async (req, res) => {
    
        const s3 = new AWS.S3({
            region: 'eu-west-1',
            signatureVersion: 'v4'
        });
        const params = {
            'Bucket': 'my-bucket-name',
            'Key': 'my-file-name'
        };
    const uploadUrl = await S3.getSignedUrlPromise("getObject", params);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 2016-12-14
      • 1970-01-01
      • 2020-01-01
      相关资源
      最近更新 更多