Издевательская лямбда-функция, не работающая внутри контейнера python

#python #pytest #moto

Вопрос:

У меня есть пример использования, когда я издеваюсь над лямбда-функцией с помощью moto. Все отлично работает на моей локальной машине, но как только я нажимаю код и он запускается внутри python:3.8-slim контейнера, каким-то образом издевательская лямбда не возвращает должного ответа.

 def _process_lambda(func_str):
    zip_output = io.BytesIO()
    zip_file = zipfile.ZipFile(zip_output, "w", zipfile.ZIP_DEFLATED)
    zip_file.writestr("lambda_function.py", func_str)
    zip_file.close()
    zip_output.seek(0)
    return zip_output.read()
    
    
def get_test_zip_file1():
        pfunc = """
    from datetime import datetime
    data={}
    data['execution'] = {
                'started_timestamp': datetime.utcnow().isoformat()
                }
    def lambda_handler(event, context):
        print("custom log event")
        return {'body':metadata}
    """
        return _process_lambda(pfunc)
 

А ниже приведено, где я на самом деле создаю функцию и пишу некоторые утверждения.

 @mock_lambda
def test_mock_some_lambda(lambda_mock):
    import app
    lambda_mock.create_function(
        FunctionName='abc',
        Runtime='python3.7',
        Role=get_role_name(),
        Handler='lambda_function.lambda_handler',
        Code={"ZipFile": get_test_zip_file1()},
        Publish=True,
        Timeout=30,
        MemorySize=128
    )
    response=lambda_mock.invoke(
        FunctionName='abc'
    )
    response=json.load(response['Payload'])
    assert 'body' in response
 

Это прекрасно проходит на моем локальном устройстве, но внутри контейнера я получаю: AssertionError: assert 'body' in {} . Таким образом, похоже, что макет лямбды действительно создается внутри контейнера (в противном случае invoke выдал бы 404), но он возвращает {} вместо дикта, имеющего «тело» в качестве одного ключа.

Как эти вещи ведут себя по-другому ?

ОБНОВЛЕНИЕ— Похоже, что локально вызов выполняется синхронно, но внутри контейнера он выполняется синхронно. Затем я явно указал InvocationType='RequestResponse' параметр при вызове функции. Теперь я настраиваюсь /usr/local/lib/python3.8/json/decoder.py:355: JSONDecodeError , когда пытаюсь загрузить полезную нагрузку.