Я работаю в моно репо, где у меня есть приложение AWS SAM (lambda). Структура примерно такова:
.
├── my_folder1
├── file1.py
├── __init__.py
└── file2.py
├── my_folder2
│ └── my_folder3
│ ├── __init__.py
│ └── file3.py
├── sam-app
│ ├── events
│ │ └── event.json
│ ├── README.md
│ ├── samconfig.toml
│ ├── template.yaml
│ ├── tests
│ └── hello_world
│ ├── __init__.py
│ ├── requirements.txt
:preview:
numpy
pandas
...
│ └── app.py
:preview:
import pandas
from my_folder1.my_folder2.my_folder3.file3 import MyClass
...
.
.
.
more_folders...
.
.
.
Вы можете разделить мое приложение на три части:
- Внешние пип-пакеты, такие как
pandas
, numpy
, et c. Эти пакеты меняются редко. Иногда я добавляю новый. Они занимают много времени для установки. Они должны быть встроены в контейнер docker, который соответствует времени выполнения лямбды (поскольку любой, кто использовал numpy / pandas, усвоил сложный путь). Исходный код в моно репо неявно называется из моей лямбды. Так что, если вы следуете вместе с предварительным просмотром выше. my_folder1.my_folder2.my_folder3.file3
может выглядеть так:
from my_folder1.my_folder837278 import my_utility_function
class MyClass:
my_utility_function()
...
Этот код часто меняется. Не нужно встраивать docker образ.
- Мой реальный лямбда-код, явно вызываемый обработчиком в:
./my_folder1/sam-app/hello_world/app.py
Допустим, я запускаю sam build --use-container
команда. Это замечательно! Создает .aws-sam/build/MyFunction/pandas
, .aws-sam/build/MyFunction/numpy
, et c. И эти пип-пакеты созданы против amazon- linux и могут быть использованы лямбда. Проблема в том, что мой локальный импорт (например, from my_folder1.my_folder2.my_folder3.file3 import MyClass
) явно потерпит неудачу.
Мой вопрос: возможно ли синхронизировать c локальный импорт моего кода с моим приложением sam с помощью существующая спецификация шаблона? Лучшие документы по шаблону spe c
Дополнительная информация:
Как мне обойти это в настоящее время? Я пишу bash скрипты, которые выглядят так, и запускаю их после sam build --use-container
:
.
.
.
rsync "${EXCLUSIONS[@]}" -r $LOCAL_MODULES0 $LOCAL_MODULES1 ./.aws-sam/build/${FUNCTION}/my_folder2
rsync "${EXCLUSIONS[@]}" -r $LOCAL_MODULES2 $LOCAL_MODULES3 ./.aws-sam/build/${FUNCTION}/
.
.
.
, которые копируют / syn c соответствующие локальные каталоги в каталог сборки, чтобы они выглядели так, как будто они были установлены в pip. , Поскольку у лямбды уже должна быть эта папка в пути python.
У меня также есть папка только для ./my_folder1/sam-app/hello_world/
.
Вещи, которые отстой:
- Поскольку пакеты pip настолько велики, вы не можете просматривать лямбда-код в пользовательском интерфейсе. Если бы они были слоями и были помещены в / opt / python вместо / var / task, это действительно было бы возможно.
Вещи, которые я хочу:
sam build --use-container --dependencies
- Сборка внешних пакетов (установленных с помощью pip) на образе docker. Занимает много времени, но нужно сделать только один раз (если не удалены / не добавлены зависимости). sam build
- Так как --dependencies
не указан, просто монтирует код в ./my_folder1/sam-app/hello_world/
вместе с любыми указанными локальными каталогами в template.yaml - Предварительная сборка команд в template.yaml. Улучшает настраиваемость.
sam local invoke
- должно быть sam build && sam local invoke
- Внешние зависимости (например, пакеты pip) должны быть по умолчанию разделены на слои. Загружено на s3.