【问题标题】:aws call a step function from lambdaaws 从 lambda 调用一个阶跃函数
【发布时间】:2018-05-21 05:16:06
【问题描述】:

所以我设置了一个 step 函数来调用将发送电子邮件的 Lamba。

我已经手动测试过它并且它可以工作......现在我想用一个新的 lambda 最初调用这个 step 函数......我在网上找到了一些代码,我已经玩过了......通过了测试并且没有引发任何错误....有谁知道我缺少什么,因为它不起作用?

我在https://www.youtube.com/watch?v=9MKL5Jr2zZ4&t=306s上找到了教程中的代码,我认为直接复制它应该没问题,因为她唯一的用途是调用一个步进函数。

谢谢

'use strict';

const AWS = require('aws-sdk');
const stepFunctions = new AWS.StepFunctions();

//module.exports.hello = (event, context, callback) => {
exports.handler = function(event, context) {
    const response = {
        statusCode:200,
        body: JSON.stringify({
            message: 'Hello World!',
            input: event,
        }),
    };

//  callback(null, response);
};

module.exports.init = (event, context, callback) => {

    const params = {
        stateMachineArn: 'STATE-MACHINE-ARN',
        input: '',
        name: 'Execution lambda'
    }

    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 函数 executeSendEmailLambda

任何帮助都会非常感谢

更新 多亏了我的帮助,我想我更近了一点,但我们又回到了测试通过的第一方,但是 lambda 没有调用步骤 F

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 West (Oregon)'
});

console.log('Loading init');
module.exports.init = (event, context, callback) => {

    console.log('Loading params');

    const params = {
        stateMachineArn: 'STATE-MACHINE-ARN',
        // 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);
        }
    });
    };

};

此日志显示以下内容

    
23:54:47
2017-12-07T23:54:47.448Z    016133fa-dbaa-11e7-8473-7147adf52922    Loading function

23:54:47
START RequestId: 016133fa-dbaa-11e7-8473-7147adf52922 Version: $LATEST

23:54:47
2017-12-07T23:54:47.767Z    016133fa-dbaa-11e7-8473-7147adf52922    Loading step functions

23:54:47
2017-12-07T23:54:47.905Z    016133fa-dbaa-11e7-8473-7147adf52922    Loading init

23:54:47
END RequestId: 016133fa-dbaa-11e7-8473-7147adf52922

23:54:47
REPORT RequestId: 016133fa-dbaa-11e7-8473-7147adf52922  Duration: 178.97 ms Billed Duration: 200 ms Memory Size: 128 MB Max Memory Used: 31 MB
No newer events found at the moment. Retry.

【问题讨论】:

标签: javascript node.js amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

{
"Comment": "Call Library_ReIndex Lambda",
"StartAt": "Library_StepFun_RDSAccess",
"States": {
"Library_StepFun_RDSAccess": {
  "Type": "Task",
  "Resource": "arn:aws:lambda:us-east- 
    1:163806924483:function:Library_StepFun_RDSAccess",
  "OutputPath": "$",
  "Next": "MappingState"
},
"MappingState": {
  "Type": "Map",
  "InputPath": "$",
  "ItemsPath": "$.documents",
  "MaxConcurrency": 10,
  "Iterator": {
    "StartAt": "Choice",
    "States": {
      "Choice": {
        "Type": "Choice",
        "InputPath": "$",
        "Choices": [
          {
            "Variable": "$.doc_source_type",
            "StringEquals": "slides",
            "Next": "callSlides"
          },
          {
            "Variable": "$.doc_source_type",
            "StringEquals": "docs",
            "Next": "callDocs"
          }
        ]
      },
      "callDocs": {
        "Type": "Task",
        "InputPath": "$",
        "Resource": "arn:aws:lambda:us-east-1:163806924483:function:Library-Docs- 
          Parser-2",
        "Catch": [ {
        "ErrorEquals": ["States.ALL"],
        "Next": "CatchAllFallback"
        } ],
        "OutputPath": "$",
        "End": true
      },
      "callSlides": {
        "Type": "Task",
        "InputPath": "$",
        "Resource": "arn:aws:lambda:us-east-1:163806924483:function:Library-Slides-Parser",
        "Catch": [ {
        "ErrorEquals": ["States.ALL"],
        "Next": "CatchAllFallback"
        } ],
        "OutputPath": "$",
        "End": true
      },
      "CatchAllFallback": {
      "Type": "Pass",
      "Result": "This is a fallback from any error code",
      "End": true
      }
    }
  },
  "End": true
}
}
}

【讨论】:

  • 代码可以适当缩进以提供更多精彩
【解决方案2】:

我稍微修改了您的代码并使用我的一个 Step Functions 对其进行了测试,这段代码似乎对我有用 :)

const AWS = require('aws-sdk');

const stepFunctions = new AWS.StepFunctions({
region: 'YOUR_REGION_NAME'
});

module.exports.init = (event, context, callback) => {
const params = {
    stateMachineArn: 'YOUR_STATE_MACHINE_ARN',
    // 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
};

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);
    }
});
};

【讨论】:

  • 嗨 Keshav,感谢您抽出宝贵时间回复...我已经尝试了您建议在我的区域名称和状态机 arn 中添加的内容。但这会引发错误响应:{“errorMessage”:“模块'index'上缺少处理程序'handler'”}......所以我添加了缺少的exports.handler = function(event,context){ const response = { statusCode:200, body: JSON.stringify({ message: 'Hello World!', input: event, }), };};
  • 这似乎有效,在测试时不会触发错误,但它不会调用 step 函数。您知道为什么这可能不起作用吗?
  • 您好,很抱歉回复晚了,但是如果您只是将 serverless.yml 文件中的处理程序名称从 handler.handler 更改为 handler.init,我的代码应该可以工作,您不需要导出另一个名为 handler 的模块,因为当你这样做时,lambda 只会运行这个模块内的代码,它不会考虑 init 模块。
  • 我已更新区域和状态机 ARN 值。但是当我执行此操作时,我收到以下错误消息:{ "errorMessage": "2021-03-31T11:53:06.420Z *some keys separated using -* Task timed out after 3.02 seconds" }
猜你喜欢
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2018-06-09
  • 2021-08-21
  • 2021-09-23
  • 1970-01-01
相关资源
最近更新 更多