Как вызвать функцию @app.route, созданную в zappa извне, используя boto3?
У меня есть zappa lambda, развернутая в arn:aws:lambda:us-east-1:xxxxx:function:xx-xx-prod, которая обслуживает маршрут следующим образом:
@app.route('/test', methods=['POST'])
def test():
response = app.response_class(
response=get_jsonstr({'test': 'OK'}),
status=200,
mimetype='application/json'
)
return response
Я хочу вызвать вышеупомянутую функцию test() из другой лямбда-функции следующим образом:
client = boto3.client('lambda', region_name='us-east-1')
r = client.invoke(
FunctionName='arn:aws:lambda:us-east-1:xxxxx:function:xx-xx-prod',
InvocationType='RequestResponse',
LogType='None',
Payload='',
)
print(r)
print(json.loads(r['Payload'].read()))
Вышеуказанный вызов выполняется следующим образом:
{
'ResponseMetadata': {
'RequestId': '37ecc17b-03a9-11e9-9ea0-9dee231dfb79',
'HTTPStatusCode': 200,
'HTTPHeaders': {
'date': 'Wed, 19 Dec 2018 16:14:55 GMT',
'content-type': 'application/json',
'content-length': '4',
'connection': 'keep-alive',
'x-amzn-requestid': '37ecc17b-03a9-11e9-9ea0-9dee231dfb79',
'x-amzn-remapped-content-length': '0',
'x-amz-executed-version': '$LATEST',
'x-amzn-trace-id': 'root=1-5c1a6e7d-8063e5004eab150d6c967b0;sampled=0'
},
'RetryAttempts': 0
},
'StatusCode': 200,
'ExecutedVersion': '$LATEST',
'Payload': <botocore.response.StreamingBody object at 0x11296ce10>
}
None
Как мне сказать обработчику zappa вызвать функцию test()?
Обновить:
Я обнаружил, что я могу добавить собственный обработчик в zappa_settings.json следующим образом:
"lambda_handler": "lambdafilename.test"
Затем я изменил тест () следующим образом:
@app.route('/test', methods=['POST'])
def test(event=None, context=None):
return json.dumps({'test': 'OK1'})
Теперь вызов возвращает ожидаемый результат:
{"test": "OK1"}
Однако с этим пользовательским обработчиком я теряю функциональность WSGI, которую предоставляет zappa/flask.
0 ответов
Я заглянул в исходный код Zappa CLI, чтобы понять, какzappa invoke
команда работает внутренне, потому что это именно то, что мы хотим: удаленно и программно вызывать определенную функцию в вашей лямбде Zappa.
payload = {'command': '<module_path>.lambda_handler_function'}
client = boto3.client('lambda', region_name='us-east-1')
client.invoke(
FunctionName='arn:aws:lambda:<arn>:function:<your_zappa_lambda_name>',
InvocationType='RequestResponse',
LogType='Tail',
Payload=json.dumps(payload),
)
Имейте в виду, что ваша функция должна принимать лямбда event
а также context
быть действительной точкой входа.
Для получения дополнительной информации о том, как zappa invoke
команда работает: