Интересная пара дней, чтобы понять это. ... надеюсь, что ответ ниже будет некоторой помощью любому, кто пытается выяснить, как сделать пользовательский слой (для python, но и для других языков).
Где находитсялучшее место, где можно найти последнее изображение докера AWS AMI?
Ответ, как указывает Грэг выше, где находится «правильное» изображение докера для создания слоев: lambci/lambda:build-python3.7
. Это официальное репозиторий SAM для используемых ими образов докеров.
Полный список для всех лямбда-сред среды выполнения AWS, а не только для Python, здесь
Какой лучший способ создать свой собственный лямбда-слой AWS? ... Каков наилучший способ создания пользовательского слоя модуля Python?
На сегодняшний день я нашел лучший способ использовать SAM AWS в комбинации с некоторыми твиками, которые я использовал из замечательного блога здесь .
Твики нужны, потому что (на момент написания этой статьи) AWSSAM позволяет вам определять ваши слои, , но фактически не создает их для вас . ... См. этот запрос от github группы SAM.
Я не буду пытаться объяснить это очень подробно здесь - вместо этого, пожалуйста, ознакомьтесь с блог bryson3gps . Он объясняет это хорошо, и вся заслуга ему . *
ОК, краткий обзор процесса использования:
В настоящее время AWS SAM не будет build ваш слой для вас.
То есть, если вы определите файл require.txt для набора модулей для установки в слое, он фактически не установит / соберет их в локальный каталог, готовый для загрузки в AWS (так какделает, если вы используете его для определения лямбда-функции).
Но, если вы определите слой в SAM, он упакует (сжать все и загрузить на S3) и разверните (определите его в облаке AWS с помощью ARN и т. д. и т. д., чтобы его можно было использовать) этот слой для вас.
Способ заставить SAM построить свойСлои тоже
Взломать, в настоящее время, чтобы "обмануть" СЭМ в создании вашего слоя для вас, из блога bryson3Gps здесь , это
- Определите фиктивный шаблон лямбда-функции AWS в SAM. Затем для этой функции сделайте пип
requirement.txt
, который SAM будет использовать во время сборки, чтобы загрузить нужные модули в ваш слой. Вы фактически не будете использовать эту функцию ни для чего.
Это влечет за собой создание файла SAM template.yaml
, который определяет базовую функцию. Посмотрите учебник по SAM, а затем посмотрите блог bryson3gps. Это довольно просто.
Определите слой AWS в том же файле template.yaml
. Опять же, не слишком сложно - посмотрите блог
В спецификации SAM для определения слоя установите ContentUri
(т. Е. Где он ищет файлы / каталоги для архивации и загрузки в AWS) в место сборки для функции, которую вы определили в (1) .
Итак, когда вы используете sam build
, она создаст функцию для вас (т. е. обработайте requirements.txt
для функции) и поместите полученные пакеты функций в каталог для последующего архивирования и отправки в AWS.
Но (это ключ) у определенного вами уровня есть ContentUri
указывает на ту же самую директорию sam build, которая использовалась для создания каталога для (фиктивной) функции.
Итак, когда вы говорите SAM упаковать (отправить на S3) и развернуть (настроить с помощью AWS)) для шаблона в целом, он загрузит / создаст слой, который вы определили, , но также будет использовать правильное содержимое для слоя, который был построен для (фиктивной) функции.
Работает хорошо.
Пара дополнительных советов
1
В блоге bryson3gps он указывает, что этот метод не помещает пакет слоев в правильное местоположение в директории лямбда-AMI, чтобы они были найдены по умолчанию (для python, которыйэто / opt / python). Вместо этого они помещаются в /opt.
Его способ обойти это - добавить / opt к sys.path в ваших лямбда-скриптах перед импортом:
sys.path.append('/opt')
import <a module in your layer>
Вместо этого, перед sam package
загрузкой на S3 (после sam build
), вы можете перейти в соответствующий каталог .aws-sam/<your package subdir>
и переместить все в новый каталог / python в этом каталоге пакета. Это приводит к тому, что модули слоя помещаются в / opt / python правильно, а не просто /opt.
cd .aws-sam/<wherever you package is>/
mkdir .python
mv * .python
mv .python python
2
Если вы создаете слой Python со скомпилированнымкод (например, scikit-изображение, которое я использую) убедитесь, что вы используете sam build -u
(с флагом -u).
Это будет гарантировать сборку (pip«Требование.txt) будет происходить внутри док-контейнера, соответствующего лямбда-времени выполнения AWS, и DL будет иметь правильные библиотеки) для времени выполнения.
3
Если вы включаете какие-либо модуликоторые зависят от numpy или scipy, затем после sam build -u , но до пакета / deploy , убедитесь, что вы попали в соответствующий каталог .aws-sam/<your package>
, которыйсобран и удаляет модули numpy и scipy, которые установит зависимость
cd .aws-sam/<wherever you package is>/
rm -r numpy*
rm -f scipy*
Вместо этого вы должны указать использовать предоставляемый AWS слой numpy / scipy в вашей функции лямбды.
Я не смог найти способ заставить SAM запускать pip с параметром --no_dep, поэтому нужно сделатьэто вручную