从 Lambda 返回对 API 网关的响应

Handing back a response to API Gateway from Lambda

我正在为一些微服务使用 API Gateway-to-Lambda,但至少在一种情况下,该服务需要 20-30 秒才能完成,所以在这种情况下,我希望将立即响应传回客户端,例如:

 status: 200
 message: {
      progressId: 1234
 }

然后允许 Lambda 函数继续运行(并定期更新 "processId" 某个客户端可以访问的地方。问题是如果您调用 context.succeed()context.fail() ,或 context.done() 显然会阻止 lambda 函数进一步执行,但这是我知道将标准输出缓冲区刷新回 API 网关的唯一方法。

这让我想到了第二种方法,我还没有尝试解决(为了简单起见,我很想避免),它涉及 API 网关调用 "Responder" Lambda 函数然后异步触发微服务,然后立即响应 API 网关。

我试图在下面以草图格式说明这两个选项。我很想听听大家是如何解决这个问题的。

目前 API 网关要求 AWS Lambda 集成是同步的。如果您希望异步调用您的 Lambda 函数,您有 2 个选项:

  1. 异步调用 Lambda,通过 A​​WS 集成 在 Lambda 上调用 InvokeAsync,或使用中间服务例如 SNS 或 Kinesis 来触发 Lambda 函数。

  2. 你是 #2 图,使用同步 Lambda 调用来启动异步调用。

从 Apr/2016 开始,是否可以使用 AWS 服务代理通过 API 网关创建异步 Lambda 执行。参见 http://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-lambda.html

你可以发送 X-Amz-Invocation-Type header,它支持通过 Event

的异步调用

You can optionally request asynchronous execution by specifying Event as the InvocationType

http://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#API_Invoke_RequestSyntax

此外,如果您无法通过 micro-service 发送它,您可以将此 header 配置为默认通过 Method Execution 传递-> 集成请求 -> HTTP Headers 在您的API 网关资源

这在 micro-service -> API Gateway -> Lambda 场景中对我有用,就像问题中提到的那样。