Невозможно получить данные в S3 Bucket из развернутой лямбды - PullRequest
0 голосов
/ 25 марта 2020

Я вызываю пошаговую функцию из лямбда-функции, которая обрабатывает данные и сохраняет их в корзине S3. Из этой лямбда-функции я пытался загрузить данные, но я получаю сообщение об ошибке с «AccessDenied» (см. Далее ниже).

Если я запускаю эту лямбда-функцию во второй раз, я не получаю никакой ошибки и выполнение успешно завершается. Насколько я понимаю, во время первого запуска данные еще не сохраняются, пока я пытаюсь их загрузить, что объясняет, почему во второй попытке это работает хорошо.

Я использую пару 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)"]}

1 Ответ

1 голос
/ 25 марта 2020

Когда вы ожидаете вызова функции шага startExecution, вы ожидаете, пока AWS Шаговые функции покажут, что он получил ваш запрос на начало выполнения Шаговой функции. , а не означает, что пошаговая функция сама запустилась до завершения.

Итак, вы выполняете downloadData до того, как пошаговая функция фактически сохранит данные в S3, а файл выполнит не существует в S3 впервые. Когда вы вызываете его позже, этот downloadData кажется успешным, но он почти наверняка загружает объект ранее , сохраненный в S3 (с первого запуска).

Вам необходимо выполнить загрузку шаг спустя после того, как загрузка действительно произошла. Например, вы можете сделать загрузку дополнительным шагом в конце функции шага загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...