Невозможно импортировать sqlalchemy в функцию AWS Lambda - PullRequest
0 голосов
/ 08 июня 2019

Я знаю, что концепция использования пакета развертывания относительно проста, но я бился головой об этой проблеме в течение последних нескольких часов.Я следую документации от AWS по упаковке лямбда-зависимостей .Я хочу написать простую лямбда-функцию для обновления записи в таблице PostgreSQL при некотором событии.

Сначала я создаю новый каталог для работы:

mkdir lambdas-deployment && cd lambdas-deployment

Затем я создаю новую виртуальную среду и устанавливаю свои пакеты:

virtualenv v-env
source v-env/bin/activate
pip3 install sqlalchemy boto3 psycopg2

Моя trigger-yaml-parse.py функция (фактически она не использует sqlalchemy библиотеки пока нет, но я просто пытаюсь ее успешно импортировать):

import logging
import json
import boto3
import sqlalchemy

def lambda_handler(event, context):
    records = event['Records']
    s3_records = filter(lambda record: record['eventSource'] == 'aws:s3', records)
    object_created_records = filter(lambda record: record['eventName'].startswith('ObjectCreated'), s3_records)

    for record in object_created_records:
        key = record['s3']['object']['key']
        print(key)

Я следовал инструкциям в документации AWS.

zip -r trigger-yaml-parse.zip $VIRTUAL_ENV/lib/python3.6/site-packages/

Затем я добавляю в свой код функции:

zip -g trigger-yaml-parse.zip trigger-yaml-parse.py

Я получаю вывод updating: trigger-yaml-parse.py (deflated 48%).

Затем я загружаю свое новое архивированное развертывание в мое ведро сборки S3:

aws s3 cp trigger-yaml-parse.zip s3://lambda-build-bucket

Я выбираю загрузку из S3 в лямбда-консоли AWS: enter image description here

Однако моя лямбда-функция завершается с ошибкой при выполнении:

START RequestId: 396c6c3c-3f5b-4df9-b7f1-057842a87eb3 Version: $LATEST
Unable to import module 'trigger-yaml-parse': No module named 'sqlalchemy'

Что я делаю не так?Я следовал документации AWS буквально шаг за шагом.

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Я думаю, что ваша проблема может быть в этой строке:

zip -r trigger-yaml-parse.zip $VIRTUAL_ENV/lib/python3.6/site-packages/

Когда вы создаете zip-файл, сжатые файлы будут иметь полный путь к вашему диску.Среда выполнения Python в lambda не сможет найти библиотеки.

Вместо этого вы должны сделать что-то вроде этого

cd $VIRTUAL_ENV/lib/python3.6/site-packages/
zip -r /full/path/to/trigger-yaml-parse.zip .

Запустите unzip -t для обоих файлов, и вы увидите разницу.

1 голос
/ 09 июня 2019

из документации AWS :

"Zip-пакеты, загруженные с неправильными разрешениями, могут вызвать сбой выполнения. AWS Lambda требует глобальных разрешений на чтение для файлов кода и любых зависимых библиотек, которые составляютпакет развертывания "

Таким образом, вы можете использовать zip-информацию для проверки прав доступа:

zipinfo trigger-yaml-parse.zip

-r -------- означает, что только владелец файла имеетразрешения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...