Как понизить версию boto3 в лямбда-функции AWS - PullRequest
5 голосов
/ 30 апреля 2019

Мне нужно использовать свою собственную версию boto3 внутри Lambda (Python 3.7). Версия, включенная в стандартную версию Lambda Python 3.7 (1.9.42), не поддерживает использование Textract по той или иной причине.

Для этого я сделал следующее на основе guide :

  1. Создайте пользовательский пакет, используя следующие команды:
    • pip freeze > requirements.txt, что даст этот файл:
# requirements.txt
boto3==1.9.138
botocore==1.12.138
docutils==0.14
jmespath==0.9.4
python-dateutil==2.8.0
s3transfer==0.2.0
six==1.12.0
urllib3==1.24.2
  • mkdir build
  • pip3 install -r requirements.txt -t build/
  • cd build
  • zip -r ../boto3_layer.zip .

Затем я использовал графический интерфейс для загрузки нового лямбда-слоя (называемого boto3Layer). Затем я успешно добавил слой в свою лямбда-функцию.

Проблема в том, что я не могу понять, как импортировать указанный слой в мой код, используя встроенный редактор кода.

У меня есть следующий код:

...
from boto3_layer as boto3
...
log.info(boto3)

Я получаю ошибку "errorMessage": "Unable to import module 'lambda_function': No module named 'boto3_layer'"

Я также попытался импортировать только boto3, но подтвердил, что это была неправильная версия (это была версия, используемая Lambda), поэтому мой импорт не переопределил ее.

Я бы хотел просто знать, как импортировать мой пользовательский слой в мой код! Спасибо

редактировать: пробовать предложение:

  1. virtualenv python --python=python3.7
  2. source python/bin/activate, а затем pip3 install boto3
  3. zip -r boto3_layer.zip python/lib/
  4. Создайте новый лямбда-слой с boto3_layer.zip и добавьте слой к лямбда-функции
  5. Попытался запустить код сохранения выше Сбой с "errorMessage": "Unable to import module 'lambda_function': No module named 'boto3_layer'",

В итоге получилось импортировать boto3 вместо моего пользовательского имени.

import boto3

def lambda_handler(event, context):
  textract = boto3.client('textract')

Ответы [ 2 ]

5 голосов
/ 30 апреля 2019

Каталог не будет модулем / пакетом. Подход, который вы используете, никогда не будет работать.

Вместо всего этого создайте виртуальную среду, используя нужную версию Python - возможно, в Docker, в котором вы устанавливаете пакеты. Затем вам нужно будет сжать папку lib из виртуальной среды, чтобы при разархивировании слой сформировал структуру каталогов, аналогичную

python/
    lib/
        pythonx.y/
            site-packages/
                ...

Чтобы это работало, каталог верхнего уровня должен иметь имя python.

Если вы сделаете это правильно, то сможете нормально импортировать вашу версию boto3.

0 голосов
/ 30 апреля 2019

Файлы в лямбде будут разархивированы в каталог с именем /opt, и это будет включено в PYTHONPATH. Это означает, что вам нужен дополнительный слой boto3_layer в структуре zip.

...