Доступ к Oracle из AWS Lambda в Python - PullRequest
0 голосов
/ 08 марта 2019

Я пишу (надеюсь) простую AWS Lambda, которая сделает RDS Oracle SQL SELECT и отправит результаты по электронной почте. До сих пор я использовал консоль управления Lambda, но все примеры, с которыми я сталкивался, говорят о создании пакета развертывания Lambda. Итак, мой первый вопрос: могу ли я сделать это с помощью Lambda Management Console?

Следующий вопрос, который у меня возникает, - что импортировать для Oracle DB API? Во всех примерах, которые я видел, они загружают и собирают пакет с помощью pip, но это, похоже, подразумевает использование пакета развертывания (см. Выше). Попытка импортировать любой из этих модулей, перечисленных в примерах, просто дает «Модуль без имени» ...

После написания вышеизложенного я покопался в ссылке на API boto3 и придумал:

import boto3
client = boto3.client('rds-data')

Но выдает ошибку: Неизвестная служба: 'rds-data'.

Так что я все еще потерян.

Как вы, вероятно, можете сказать, я новичок в среде Lambda. Любые предложения или примеры будут с благодарностью. Спасибо.

Ответы [ 3 ]

1 голос
/ 08 марта 2019

старая версия boto3 не поддерживает rds-данные.но вы можете развернуть пакет с папкой zip.я рекомендую вам использовать import cx-oracle для этой установки cx-oracle с использованием pip и загрузки zip-пакетов.отметьте это [ Как я могу получить доступ к Oracle из Python?

1 голос
/ 08 марта 2019

По-видимому, AWS Lambda использует более старую версию boto3, у которой пока нет rds-data.

Так что, боюсь, вам придется создать пакет развертывания, содержащий более свежую версию boto3.

Один из способов сделать это будет:

Создайте файл-обработчик лямбды (в данном случае с именем index.py).

def my_handler(event, context):
    client = boto3.client('rds-data')
    print(client)
    # do stuff

    return "hello world"

Добавьте файл requirements.txt в ту же папку, который будет содержать что-то вроде:

awscli >= 1.16.118
boto3 >= 1.9.108

Теперь запустите это (в зависимости от настроек на вашем компьютере, вы можете использовать pip вместо pip3) в каталоге / папке вашего индекса и файла требований:

pip3 install -r requirements.txt -t . 
zip -r somezipname .

Затем загрузите этот zip и измените «точку входа» вашего обработчика на index.my_handler. Код должен теперь работать без ошибок.

0 голосов
/ 13 марта 2019

После долгих стонов и скрежетов зубов я нашел успешное решение.

rds_data (подтверждено службой поддержки AWS) поддерживает только базы данных Aurora. Жаль, что документы AWS не упомянули это. 8 {(>

Благодаря ответам выше, а также Джейсону Лэндри за подсказки относительно решения.

Чтобы получить доступ к RDS / Oracle, вам необходимо использовать cx_Oracle. Но подождите, это еще не все.

cx_Oracle не входит в стандартную среду Lambda, поэтому вам нужно привезти свою собственную. Моя среда разработки находится на Windows, но среда Lambda - это Linux. Итак, вам нужно скачать и установить в ваш каталог упаковки, который я получил от https://pypi.org/project/cx-Oracle/#files. Установить локально с:

pip install cx_Oracle-7.1.2-cp37-cp37m-manylinux1_x86_64.whl -t .

Вы увидите, как несколько файлов появятся в. Затем вам нужно найти систему Linux и скачать /lib64/libaio.so.1.0.1 и назвать ее libaio.so.1 в вашем каталоге пакетов.
А затем вам нужно загрузить как базовый пакет Oracle для клиентов, так и пакеты SDK с http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html.

Создайте zip-файл со всеми этими элементами (включая ваш собственный исходный код Python). При этом переименуйте файлы моментального клиента Oracle libclntsh.so.11.1 в libclntsh.so и libocci.so.11.1 в libocci.so.

Загрузите zip-архив в корзину S3, так как прямое развертывание ограничено 66 МБ, и этот zip-файл немного больше.

Создайте Lambda с соответствующими разрешениями IAM и доступом к VPC, установите пакет, и все будет хорошо.

Я обнаружил, что если вы не включите все мгновенные клиентские файлы, вы начнете получать ошибки Oracle по поводу отсутствия информации о часовом поясе и NLS.

Список содержимого почтового индекса (для меня YMMV):

    7996693  08/24/2013 12:30   libnnz11.so
          0  03/11/2019 16:10   cx_Oracle-7.1.1.data/
          0  03/11/2019 16:10   cx_Oracle-7.1.1.data/data/
          0  03/11/2019 16:10   cx_Oracle-7.1.1.data/data/cx_Oracle-doc/
          0  03/11/2019 16:10   cx_Oracle-7.1.1.dist-info/
       1325  03/13/2019 12:35   Email.py
       1805  02/19/2019 21:11   cx_Oracle-7.1.1.data/data/cx_Oracle-doc/LICENSE.txt
        163  02/19/2019 21:11   cx_Oracle-7.1.1.data/data/cx_Oracle-doc/README.txt
        851  02/19/2019 21:11   cx_Oracle-7.1.1.dist-info/METADATA
        628  02/19/2019 21:12   cx_Oracle-7.1.1.dist-info/RECORD
        109  02/19/2019 21:12   cx_Oracle-7.1.1.dist-info/WHEEL
         10  02/19/2019 21:11   cx_Oracle-7.1.1.dist-info/top_level.txt
    2270301  02/19/2019 21:11   cx_Oracle.cpython-37m-x86_64-linux-gnu.so
       2140  03/13/2019 14:21   getSecrets.py
       5560  03/12/2019 08:48   libaio.so.1
   53865194  08/24/2013 12:30   libclntsh.so
  118738042  08/24/2013 12:30   libociei.so
       7633  03/13/2019 16:39   scheduleReports.py
...