У меня очень простая лямбда-функция Python3.6, единственная сложность в которой я хочу включить в нее pyyaml
.index.py
выглядит так -
import yaml
def handler(event, context):
return event
Все работает нормально, если я связываю pyyaml
в моей развертываемой Lambda, вот так -
(aws_layer_demo) justin@justin-XPS-13-9360:~/work/aws_demos/aws_layer_demo$ jar -tvf tmp/layer-demo-dev/2019-05-31-06-27-41.zip
59 Fri May 31 06:27:13 BST 2019 index.py
0 Fri May 31 06:19:32 BST 2019 __init__.py
4881 Fri May 31 06:15:37 BST 2019 yaml/composer.py
25554 Fri May 31 06:15:37 BST 2019 yaml/constructor.py
3294 Fri May 31 06:15:37 BST 2019 yaml/cyaml.py
{... etc ...}
Я могу пропинговать функцию Lambda и получитьответ, без проблем.
Теперь я хочу протестировать, включая pyyaml
внутри слоя.Итак, теперь у меня есть две развертываемые программы, одна для приложения -
(aws_layer_demo) justin@justin-XPS-13-9360:~/work/aws_demos/aws_layer_demo$ jar -tvf tmp/layer-demo-dev/2019-05-31-06-43-42.zip
59 Fri May 31 06:27:13 BST 2019 index.py
0 Fri May 31 06:19:32 BST 2019 __init__.py
и одна для слоя -
(aws_layer_demo) justin@justin-XPS-13-9360:~/work/aws_demos/aws_layer_demo$ jar -tvf tmp/layer-demo-layer-dev/2019-05-31-06-43-42.zip
0 Fri May 31 06:43:42 BST 2019 __init__.py
4881 Fri May 31 06:15:37 BST 2019 yaml/composer.py
25554 Fri May 31 06:15:37 BST 2019 yaml/constructor.py
3294 Fri May 31 06:15:37 BST 2019 yaml/cyaml.py
{... etc ...}
Я развернул обе, используя стек Cloudformation (через S3), и онпохоже, что и функция, и слой были развернуты правильно -
(aws_layer_demo) justin@justin-XPS-13-9360:~/work/aws_demos/aws_layer_demo$ ./scripts/show_function_config.sh dev
------------------------------------------------------------------------------------------------
| GetFunctionConfiguration |
+--------------+-------------------------------------------------------------------------------+
| CodeSha256 | MImn7X/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= |
| CodeSize | 372 |
| Description | |
| FunctionArn | arn:aws:lambda:eu-west-1:XXXXXXXXXXXX:function:layer-demo-dev |
| FunctionName| layer-demo-dev |
| Handler | index.handler |
| LastModified| 2019-05-31T05:44:14.089+0000 |
| MemorySize | 512 |
| RevisionId | XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
| Role | arn:aws:iam::XXXXXXXXXXXX:role/layer-demo-dev-AppFunctionRole-XXXXXXXXXXXX |
| Runtime | python3.6 |
| Timeout | 5 |
| Version | $LATEST |
+--------------+-------------------------------------------------------------------------------+
|| Layers ||
|+-------------+------------------------------------------------------------------------------+|
|| Arn | arn:aws:lambda:eu-west-1:XXXXXXXXXXXX:layer:layer-demo-dev:2 ||
|| CodeSize | 41184 ||
|+-------------+------------------------------------------------------------------------------+|
|| TracingConfig ||
|+-------------------------------+------------------------------------------------------------+|
|| Mode | PassThrough ||
|+-------------------------------+------------------------------------------------------------+|
|| VpcConfig ||
|+---------------------------------------------------------------+----------------------------+|
|| VpcId | ||
|+---------------------------------------------------------------+----------------------------+|
В частности, обратите внимание на "Layers" в приведенном выше примере и тот факт, что CodeSize> 0 (т.е. я случайно не развернул нулевой размерzipfile)
Но когда я пингую свою недавно слоистую функцию Lambda, я получаю -
Unable to import module 'index'
И если я углублюсь немного глубже в журналы Cloudwatch, я получаю -
Unable to import module 'index': No module named 'yaml'
Итак.Такое ощущение, что я, вероятно, каким-то образом неправильно структурировал свой пакет слоев (с точки зрения структуры каталогов), так что Lambda не видит yaml
на внутреннем AWS PYTHONPATH
.Или что-то.Кто-нибудь может посоветовать мне, где я могу пойти не так?
Большое спасибо.