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

我已经看遍了我能想到的所有地方——但不知道我该如何链接或调用函数……这当然存在!


当前回答

你可能会使用Async.js的瀑布特性——参见本文档第3步大代码块底部的示例:

https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-lambda/

其他回答

我一直在考虑删除SNS,直到我在Lambda客户端文档(Java版本)中看到了这个:

访问AWS Lambda的客户端。使用此客户端进行的所有服务调用都是阻塞的,直到服务调用完成才返回。

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

你应该通过SNS链接你的Lambda函数。这种方法以最小的工作量提供了良好的性能、延迟和可伸缩性。

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

参见使用Amazon SNS通知调用Lambda函数。

您还可以使用这种方法通过SNS调用跨帐户Lambda函数。

其他人指出使用SQS和步骤函数。但这两种解决方案都增加了额外的成本。阶跃函数的状态转换应该是非常昂贵的。

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

以下是如何在javascript/typescript中做到这一点,而无需安装完整的aws-sdk包。

import { InvokeCommand, LambdaClient, LogType } from "@aws-sdk/client-lambda";

const client = new LambdaClient({
    region: "US-EAST-1"
});

const payload = JSON.stringify({
  data: "your input"
})

const command = new InvokeCommand({
  FunctionName: "your function name",
  Payload: payload,
  LogType: LogType.Tail,
});

const { Payload } = await client.send(command);
const response: any = Payload;
const result = Buffer.from(response).toString();

return result;

这个解决方案是使用boto3和Python完成的:

import boto3
import json

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

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