Как использовать nextToken в функции GetHistoryExecution функции Step? - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь получить всю историю выполнения с помощью лямбда-функции и сохранить ее в DynamoDB. Функция возвращает около 20 выполнений и строковое значение NextToken, которое будет использоваться в следующем вызове для получения остальных выполнений.

Это мой код.

const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient({
   region: 'myregion' 
});

exports.handler = (event, context, callback) => {
    const table = 'myDynamoDB';
    const executionARN = "arn:aws:region:accountid:execution:myStateMachine:test";
    var stepfunctions = new AWS.StepFunctions();
    var params = {
        executionArn: executionARN,
        maxResults: 20,
        nextToken: null,
        reverseOrder: false
    };

    stepfunctions.getExecutionHistory(params, function(err, dataExecution) {
        if (err){
          console.log(err, err.stack);
        } 
        else {
            const params2 = {
                TableName: table,
                Item: {
                    id: executionARN,
                    execution_history: dataExecution
                }
            };
                dynamoDb.put(params2).promise();
        }
    });
};

1 Ответ

1 голос
/ 12 марта 2019

nextToken необходимо использовать при передаче параметров в следующий вызов getExecutionHistory.Вы можете рекурсивно вызывать эту функцию, пока все токены не будут исчерпаны.Подобная ситуация встречалась при получении журналов через Cloud watch.

Пример рекурсивной выборки истории,

Оберните getExecutionHistory в обещание и добавьте его в другой файл JS (скажем, writer.js), затем в основной индекс.Файл .js может вызывать эту функцию следующим образом:

// writer.js which writes record to Dynamodb
// returns promise
// when history is fetched , dynamodb will be inserted and it will resolve dataexecution which has nextToken

module.exports.get = function(fwdtoken) {    

    if (fwdtoken) parms.nextToken= fwdtoken;

    return new Promise ( (resolve, reject)=>{
    stepfunctions.getExecutionHistory(params, function(err, dataExecution) {
        if (err){
           reject(err.stack)
        } 
        else {
            const params2 = {
                TableName: table,
                Item: {
                    id: executionARN,
                    execution_history: dataExecution
                }
            };
            dynamoDb.put(params2).promise();
        resolve(dataExecution)
        }
      });   
    })    
};  

//This goes in main logic
// Invokes getAllLogs recursilvely

var writer = require('./writer');
var fwdtoken;

function getAllLogs(fwdtoken, fetchCount) {    
    fetchCount = fetchCount || 0;
    if (fetchCount > 40) {
        throw new Error("Fetched too many times.");
    }
    return new Promise( (resolve) => {
            writer.get(fwdtoken).then( function consolidate( dataExecution ) {                  
            resolve( dataExecution );            
        });    
    })
    .then(function ( dataExecution ) {
        if (dataExecution.nextForwardToken) {
            fwdtoken = dataExecution.nextForwardToken;
            getAllLogs(fwdtoken, fetchCount+ 1)
        }
        else
        return fwdtoken        
    });
}
getAllLogs(fwdtoken, 0);
...