如何在Step函数的GetHistoryExecution中使用nextToken?

How to use the nextToken in the Step function's GetHistoryExecution?

我正在尝试使用 lambda 函数获取所有执行历史记录并将其存储到 DynamoDB。函数 returns 大约 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();
        }
    });
};

nextToken 需要在传递给下一次调用 getExecutionHistory 的参数中使用。您可以递归调用此函数,直到所有标记都用完。通过 Cloud watch 获取日志时遇到类似情况。

递归获取历史的示例,

将 getExecutionHistory 包装到 promise 中并添加到不同的 JS 文件(假设 writer.js),然后您的主 index.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);