【发布时间】: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