【问题标题】:AWS Lambda: call function from another AWS lambda using boto3 invokeAWS Lambda:使用 boto3 调用从另一个 AWS lambda 调用函数
【发布时间】:2018-08-21 22:58:10
【问题描述】:

我有一个简单的 lambda 函数,它位于以下端点:

https://******.execute-api.eu-west-2.amazonaws.com/lambda/add?x=1&y=2

AWS Chalice 用于在此处添加简单的端点。

@app.route('/{exp}', methods=['GET'])
def add(exp):
    app.log.debug("Received GET request...")
    request = app.current_request 
    app.log.debug(app.current_request.json_body)
    x = request.query_params['x']
    y = request.query_params['y']
    if exp == 'add':
        app.log.debug("Received ADD command...")
        result = int(x) + int(y)
        return {'add': result}

基本上,它检查path 是否等于add 并将query_params 中的两个值相加。

现在,我正在尝试在另一个 lambda 中调用此 lambda。

我的问题:

如何使用 boto3 lambda 客户端将 pathquery_params 传递给我的原始 lambda 函数?

到目前为止我所尝试的:

我在policy.json 文件中添加了两行,允许我调用原始函数。

我在 StackOverflow 上看到了很多类似的问题,但大多数都将有效负载作为 json 传递。

@app.route('/')
def index():
    lambda_client = boto3.client('lambda')
    invoke_response = lambda_client.invoke(
        FunctionName="function-name",
        InvocationType="RequestResponse"
    )
    app.log.debug(invoke_response['Payload'].read())

提前谢谢你!

【问题讨论】:

  • 你可以只向 API 端发送一个 post 请求而不是调用吗?
  • @SudharsanSivasankaran,是的,我可以。但如果可能的话,我想使用 boto3 来调用它。我想以后我想在我原来的 lambda 函数中添加身份验证机制(例如使用 AWS Cognito),这样会容易得多。

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


【解决方案1】:

也许您可以将下一个代码添加到您的 add 函数中,因此它也接受有效负载:

@app.route('/{exp}', methods=['GET'])
def add(exp, *args, **kwargs):
    if isinstance(exp, dict):
        # exp is event here
        request = exp.get('request', {'x': 0, 'y': 0})
        exp = exp.get('exp', 'add')

我将编写一个通用示例,您可以轻松修改它以满足您的需求。在您的情况下,数据字典将具有 requestexp 键,您需要找到 lambda 函数的 arn。

AWS Documentation Lambda.invoke

假设从现在开始,我们有 2 个 Lambda,分别名为“master”和“slave”。 master 会调用 slave。

目前有 3 种调用类型:

  1. RequestResponse(默认):master调用并等待slave响应
  2. 事件:异步,主调用和忘记
  3. DryRun:在运行前做一些验证

我坚持 #1 RequestResponse:

从机:

def lambda_handler(event, context):
    result = {}
    result['event'] = event
    result['result'] = "It's ok"
    return result

它的 arn 类似于 arn:aws:lambda:us-east-1:xxxxxxxxxxxxxx:function:slave

在示例中,slave 只是一个回显函数

现在,master 需要必要的角色权限才能调用它,以及 arn 或名称。然后你可以这样写:

import boto3
from datetime import datetime
import json

client = boto3.client('lambda')

def lambda_handler(event, context):
    arn = 'arn:aws:lambda:us-east-1:xxxxxxxxxxxxxx:function:slave'
    data = {'my_dict': {'one': 1, 'two': 2}, 'my_list': [1,2,3], 'my_date': datetime.now().isoformat()}

    response = client.invoke(FunctionName=arn,
                             InvocationType='RequestResponse',
                             Payload=json.dumps(data))

    result = json.loads(response.get('Payload').read())
    return result

通常你会得到类似os.environ.get('slave_arn')的arn

所有来自/到 lambda 的数据都必须是 JSON 可序列化的。

【讨论】:

  • 如果在循环中调用工作者/从属 lambda 以使多个实例同时运行,这会起作用吗?我可以使用同一个客户端异步多次调用 lambda,还是需要动态创建 boto3 客户端来执行此操作?
  • Async 和 Sync boto3.amazonaws.com/v1/documentation/api/latest/reference/… 调用 Lambda 函数。您可以同步调用函数(并等待响应),也可以异步调用。要异步调用函数,请将 InvocationType 设置为 Event 。
猜你喜欢
  • 2018-06-09
  • 2017-01-01
  • 1970-01-01
  • 2018-05-19
  • 2016-12-31
  • 2020-03-23
  • 1970-01-01
相关资源
最近更新 更多