Как я могу решить проблему cx_Oracle в Python при работе на AWS лямбда - PullRequest
0 голосов
/ 11 сентября 2018

Я столкнулся с сообщением об ошибке ниже, когда я тестировал на AWS лямбда.

Unable to import module 'lambda_handler': No module named 'cx_Oracle'

Эта лямбда состоит из кода Python, но особенно хорошо работает на моем localhost.

Кроме того, я выполнил команду pip install cx_Oracle -t ./ на том же уровне пути к файлу lambda_handler.py, и путь к файлу загруженного zip-файла ниже этого.

./lambda_handler.py

./cx_Oracle.cp36-win_amd64.pyd

./cx_Oracle-6.4.1.dist-info/*

./cx_Oracle-doc/*

Я не могу понять, почему lambda_handler не может найтиcx_Oracle library только в лямбда-функции.

Чего мне не хватает?

import cx_Oracle
import boto3
from docutils.nodes import row

def lambda_handler(event, context):

    url = 'myOracleUrl'
    user = 'myOralceUserId'
    pwd = 'myOraclePwd'
    con = cx_Oracle.connect(user + '/' + pwd + '@' + url)
    cur = con.cursor()
    cur.execute("select 1 from dual")
    cur.close()
    con.close()

    return {
        "statusCode": 200,
        "body": context.invoked_function_arn
    }

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Мы столкнулись с этой проблемой, и нам пришлось реализовать функции доступа к данным в AWS Lambda Java 8 вместо Python 3.6

В Java 8 ojdbc * .jar (* -> номер версиидрайвера Oracle) можно просто объединить в окончательный zip-архив, и нет никаких других шагов, таких как попытка получить собственные клиентские библиотеки Oracle.

Мы потратили достаточно времени, чтобы AWS Lambda Python Function получил доступ к базе данных Oracle,но я чувствовал, что разработка таких модулей в AWS Lambda Java 8 намного проще .

0 голосов
/ 21 ноября 2018

Краткий ответ :
Используемая вами библиотека cx_Oracle предназначена для Windows.Aws Lambda: Amazon Linux , * .pyd - библиотеки Python для Windows.

Длинный ответ : вам нужно развернуть версию linux Первое, что вы получаетенеправильно - это библиотека python, которую вы предоставляете вместе со своим кодом в AWS Lambda.Я предполагаю, что вы разрабатываете локально на компьютере с Windows, поэтому, когда вы делаете:

pip install cx_Oracle -t ./

, вы получаете скомпилированную библиотеку Python для Windows, которая является cx_Oracle.cp36-win_amd64.pyd .AWS Lambdas работают в контейнерах Linux.Вы можете найти некоторую информацию об окружающей среде здесь .Предварительно скомпилированная библиотека для Linux: cx_Oracle.cpython-36m-x86_64-linux-gnu.so .Вы можете загрузить его вручную из репозитория Pypi .

Так что при выполнении сценария Python в среде Linux он попытается найти предварительно скомпилированную версию библиотеки Linux по текущему пути,файл cx_Oracle.cpython-36m-x86_64-linux-gnu.so .Вот почему вы получаете сообщение об ошибке:

Unable to import module 'lambda_handler': No module named 'cx_Oracle'

Вторым важным моментом здесь является то, что библиотека Python cx_Oracle вызывает Oracle Instant Client , который является нативной библиотекой.Если у вас есть рабочий пример на вашем компьютере с Windows, вы должны установить его.Для окон эта библиотека имеет вид .dll-файлов.Для linux эта нативная библиотека имеет вид .so файлов.Вам нужно будет предоставить клиент Oracle для Linux вместе с вашим кодом в пакете развертывания, поскольку он еще не доступен в среде Amazon Linux.

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

LD_LIBRARY_PATH:/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib

Каталог /var/task, в котором находится ваше развертывание.Так что, если вы добавите мгновенный клиент Oracle для Linux под /var/task/lib, что составляет ./lib в каталоге разработки, все готово.

Ваш пакет развертывания должен быть похож на это:

├── lib                         
│   ├── libclntsh.so                            <-- Oracle instant client linux files
│            .
│            .
│            .
├── python_handler.py                           <-- Lambda function code
└── cx_Oracle.cpython-36m-x86_64-linux-gnu.so   <-- cx_Oracle library
0 голосов
/ 11 сентября 2018

cx_Oracle требует не просто pip install, а собственный клиент Oracle, от которого зависит колесо. Лямбда-функции выполняются на EC2 с ограниченным выбором нативных библиотек. Что бы это ни стоило, у вас возникла бы та же проблема практически с любой СУБД - PostgreSQL, MySQL и т. Д.

См. Эту статью для получения дополнительной информации: http://kb.sites.apiit.edu.my/knowledge-base/articles/aws/aws-chalice-deployment-with-oracle-vendor/

Обратите внимание, что это для развертывания на базе Chalice, но основное требование такое же.

...