如何通过API网关使用事件调用类型调用Lambda函数?

pan*_*ore 5 python amazon-web-services aws-lambda

文件说:

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

所以我可以发送到我的函数(python)是InvocationType:事件无处不在:

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
Run Code Online (Sandbox Code Playgroud)

但不是Async ......文档也说:

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

我知道可以通过aws-CLI实现,如果可以从API网关端点进行,我不明白.

Eri*_*son 12

创建两个Lambdas,并在第一个使用Lambda.Client.invoke时使用InvocationType = Event处理Lambda的专用ApiGateway请求.第二个执行您希望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" }
Run Code Online (Sandbox Code Playgroud)

您可能希望检测到发送请求的失败以及该类别的其他条件,但由于我主要不使用python,因此我将把这个逻辑留给您.

ps请注意,invoke_async已被弃用
pps抱歉,我的帐户是新的,我没有代表将这些添加为评论:0.我借鉴了你的回答; 1.您使用的是弃用的api; 2.你应该(显然没关系)加入InvocationType = 'Event'你的电话.


pan*_*ore 3

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

但你可以编写两个函数来做到这一点:

  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"}
    
    Run Code Online (Sandbox Code Playgroud)
  1. 执行长时间运行任务的“函数执行器”。

然后,您将拥有一个可以从 API 网关启动的流程,并将其作为 InitationType=Event 执行。

  • “很少想要”是非常主观的。每当你有一个长时间运行的进程并且你不想等待它时,你想要“即发即忘”。在这种情况下,您可以有效地使用 Lambda 作为消息队列。例如,对视频进行转码。您想要快速告诉用户“正在进行转码”,事件调用类型的 202 状态代码告诉您这是真的。您不希望将 lambda 请求保持打开状态 30 分钟左右。您最好轮询结果或使用回调。 (2认同)