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

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


当前回答

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

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

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

其他回答

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

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

下面是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-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)
  }
});

你可以在这里找到医生:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

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

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

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

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

以下是如何在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;