【问题标题】:How to invoke Lambda function with Event Invocation Type via API Gateway?如何通过 API Gateway 调用具有事件调用类型的 Lambda 函数?
【发布时间】:2016-03-21 13:35:42
【问题描述】:

文档说:

默认情况下,Invoke API 采用 RequestResponse 调用类型。您可以选择通过将 Event 指定为 InvocationType 来请求异步执行。

所以我可以发送给我的函数(python)的只是 InvocationType:Event 无处不在:

curl -X POST "https://X.execute-api.us-east-1.amazonaws.com/prod/Y?InvocationType=Event" 
-d "InvocationType:Event" 
-H "X-Amz-Invocation-Type:Event"

(function sleeps 3 seconds then responses)

null

但不是异步...文档还说:

当您通过 AWS 控制台或使用 Amazon API Gateway 通过 HTTPS 调用 Lambda 函数时,Lambda 始终使用 RequestResponse 调用类型。

我知道这可以通过 aws-CLI 实现,但我不明白是否可以从 API Gateway 端点做到这一点。

【问题讨论】:

    标签: python amazon-web-services aws-lambda


    【解决方案1】:

    我知道你为什么要这样做,但这不是正确的解决方案。

    无论你做什么,不要使用两个 lambda 函数。

    您无法控制 lambda 的调用方式、异步或同步方式。 lambda 的调用者决定了这一点。对于 APIGW,它决定调用 lambda sync。

    可能的解决方案是以下之一:

    • SQS
    • 阶梯函数 (SF)
    • 社交网络

    在您的 API 中,您调用这些服务之一,返回成功,然后立即向调用者返回 202。

    如果您执行大量单操作或双操作,请使用 SQS。如果您可能长时间运行复杂的状态逻辑,请使用 SF。如果您出于某些原因想忽略我的建议,请使用 SNS。

    这些中的每一个都可以(并且应该)回调一个 lambda。如果您需要运行超过 15 分钟,他们可以回电至CodeBuild。忽略服务的名称,它只是一个支持长达 8 小时运行的 lambda。


    现在,为什么不使用两个 lambdas (L1, L2)?答案很简单。一旦您向您的用户(202)响应您的异步调用已排队(SQS、SF、SNS)。他们会期望它 100% 有效。但是如果 L2 lambda 失败会发生什么。它不会重试,也不会继续,而且您可能永远不会知道。

    L2 lambda 的处理程序不再存在,因此您不再知道状态。此外,您可以尝试使用包装器 try/catch 将日志记录添加到 L2,但可能会发生许多其他类型的故障。即使您有,CloudWatch 是否已关闭,您会获取日志吗?不可能,这不是一个可靠的策略。当然,如果您正在做一些您不关心的事情,您可以构建这个拱门,但这并不是真正的生产解决方案的构建方式。您需要一个可靠的过程。您希望相信接力棒已成功传递给另一个负责完成用户事务的服务。这就是您要使用以下三种服务之一的原因:SQS、SF、SNS。

    【讨论】:

      【解决方案2】:

      创建两个 Lambda,并首先在专用 ApiGateway 请求处理 Lambda 中使用 Lambda.Client.invoke 和 InvocationType=Event。第二个执行您希望 ApiGateway 请求异步调用的逻辑。

      专用 ApiGateway Lambda 处理程序示例:

      from __future__ import print_function
      
      import boto3
      import json
      
      def lambda_handler(event, context):
          response = client.invoke(
              FunctionName='<your_long_task_running_function_executer>',
              InvocationType='Event',
              Payload=json.dumps(event)
          )
          return { "result": "OK" }
      

      您可能希望检测发送请求失败和其他此类条件,但由于我主要不使用 python,所以我将把这个逻辑留给您。

      附言请注意 invoke_async 已弃用
      pps抱歉,我的帐户是新帐户,我没有代表将这些添加为评论:0。我借用了您的回答; 1.您正在使用已弃用的api; 2. 你应该(显然没问题)在你的电话中添加InvocationType = 'Event'

      【讨论】:

      • 这个答案是正确的,应该被接受
      • @jeffrey-- 您能否也请在这里发布类似的问题-stackoverflow.com/questions/53504395/… 无法获取从 AWS MQ 发送的消息并发送到另一个 Lambda 函数
      【解决方案3】:

      根据这篇文章,您可以传递一个标头:X-Amz-Invocation-Type: Event https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-lambda.html

      【讨论】:

        【解决方案4】:

        我意识到 API Gateway 在设计上只使用 RequestResponse 调用 lambda 函数。

        但你可以编写 2 个函数:

        1. 调用异步调用到“函数执行器”的“函数接收器”

          from __future__ import print_function
          
          import boto3
          import json
          
          def lambda_handler(event, context):
              client = boto3.client('lambda')
              client.invoke_async(
                  FunctionName='my_long_task_running_function_executer',
                  InvokeArgs=json.dumps(event)
              )
              return {"result": "OK"}
          
        1. 执行长时间运行任务的“函数执行器”。

        然后您将拥有一个流程,您可以从 API 网关开始并以 InvocationType=Event 的形式执行它。

        【讨论】:

        • 该解决方案可行,但为什么使用 InvocationType:Event 标头不能以异步模式启动 Lambda?
        • 所以invoke_async 实际上不允许你对响应做任何事情?这似乎没用......
        • @AndyHayden 异步的定义是在正常的时序流程之外启动一个进程,并在不等待响应的情况下继续处理。所以,不,你不能对响应做任何事情。在 javascript 中,他们通过向函数传递回调来解决这个问题。您可以使用 AWS Lambda 执行此操作,但它必须是 lambda 函数可以访问的回调。
        • @BrunoBronosky IME 在实践中你很少想“开火然后忘记”。您可以通过从 API 网关(使用异步 http 请求)请求 url 来解决这个问题。虽然我忘记了我在 11 月做了什么来想要这个/这是否是我最终做的。
        • “很少想要”是非常主观的。每次你有一个长时间运行的进程并且你不想等待它时,你想要“解雇并忘记”。在这种情况下,您有效地将 Lambda 用作消息队列。例如,对视频进行转码。您想快速告诉用户“正在转码”,Event 调用类型的 202 状态码告诉您的是真的。您不想让对 lambda 的请求保持打开 30 分钟左右。你最好轮询结果或使用回调。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-15
        • 2019-01-07
        • 1970-01-01
        • 2018-04-15
        • 2016-05-18
        • 1970-01-01
        • 2018-10-28
        相关资源
        最近更新 更多