Включая локальные каталоги исходного кода и файлы в aws -sam? - PullRequest
1 голос
/ 17 апреля 2020

Я работаю в моно репо, где у меня есть приложение 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...
    .
    .
    .

Вы можете разделить мое приложение на три части:

  1. Внешние пип-пакеты, такие как pandas, numpy, et c. Эти пакеты меняются редко. Иногда я добавляю новый. Они занимают много времени для установки. Они должны быть встроены в контейнер docker, который соответствует времени выполнения лямбды (поскольку любой, кто использовал numpy / pandas, усвоил сложный путь).
  2. Исходный код в моно репо неявно называется из моей лямбды. Так что, если вы следуете вместе с предварительным просмотром выше. my_folder1.my_folder2.my_folder3.file3 может выглядеть так:

    from my_folder1.my_folder837278 import my_utility_function
    
    class MyClass:
        my_utility_function()
    
    ...
    

    Этот код часто меняется. Не нужно встраивать docker образ.

  3. Мой реальный лямбда-код, явно вызываемый обработчиком в: ./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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...