Я определяю несколько лямбда-функций в одном файле template.yaml. Эти функции имеют некоторый общий код, но не опубликованные модули. Я предполагал, что смогу превратить этот общий материал в версионный слой. С каталогом, действующим следующим образом:
- Project
- LambdaFunc1
- package.json
- node_modules
- func1. js
- LambdaFunc2
- package.json
- node_modules
- func2.js
- common-stuff
- package.json
- my-common.js
- template.yaml
- node_modules
После тестирования я копирую common-stuff в каталог Projects / node_modules, а мои другие решения LambdaFuncs require ('common-stuff') основаны на перемещении Node вверх по структуре каталогов для не найденных модулей.
Чтобы SAM выполнил сборку / пакет / развертывание, я заметил, что SAM не затрагивает общие вещи, но создает структуру .aws-sam / build с двумя другими функциями Lambda. Мне нужно было создать структуру для SAMUR CodeURI для архивирования.
Package / common-stuff / packaged / nodejs / node_modules / common-stuff / с моим package.json и my-common.js. Мой package.json использует имя: "common-stuff", main: "my-common.js"
Других файлов нет - ничего нет в nodejs, так как я только упаковываю модули. Это кажется мне причиной для слоев. Я подтвердил, что SAM упаковывает zip-файл, содержащий nodejs / node_modules / common-stuff / ..., загрузив zip-файл Layer.
В определении шаблона функции Lambda я добавляю разрешение для разрешения 'lambda: GetLayerVersion». Когда я просматриваю лямбда-функцию в консоли, я вижу это разрешение вместе с другими.
Интересно, что aws lambda get-layer-version-policy --layer-name MyLayer --version-number 8 -Выводимый текст возвращает ошибку, что нет прикрепленных политик. Я предполагаю, что это потому, что я непосредственно добавил его в функцию, как я вижу это в функции Lambda с правильным Allow / GetLayerVersion.
Это, кажется, удовлетворяет тому, что я прочитал, однако Nodeне находит модуль. Журналы CloudWatch просто говорят, что не могут найти модуль, ничего о разрешениях или синтаксисе. Кроме того, эти функции работали, пока я не добавил подход Layer.
'sam local start-api' тоже не работает, та же ошибка. Когда я смотрю в каталог кэша слоев по умолчанию в Windows 10 C: \ Users \ me \ AppData \ Roaming \ AWS SAM \, там находится пустой каталог layer-pkg.
Есть ли какая-то другая магия, которую мне не хватает? Есть ли лучший подход для совместного использования общего кода между функциями Node Lambda?
Я не могу сказать, не может ли AWS получить слой, или структура zip неверна, или требование («обычный материал») отличается (надеюсь, что нет).
Скотт