amazon-web-services - 无法从已部署的 lambda 检索 S3 存储桶上的数据
问题描述
我从一个 lambda 函数调用一个 step 函数,它处理数据并将它们存储在 S3 存储桶中。在这个 lambda 函数中,我尝试下载数据,但我收到一条错误消息,显示“AccessDenied”(见下文)。
如果我第二次运行这个 lambda 函数,我不会收到任何错误并且执行成功终止。我的理解是,在第一次运行期间,我尝试下载数据时尚未存储数据,这可以解释为什么在我第二次尝试时它运行良好。
我正在使用这对async/await
认为这足以在等待数据存储时保持执行。有什么我做的不对吗?
这是代码的摘录(此处不详述步骤功能):
async function downloadData(){
var rawData = await s3.getObject({Bucket: 'myBucket/', Key: 'myData.json'}).promise();
var data = JSON.parse(rawData.Body.toString('utf-8'));
return data;
}
async function invokeStepFunction(){
const stepfunctions = new AWS.StepFunctions();
var params = {
stateMachineArn: process.env.state_machine_arn,
input: JSON.stringify({"Bucket": 'myBucket/'})
};
await stepfunctions.startExecution(params).promise();
}
const AWS = require('aws-sdk');
AWS.config.update({region: process.env.region});
const s3 = new AWS.S3({apiVersion: '2006-03-01'});
module.exports.handler = async (event, context) => {
await invokeStepFunction();
const data = await downloadData();
console.log(data);
}
这是错误消息:
{"errorType":"AccessDenied","errorMessage":"AccessDenied","code":"AccessDenied","message":"AccessDenied","region":null,"time":"2020-03-25T13:13:20.832Z","requestId":"...","extendedRequestId":"...","statusCode":403,"retryable":false,"retryDelay":91.97041111587372,"stack":["AccessDenied: Access Denied"," at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/services/s3.js:816:35)"," at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)"," at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)"," at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:683:14)"," at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)"," at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)"," at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10"," at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)"," at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:685:12)"," at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"]}
解决方案
当您等待startExecution
Step Function 调用时,您正在等待 AWS Step Functions 表明它已收到您开始执行 Step Function 的请求。它并不表示Step Function 本身已运行完成。
因此,您在downloadData
Step Function 实际将数据存储在 S3 之前执行,并且该文件第一次在 S3 中不存在。当您稍后调用它时,这downloadData
似乎成功,但几乎可以肯定它正在下载先前存储在 S3 中的对象(从第一次运行开始)。
您需要在下载实际发生后的某个时间执行下载步骤。例如,您可以在上传 Step Function 结束时将下载作为附加步骤。
推荐阅读
- django - Django - 按仅返回值总和分组
- python - 识别表中的 RA 和 Dec 重复项
- c++ - C++ 类类型转换器/类型转换的表达式
- c# - 如何解决 C# 中的 VPN 连接错误
- azure-sql-database - 是否可以在 Azure SQL 数据库中配置查询超时?
- c# - Azure 应用服务:收到 2 个暂时性错误后,响应峰值持续 5-10 分钟
- html - 如何在销售订单的 netsuite 高级模板中加入子记录?
- vba - 试图将两个 VBA 脚本合二为一
- javascript - 全屏显示文档正文为空
- active-directory - 更改现有 AD 记录的显示名称时的通知