【问题标题】:call method of lambda function from another lambda function - Python从另一个 lambda 函数调用 lambda 函数的方法 - Python
【发布时间】:2019-02-07 01:23:09
【问题描述】:

我可以从另一个 lambda 函数调用 lambda 函数,但默认情况下它会转到处理程序方法。如何调用其中定义的其他方法?

假设有一个 lambda 函数 master.py,它将有其他 lambda 函数可以使用的通用方法,这样我就不必在每个函数中一次又一次地编写它们。现在我想从其他 lambda 函数调用 master.py 的方法(比如说 getTime()、authenticateUser() 等)。

基本上我想保留一个 lambda 函数,该函数将具有其他 lambda 函数可以使用的通用方法。
任何帮助表示赞赏。

下面是我尝试从另一个调用一个 lambda 函数的代码(我从 this question 获取代码)但它转到 handler() 方法:

lambda 函数 A

def handler(event,context):
    params = event['list']
    return {"params" : params + ["abc"]}

lambda 函数 B 调用 A

import boto3
import json

lambda_client = boto3.client('lambda')
a=[1,2,3]
x = {"list" : a}
invoke_response = lambda_client.invoke(FunctionName="functionA",
                                       InvocationType='RequestResponse',
                                       Payload=json.dumps(x))
print (invoke_response['Payload'].read())

输出

{
  "params": [1, 2, 3, "abc"]
}

【问题讨论】:

  • 您必须向我们展示您的代码。
  • @Coal_ 我已经用代码更新了这个问题。 :)
  • 看起来这正在工作......或者您显示的“输出”不是您获得的实际输出。
  • 其实我可以调用lambda函数,但是如何调用另一个lambda函数的具体方法呢?@Michael-sqlbot

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


【解决方案1】:

您可以在调用调用时在事件参数中传递运行所需的 lambda 函数方法所需的数据。如果您在 lambda_handler 的顶部包含以下代码,来自 lambda 函数以及您想要调用的方法。

def lambda_handler(event, context):
    """
    Intermediary method that is invoked by other lambda functions to run methods within this lambda
    function and return the results.

    Parameters
    ----------
    event : dict
            Dictionary specifying which method to run and the arguments to pass to it
            {function: "nameOfTheMethodToExecute", arguments: {arg1: val1, ..., argn: valn}}
    context : dict
            Not used

    Returns
    -------
    object : object
            The return values from the executed function. If more than one object is returned then they
            are contained within an array.
    """
    if "function" in event:
         return globals()[event["function"]](**event["arguments"])
    else:
        # your existing lambda_handler code...

然后,调用该方法并使用以下方法 invoke 从您的其他 lambda 函数获取返回值。

import json

# returns the full name for a lambda function from AWS based on a given unique part
getFullName = lambda lambdaMethodName: [method["FunctionName"] for method in lambda_client.list_functions()["Functions"] if lambdaMethodName in method["FunctionName"]][0]

# execute a method in a different lambda function and return the results
def invoke(lambda_function, method_name, params):
    # wrap up the method name to run and its parameters
    payload = json.dumps({"function": method_name, "arguments": params})
    # invoke the function and record the response
    response = lambda_client.invoke(FunctionName=getFullName(lambda_function), InvocationType='RequestResponse', Payload=payload)
    # parse the return values from the response
    return json.loads(response["Payload"].read())


[rtn_val_1, rtn_val_2] = invoke("fromLambdaA", "desiredFunction", {arg1: val1, arg2: val2})

请注意,附加到调用另一个 lambda 函数的函数的 lambda 策略需要两个策略:“lambda:ListFunctions”和“lambda:InvokeFunction”

【讨论】:

    猜你喜欢
    • 2022-12-05
    • 2020-03-23
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2019-07-01
    • 2018-10-26
    相关资源
    最近更新 更多