使用node.js aws lambda调用python aws lambda函数

vkc1a9a2  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(583)

我不知道这是否与父lambda是node.js runtime,子是python 3.8这一事实有关,但我遇到了一些奇怪的行为,我无法找出哪里出了问题。。。
tldr:仅当父lambda“休眠”(调用settimeout())达100毫秒或更长时间时,才会调用子lambda。
我有两个简单的aws lambda函数。一个是用js(node.js运行时)编写的,另一个是用python(3.8)编写的。设置很简单。父node.js函数调用子python函数。调用是异步的,父级不必等待子级返回。父节点必须是node.js,子节点必须是python 3.8。
我的观察结果是,除非父lambda“睡眠”至少100毫秒,否则不会调用子python lambda。我知道这听起来很奇怪,但我不确定我做错了什么,我花了几天时间试图解决这个问题(毫无疑问,这真的很简单…)。
我编写了一个“sleep”函数(显示在node.js代码的顶部),在响应从父函数返回给调用方之前调用该函数。我知道.invoke回调中的代码将在父函数返回后调用,这只是为了调试目的。
以下是node.js父lambda:

  1. var aws = require('aws-sdk')
  2. var lambda = new aws.Lambda()
  3. function sleep(ms) {
  4. return new Promise((resolve) => {
  5. setTimeout(resolve, ms);
  6. });
  7. }
  8. exports.handler = async (event) => {
  9. const payload = {
  10. message: "Hey there",
  11. }
  12. var params = {
  13. FunctionName: 'ChildLambda', // the lambda function we are going to invoke
  14. InvocationType: 'Event', // RequestResponse is sync, Event Async
  15. LogType: 'Tail',
  16. Payload: JSON.stringify(payload)
  17. };
  18. lambda.invoke(params, function(err, data) {
  19. console.log("Invoked Lambda...")
  20. if (err) {
  21. console.log(err)
  22. } else if (data) {
  23. console.log('Data: ', data)
  24. }
  25. console.log("Lambda done")
  26. })
  27. // await sleep(100)
  28. const response = {
  29. "isBase64Encoded": false,
  30. "statusCode": 202,
  31. "headers": {},
  32. "body": "HEY FROM LAMBDA"
  33. }
  34. return response;
  35. };

下面是python子级lambda:

  1. import requests
  2. import json
  3. def main(event, context):
  4. print("IN THE SECOND LAMBDA")
  5. response = {
  6. "statusCode": 200,
  7. "headers": {"my_header": "my_value"},
  8. "body": "hello from second lambda",
  9. "isBase64Encoded": False,
  10. }
  11. return response

如果您删除 sleep(100) 从父函数调用,则不调用子函数。我知道这一点,因为cloudwatch日志中没有显示任何内容。如果将传递给sleep()的参数设置为小于100毫秒,则不会调用子lambda。异步或同步调用子函数(通过替换 "Event" 具有 "RequestResponse" 在里面 params 在父函数没有改变任何东西的情况下,上述情况仍然成立。
这种奇怪行为的原因是什么?我做错了什么?
edit@jellycsc链接到调用invoke命令的替代方法:

  1. var invoke = lambda.invoke(params).promise()
  2. invoke.then(function(data) {
  3. console.log('Success');
  4. }).catch(function(err) {
  5. console.log(err);
  6. });

不幸的是,这并不能解决问题,只有当计时器设置为100毫秒或更长时间时,才会调用invoke命令。

jhkqcmku

jhkqcmku1#

等到 invoke 操作完成,然后完成lambda函数。

  1. exports.handler = async (event) => {
  2. const payload = {
  3. message: "Hey there",
  4. }
  5. var params = {
  6. FunctionName: 'ChildLambda', // the lambda function we are going to invoke
  7. InvocationType: 'Event', // RequestResponse - to get response from ChildLambda, Event - don't care the response (or error...)
  8. LogType: 'Tail',
  9. Payload: JSON.stringify(payload)
  10. };
  11. try {
  12. console.log("Invoked Lambda...")
  13. const data = await lambda.invoke(params).promise() // wait until invoke successfully
  14. console.log('Data: ', data) // data maybe empty - {} when InvocationType is Event
  15. console.log("Lambda done")
  16. return {
  17. "isBase64Encoded": false,
  18. "statusCode": 202,
  19. "headers": {},
  20. "body": "HEY FROM LAMBDA"
  21. }
  22. } catch (error) {
  23. // handle error
  24. console.log("Error", error);
  25. return {
  26. "isBase64Encoded": false,
  27. "statusCode": 500, // return error response
  28. "headers": {},
  29. "body": error.message
  30. }
  31. }
  32. };
展开查看全部

相关问题