【问题标题】:How to call a step funtion from Node.js Lambda function?如何从 Node.js Lambda 函数调用步进函数?
【发布时间】:2021-04-05 19:02:14
【问题描述】:

我正在尝试从 Node.js lambda 函数调用步进函数。我从thread 尝试了解决方案并更新了实现。

显示错误响应但更新代码显示成功响应的解决方案。但是更新后的代码并没有调用 step 函数。

我的代码:


console.log('Loading function');
const AWS = require('aws-sdk');
exports.handler = function(event, context) {
    console.log('Loading step functions');
    const stepFunctions = new AWS.StepFunctions({
    region: 'us-east-2'
});
console.log('Loading init');
module.exports.init = (event, context, callback) => {
console.log('Loading params');
const params = {
        stateMachineArn: 'ARN of My State Machine',
        // input: JSON.stringify({}), Optional if your statemachine requires an application/json input, make sure its stringified 
        name: 'TestExecution' // name can be anything you want, but it should change for every execution
    };

console.log('start step functions');
stepFunctions.startExecution(params, (err, data) => {
        if (err) {
            console.log(err);
            const response = {
                statusCode: 500,
                body: JSON.stringify({
                    message: 'There was an error'
                })
            };
            callback(null, response);
        } else {
            console.log(data);
            const response = {
                statusCode: 200,
                body: JSON.stringify({
                    message: 'Step function worked'
                })
            };
            callback(null, response);
            console.log(response);
        }
    });
    };
};

我已将上述代码添加到 Lambda 函数中并部署这些代码。之后,我使用了 lambda 函数的 Test 选项。这是执行 Lambda 函数的正确方法吗?测试结果是成功,但是当我检查状态机时,最近没有执行。帮我找到解决方案,我对步进功能很陌生。提前致谢。

【问题讨论】:

  • 您使用的是标准步进功能还是快速步进功能? Express Step 函数没有执行历史记录,启用后只能看到 cloudwatch 日志,而在 step 函数控制台中什么也看不到
  • @BaluVyamajala Mine 是标准阶跃函数,当我运行 lambda 函数时,执行成功,但阶跃函数没有任何反应。我的步进函数返回一个随机整数,但这里的 lambda 函数没有输出。

标签: amazon-web-services aws-lambda aws-step-functions


【解决方案1】:

这是我做过的事情:

  • 创建了 lambda 并在lambda role 中添加了 step 函数执行的权限
  • 创建了standard 类型的步进函数(只是一个hello world)。在创建时,我选择了ALL Logs,它转到CloudWatch Log Group。甚至它们也显示在step function 控制台中,如下Logging 标签下。

下面是我调用step函数的代码:

var aws = require('aws-sdk')
exports.handler = (event, context, callback) => {
  var params = {
    stateMachineArn: 'arn:aws:states:us-east-1:1234567890:stateMachine:Helloworld',
    input: JSON.stringify({})
  };
  var stepfunctions = new aws.StepFunctions()
  stepfunctions.startExecution(params, (err, data) => {
    if (err) {
    console.log(err);
    const response = {
        statusCode: 500,
        body: JSON.stringify({
        message: 'There was an error'
        })
    };
    callback(null, response);
    } else {
    console.log(data);
    const response = {
        statusCode: 200,
        body: JSON.stringify({
        message: 'Step function worked'
        })
    };
    callback(null, response);
    }
});
}

Lambda 执行日志

Step Function 执行日志

【讨论】:

  • { "statusCode": 500, "body": "{\"message\":\"有一个错误\"}" }
  • 我不明白前 2 个要点,请您详细说明一下吗?大多数错误是因为这个而发生的。
  • @MatthewPans 因此,您尝试调用 step 函数的 lambda 必须附加一个 IAM RoleIAM Role 必须有权调用 step function 。 Ssecond step function 必须在它正在使用的IAM Role 中配置具有必要权限的日志记录。我假设您的 lambda 和 step 函数存在于同一区域 us-east-2
  • 以下是我得到的错误:HelloWorldLambda 无权执行:states:StartExecution on resource:arn:aws:states:us-east-2:536963904807:stateMachine:HelloWorld
  • @MatthewPans 是有道理的......你必须修改 lambda IAM role 并允许 lambda 角色调用 step function。暂时将策略arn:aws:iam::aws:policy/AWSStepFunctionsFullAccess 附加到 lambda iam 角色并进行测试。 Shjould 工作,稍后您可以根据需要自定义策略。
猜你喜欢
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 2016-09-18
  • 2020-04-04
  • 1970-01-01
  • 2015-01-22
相关资源
最近更新 更多