Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js AWS Lambda函数可以调用其他函数吗_Node.js_Amazon Web Services_Aws Lambda_Aws Api Gateway - Fatal编程技术网

Node.js AWS Lambda函数可以调用其他函数吗

Node.js AWS Lambda函数可以调用其他函数吗,node.js,amazon-web-services,aws-lambda,aws-api-gateway,Node.js,Amazon Web Services,Aws Lambda,Aws Api Gateway,我有两个Lambda函数-一个用于生成报价,另一个用于将报价转换为订单。 我希望Order lambda函数调用Quote函数来重新生成报价,而不仅仅是从不受信任的客户端接收报价 我已经找遍了我能想到的任何地方,但看不到我将如何链接或调用函数…当然这是存在的 您应该通过SNS链接Lambda函数。这种方法提供了良好的性能、延迟和可扩展性,只需最少的工作量 您的第一个Lambda将消息发布到您的SNS主题,第二个Lambda订阅此主题。消息到达主题后,第二个Lambda将以消息作为输入参数执行 看

我有两个Lambda函数-一个用于生成报价,另一个用于将报价转换为订单。 我希望Order lambda函数调用Quote函数来重新生成报价,而不仅仅是从不受信任的客户端接收报价


我已经找遍了我能想到的任何地方,但看不到我将如何链接或调用函数…当然这是存在的

您应该通过
SNS
链接
Lambda函数。这种方法提供了良好的性能、延迟和可扩展性,只需最少的工作量

您的第一个
Lambda
将消息发布到您的
SNS主题
,第二个
Lambda
订阅此主题。消息到达主题后,第二个
Lambda
将以消息作为输入参数执行


您也可以使用这种方法来解决问题。

我找到了一种使用aws sdk的方法

var aws = require('aws-sdk');
var lambda = new aws.Lambda({
  region: 'us-west-2' //change to your region
});

lambda.invoke({
  FunctionName: 'name_of_your_lambda_function',
  Payload: JSON.stringify(event, null, 2) // pass params
}, function(error, data) {
  if (error) {
    context.done('error', error);
  }
  if(data.Payload){
   context.succeed(data.Payload)
  }
});

您可以在此处找到文档:

您可能可以使用Async.js瀑布功能-有关示例,请参阅本文档步骤3中大代码块的底部:


下面是python的示例代码

from boto3 import client as boto3_client
from datetime import datetime
import json

lambda_client = boto3_client('lambda')

def lambda_handler(event, context):
    msg = {"key":"new_invocation", "at": datetime.now()}
    invoke_response = lambda_client.invoke(FunctionName="another_lambda_",
                                           InvocationType='Event',
                                           Payload=json.dumps(msg))
    print(invoke_response)
顺便说一句,您还需要在lambda角色中添加这样的策略

   {
        "Sid": "Stmt1234567890",
        "Effect": "Allow",
        "Action": [
            "lambda:InvokeFunction"
        ],
        "Resource": "*"
    }

您可以使用AWS博客中描述的
AWSLambdClient
直接调用lambda函数(至少通过Java)

我正在使用blueskin提供的答案,但我无法读取有效负载响应,因为调用类型='Event'异步的,所以我改为InvocationType='RequestResponse',现在一切正常。

我遇到了同样的问题,但我实现的Lambda函数将在DynamoDB中插入一个条目,因此我的解决方案使用DynamoDB触发器

我让DB为表中的每个插入/更新调用一个Lambda函数,因此这将两个Lambda函数的实现分离开来

文件如下:

以下是引导式演练:

这是一种迂回的解决方案,但当我需要链接lambda函数时,我只需调用API端点。这允许您在编码时决定是否希望它们是异步的

如果您不想设置POST请求,您可以只设置一个简单的GET请求,其中包含两个或一个都没有,查询字符串参数以方便事件传递

--编辑--

见:


而且:

我一直在考虑删除SNS,直到我在以下网站上看到这一点:

用于访问AWS Lambda的客户端。使用此客户端进行的所有服务调用都处于阻塞状态,在服务调用完成之前不会返回


所以SNS有一个明显的优势:它是异步的。您的lambda不会等待后续lambda完成。

在java中,我们可以执行以下操作:

AWSLambdaAsync awsLambdaAsync = AWSLambdaAsyncClientBuilder.standard().withRegion("us-east-1").build();

InvokeRequest invokeRequest = new InvokeRequest();
invokeRequest.withFunctionName("youLambdaFunctionNameToCall").withPayload(payload);

InvokeResult invokeResult = awsLambdaAsync.invoke(invokeRequest); 

这里,有效负载是您的字符串化java对象,它需要作为Json对象传递给另一个lambda,以防您需要将一些信息从调用lambda传递给被调用的lambda。

您可以设置AWS\u区域环境

assert(process.env.AWS_REGION, 'Missing AWS_REGION env (eg. ap-northeast-1)');
const aws = require('aws-sdk');
const lambda = new aws.Lambda();

自从提出这个问题以来,Amazon已经发布了Step函数()


AWS Lambda背后的一个核心原则是,您可以更多地关注业务逻辑,而较少关注将其联系在一起的应用程序逻辑。Step函数允许您协调函数之间的复杂交互,而无需编写代码。

2016年,亚马逊在AWS lambda中引入了steps函数。我认为,现在使用steps函数更方便了,因为它真的很容易使用。您可以使用两个lambda函数构建状态机,如下所示:

  • 引述
  • 将报价转换为订单
您可以按如下方式轻松完成此操作:

在这里,您可以将第一个状态转换为一个报价,另一个状态转换为订单

Steps函数使编写多个lambda函数并按顺序或并行运行变得非常容易。 您可以在此处获得有关lambda steps函数的更多信息:

此解决方案使用boto3和Python完成:

import boto3
import json

invokeLambda = boto3.client('lambda', region_name='eu-west-1')

def lambda_handler(event, context):
    invokeLambda.invoke(FunctionName = 'function_name', InvocationType = 'RequestResponse', Payload = json.dumps(event))

    return True

其他人指出使用SQS和Step函数。但这两种解决方案都增加了额外的成本。步进函数状态转换被认为是非常昂贵的


AWS lambda提供了一些重试逻辑。它试了3次。我不确定当您使用API触发它时,它是否仍然有效

下面是调用另一个lambda函数并获取其响应的python示例。有两种调用类型'RequestResponse''Event'。如果要获取lambda函数的响应,请使用“RequestResponse”,并使用“Event”异步调用lambda函数。因此,异步和同步两种方式都是可用的

    lambda_response = lambda_client.invoke(
                FunctionName = lambda_name,
                InvocationType = 'RequestResponse',
                Payload = json.dumps(input)
                )
    resp_str = lambda_response['Payload'].read()
    response = json.loads(resp_str)

您可以通过异步方式直接从其他Lambda函数触发Lambda函数


有很多答案,但没有人强调调用另一个lambda函数不是同步调用的推荐解决方案,您应该使用的是真正的步进函数

不建议使用此解决方案的原因:

  • 这两项功能都需要您付费
  • 您的代码负责重审

您还可以将其用于相当复杂的逻辑,例如并行步骤和捕获失败。每次执行都会被注销,这使得调试更加简单。

我说到这里,但是为什么不能在第一个Lambda函数中依赖AWS JavaScript SDK,创建一个客户端和第二个函数?这就是我要尝试的-但我不完全确定如何进行,因为没有任何例子可以从另一个Lambda函数中执行。显然,您也可以通过调用Lambda函数。还有一个想法,您可以,这可能是我作为更具可扩展性的策略所采用的方式。这里没有提到另一种常见的替代方法
    lambda_response = lambda_client.invoke(
                FunctionName = lambda_name,
                InvocationType = 'RequestResponse',
                Payload = json.dumps(input)
                )
    resp_str = lambda_response['Payload'].read()
    response = json.loads(resp_str)