AWS Lambda:使用boto3 invoke从另一个AWS lambda调用函数

Kyr*_*ylo 3 python amazon-web-services boto3 aws-lambda

我有位于以下端点下的简单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}
Run Code Online (Sandbox Code Playgroud)

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

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

我的问题:

如何使用boto3 lambda客户端将path和传递query_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())
Run Code Online (Sandbox Code Playgroud)

先感谢您!

小智 7

也许您可以将下一个代码添加到您的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')
Run Code Online (Sandbox Code Playgroud)

我将编写一个一般示例,您可以轻松地对其进行修改以满足您的需求。在您的情况下,数据字典将具有requestexp键,并且您需要找到lambda函数的arn。

AWS文档Lambda.invoke

让我们假设从现在开始,我们有两个Lambda,分别命名为“ master”和“ slave”。主人将呼叫奴隶。

目前有3种类型的调用:

  1. RequestResponse(默认):主控方调用并等待从属方响应
  2. 事件:异步,主叫和忘记
  3. DryRun:在运行之前进行一些验证

我保持#1 RequestResponse:

奴隶:

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

它的阿恩就像 arn:aws:lambda:us-east-1:xxxxxxxxxxxxxx:function:slave

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

现在,母版需要具有必要角色的权限才能调用它,以及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
Run Code Online (Sandbox Code Playgroud)

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

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