Función AWS Lambda para conectarse a SQL Server con Python

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í:

imagen

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.

  • necesita saber que Lambda copia su función en local / var / task /
  • cree una instancia utilizando la AMI oficial de Lambda https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html
  • iniciar instancia, iniciar sesión
  • yum install gcc gcc-c++
  • ir a / home / ec2-user
  • Descargue el último administrador de Unixodbc de: ftp://ftp.unixodbc.org/pub/unixODBC/
  • 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
  • Vaya a / home dir y copie bin, include, lib, share en su computadora donde está el proyecto Lambda (por ejemplo: C: \ AWS \ Lambda \ sql_query)
  • instale en su instancia EC2 el controlador de Microsoft libmsodbcsql-13.1.so.9.1 y luego copie el archivo del controlador en el directorio local de su PC (por ejemplo: C: \ AWS \ Lambda \ sql_query \ msodbcsql \ msodbcsql \ lib64)
  • Eche un vistazo https://blogs.msdn.microsoft.com/sqlnativeclient/2017/02/04/odbc-driver-13-1-for-linux-released/
  • En su computadora, en el mismo directorio raíz, cree el archivo odbcinst.ini

[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!