He estado atascado tratando de conectarme a un servidor SQL usando las funciones de AWS Lambda por un largo tiempo.
Para hacerlo, estoy tratando de usar cualquier biblioteca (probado con pyodbc, pypyodbc, etc.), empaquetando todo en un archivo zip y cargando el código.
El código es prácticamente el mismo para cada biblioteca, pero los errores son diferentes.
El código:
import pypyodbc def lambda_handler(event, context): conn = pypyodbc.connect('DRIVER={SQL Server};' 'SERVER=1.1.1.1;' 'DATABASE=dbname;' 'UID=user;' 'PWD=pwd') cur = conn.cursor() cur.execute("SELECT * FROM Table") item_count = 0 for row in cur: item_count += 1 print(item_count) cur.close() conn.close() return item_count
Problemas comunes que he cubierto: – Estoy agregando al zip el contenido del proyecto, no la carpeta. – También estoy agregando al archivo zip las bibliotecas necesarias para que se ejecute el código.
Si trato de usar pyodbc , el zip que estoy cargando se ve así:
.idea (dir) pyodbc (dir) lambda_function.py pyodbc.pyd
El error me sale:
Unable to import module 'lambda_function': No module named pyodbc
Después de buscar por un tiempo sobre esto, no pude encontrar nada que ayude. Solo un comentario que decía que se necesitaba instalar pyodbc en un entorno de Linux para que funcionara la función lambda. Pero no tengo ese Enviroment disponible, y tampoco sé si eso solucionará esto.
Si trato de usar pypyodbc , el zip que estoy cargando se ve así:
El error me sale:
module initialization error: 'ODBC Library is not found. Is LD_LIBRARY_PATH set?'
Para este, intenté instalar varios paquetes de Python sugeridos por otras publicaciones de stackoverflow (python-pyodb, unixodbc), pero siempre fallaba.
Luego hubo un comentario que decía “Asegúrate de poner bibliotecas ODBC nativas en la carpeta lib en tu paquete de implementación zip”
Tal vez eso es algo de ayuda? No sé cómo obtener bibliotecas ODBC nativas ..
Oh, y una última cosa. Ambas bibliotecas funcionan si las ejecuto desde mi máquina local. Puedo acceder al servidor de destino. Falla si lo hago desde la función lambda.
Esperemos que alguien pueda ayudarme y, aparentemente, todo el internet con esto.
yum install gcc gcc-c++
wget ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.5.tar.gz
tar xvzf unixODBC-2.3.5.tar.gz
cd unixODBC-2.3.5
configurarlo con el valor correcto de sysconfdir
./configure --sysconfdir=/var/task --disable-gui --disable-drivers --enable-iconv --with-iconv-char-enc=UTF8 --with-iconv-ucode-enc=UTF16LE --prefix=/home
make install
[ODBC Driver 13 for SQL Server] Description=Microsoft ODBC Driver 13 for SQL Server Driver=/var/task/msodbcsql/msodbcsql/lib64/libmsodbcsql-13.1.so.9.1 UsageCount=1
En su computadora, en el mismo directorio raíz, cree el archivo odbc.ini
[ODBC Driver 13 for SQL Server] Driver = ODBC Driver 13 for SQL Server Description = My ODBC Driver 13 for SQL Server Trace = No
en tu progtwig python usa pyodbc:
import pyodbc def lambda_handler(event, context): server = "xxxxxxxxxxxxxxxxxxxx" database = "xxxxxxxxxxxxxxxxxxxx" username = "xxxxxxxxxxxxxxxxxxxx" password = "xxxxxxxxxxxxxxxxxxxx" cnxn = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) cursor = cnxn.cursor() ...other things....
y ahora juega el juego!