Как вызвать функцию @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"

Затем я изменил test() следующим образом:

@app.route('/test', methods=['POST'])
def test(event=None, context=None):
  return json.dumps({'test': 'OK1'})

Теперь вызов возвращает ожидаемый результат:

{"test": "OK1"}

Однако с этим пользовательским обработчиком я теряю функциональность WSGI, которую предоставляет zappa/flask.


person kriss    schedule 19.12.2018    source источник


Ответы (1)


Я просмотрел исходный код интерфейса командной строки Zappa. чтобы выяснить, как 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:

if command == 'invoke'

command = {key: function_name}

person Stephan Schielke    schedule 31.05.2020