#python #amazon-web-services #aws-lambda #python-decorators #pydantic
#python #amazon-веб-сервисы #aws-lambda #python-декораторы #pydantic
Вопрос:
Я работаю над функцией python AWS Lambda, которая использует pydantic для выполнения проверки входных данных. Недавно я обнаружил, что время ожидания Lambda истекает (с таймаутом 15 секунд) при выполнении следующего кода:
def _stringify(v):
return str(v)
class SomeModel(BaseModel):
a: int
_stringify = validator("a", allow_reuse=True)(_stringify)
SomeModel(a=12)
Я определил, что проблема возникает при вызове, _stringify = validator("a", allow_reuse=True)(_stringify)
который передает функцию _stringify декоратору валидатора. Это полностью функционально в локальной среде, но не в AWS Lambda. Следующее альтернативное определение ‘SomeModel’ также работает в среде AWS Lambda.
class SomeModel(BaseModel):
a: int
@validator("a")
def stringify(cls, v):
return str(v)
Есть ли у кого-нибудь, кто лучше разбирается в AWS Lambda, какие-либо идеи относительно того, почему _stringify = validator("a", allow_reuse=True)(_stringify)
возникает время ожидания, и можете ли вы предложить какие-либо возможные исправления?
(Примечание: Альтернативное определение SomeModel нежелательно, поскольку оно нарушает принципы DRY, поскольку мы хотим использовать _stringify в нескольких моделях.)
Код не вызывает исключений при запуске как локально, так и в среде Lambda.
Среда:
AWS Lambda
python 3.8 — Пользовательская сборка среды выполнения с помощью docker. Лямбда-слои, поддерживающие:
- pydantic — v1.6.1 (python 3.8)
Комментарии:
1. Сколько времени это занимает при локальном запуске? Есть ли какие-либо исключения?
2. Рабочая версия эквивалентна записи
stringify = validator("a")(stringify)
после простого определения функции. Нерабочая версия — это, по сути, всего лишь часть после знака равенства — на самом деле вы ничего не определяете,SomeModel
на нее никоим образом не влияет строка кода.3. Локально для запуска @Parsifal требуется 1,4 микросекунды.
4. Я попробовал ваше предложение @jasonharper, но это не устранило проблему. Хорошая уловка, хотя 🙂 .
5. Я отредактировал код, чтобы исправить ошибку, замеченную @jasonharper.
Ответ №1:
Среда: python 3.8
AWS Lambda не поддерживает Python 3.8, если вы не используете свою собственную среду выполнения (https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html ).
Вам нужно выполнить следующие шаги:
- Проверьте, работает ли ваш код без проблем в Python 3.7
- Проверьте настройки вашего Lambda и убедитесь, что он настроен на использование Python 3.7
- Подготовьте zip-файл со всеми вашими сторонними зависимостями (pydantic и т.д.) И загрузите его на веб-страницу конфигурации вашей AWS Lambda или используйте его в своих скриптах в процессе развертывания вашей Lambda: https://docs.aws.amazon.com/lambda/latest/dg/python-package.html . Не забудьте использовать Python3.7 и соответствующий дистрибутив Linux для этого шага. Лучше использовать CentOS (или соответствующий пакет подсистемы Windows для Linux (WSL)). Однако Ubuntu 18.04 (и соответствующий пакет WSL) большую часть времени работает должным образом. Загрузите соответствующий общий Linux-совместимый.whl-файлы из pypi.org если вы столкнулись с проблемой с каким-либо сторонним пакетом python и добавили это .замените файл whl на сгенерированный zip-файл с вашими сторонними зависимостями.
Без нашего шага # 3 вы не сможете использовать сторонние библиотеки
Комментарии:
1. Привет! Мы работаем с пользовательской средой выполнения, созданной с использованием docker для поддержки python 3.8 и других зависимостей. Я обновлю сообщение, чтобы сделать это более понятным.