我有简单的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客户端将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())
提前谢谢!
答案 0 :(得分:5)
也许您可以将下一个代码添加到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')
我将编写一个通用示例,您可以轻松修改它以满足您的需求。在您的情况下,数据字典将具有request
和exp
个键,您需要找到您的lambda函数&#39}。
AWS Documentation Lambda.invoke
让我们假设从现在起我们有2个Lambdas命名为" master"和"奴隶"。主人会打电话给奴隶。
目前有3种类型的调用:
我保留#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只是一个echo函数
现在,主人需要必要的角色来调用它,以及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')
来自lambda的所有数据必须是JSON可序列化的。