首页 > 解决方案 > 无法从已部署的 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)"]}

标签: amazon-web-servicesamazon-s3async-awaitaws-sdk-nodejs

解决方案


当您等待startExecutionStep Function 调用时,您正在等待 AWS Step Functions 表明它已收到您开始执行 Step Function 的请求。它并不表示Step Function 本身已运行完成。

因此,您在downloadDataStep Function 实际将数据存储在 S3 之前执行,并且该文件第一次在 S3 中不存在。当您稍后调用它时,这downloadData似乎成功,但几乎可以肯定它正在下载先前存储在 S3 中的对象(从第一次运行开始)。

您需要在下载实际发生后的某个时间执行下载步骤。例如,您可以在上传 Step Function 结束时将下载作为附加步骤。


推荐阅读