AWS SAM: общие файлы в функциях Lambda - PullRequest
0 голосов
/ 08 апреля 2019

Я работаю с AWS SAM (модель серверного приложения) для создания лямбда-кода Python 3.6 в настройках API-шлюза. Таким образом, у меня есть один template.yaml файл, который создает несколько функций Lambda. Они организованы с лямбда-функциями, каждая из которых находится в своем собственном подкаталоге в рамках проекта. У лямбды также есть несколько общих файлов, которые я храню в общей папке.

project-home
 -lambda_a_dir
   -lambda_a.py
 -lambda_b_dir
   -lambda_b.py
 -shared_dir
   -shared.py

Проблема в том, что хотя Pycharm может четко видеть shared.py, SAM не может и отказывается распознавать общие файлы со следующей ошибкой: Unable to import module 'lambdaA': No module named 'shared' Если я переместу копию файла shared.py в каждый каталог lambda и Pycharm, и SAM счастливы, и я могу собирать / развертывать в AWS.
Мой вопрос: как я могу создать шаблон SAM с общими файлами, живущими в общем каталоге?
До сих пор я пробовал:

  • Символическая ссылка и псевдоним MacOS.
  • Различные комбинации CodeUri альтернатив
  • Локальный пакет с __init__ и setup.py. (Я не могу использовать общедоступный пакет, потому что код является частным и не может быть помещен в общедоступный репозиторий.)

Вот мой файл шаблона:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  lambdaA:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: ./lambda_a_dir/
      Handler: lambda_a.lambda_handler
      Runtime: python3.6
  lambdaB:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: ./lambda_b_dir/
      Handler: lambda_b.lambda_handler
      Runtime: python3.6

1 Ответ

1 голос
/ 10 апреля 2019

Следуя рекомендации @Dunedan, я создал объект Layers для каждой лямбда-функции с общим кодом, что фактически добавило эти процедуры в PythonPath для этих функций.Я также добавил следующее в определение шаблона API с новыми свойствами Layers:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  lambdaA:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: ./lambda_a_dir/
      Handler: lambda_a.lambda_handler
      Runtime: python3.6
      Layers: 
        - arn:aws:lambda:us-west-1:012345678:layer:my_shared_zip:1
  lambdaB:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: ./lambda_b_dir/
      Handler: lambda_b.lambda_handler
      Runtime: python3.6
      Layers: 
        - arn:aws:lambda:us-west-1:012345678:layer:my_shared_zip:1

Обратите внимание, что код должен быть заархивирован перед его загрузкой и должен иметь структуру каталогов следующего вида:с кодом внутри каталога с названием языка.В этом случае, так как я использовал Python, код должен был находиться в каталоге python, а каталог python был заархивирован:

my_shared_zip.zip
 -python
   -shared.py
   -other_shared.py
   -more_shared.py

Последнее примечание.Хотя в идеале этот каталог shared-python должен развертываться непосредственно командой sam deploy в объектах Layer, я обнаружил, что поддержка Layers в CLI AWS SAM по-прежнему настолько нова и настолько глючит, что на данный момент еене работаетНадеюсь, в ближайшие месяцы это будет исправлено.Тем временем мне нужно вручную установить новые версии файла shared-zip.Вздох.

...