Solución:
Para un caso de uso como Lambda, será mucho más feliz usando una implementación de Python pura como PyMySQL.
Es un reemplazo directo de MySQLdb que sigue la especificación de la API de base de datos de Python. Para la mayoría de las cosas, como los eventos Lambda activados, será igual de rápido.
Lo he usado mucho en producción y funciona muy bien.
Simplemente actualice su capa lambda cargando dos paquetes: – sqlalchemy – PyMySQL (controlador para usar en lugar de mysqlclient)
Ahora actualice la URL de su controlador a “mysql + pymysql: // …”.
Esto le hace utilizar el controlador pymysql que es compatible con el entorno Lambda para sus entornos existentes.
No olvide configurar el punto de enlace de la VPC para RDS. Esto mantiene bajo control el rendimiento y la seguridad.
TLDR: Sí, PUEDE usar mysqlclient
en las funciones de AWS Lambda Python.
Esta es una forma: creando su propia capa de AWS Lambda para mysqlclient
(es decir MySQLdb
).
Entonces consigo
Unable to import module 'lambda_function': No module named MySQLdb
Sé que si trabajo en una caja de Linux, entonces debería funcionar bien (como sugirieron algunas personas), pero me pregunto si puedo hacerlo funcionar desde una caja de OS X.
Yo también estaba enfrentando exactamente el mismo error al intentar import MySQLdb
en mi función AWS Lambda Python.
Después de mucho buscar una solución y no estar contento con usar pymysql
como sustituto (por razones de rendimiento y compatibilidad), terminé construyendo mi propia AWS Lambda Layer para mysqlclient
. No pude encontrar una capa “lista para usar” para mysqlclient
– ni siquiera en el impresionante proyecto de KLayers. Me complace compartir un repositorio de GitHub con una capa “lista para usar” de ejemplo y una solución fácil para crear su propia capa personalizada para sus requisitos que utiliza el procedimiento recomendado por AWS.
mysqlclient
(MySQLdb) es un contenedor de Python en torno a una implementación C de alto rendimiento de la API de MySQL. Esto lo hace típicamente mucho más rápido que las implementaciones de Python puro como pymysql
en la mayoría de los casos (consulte esta lista para ver algunos ejemplos), pero también trae algunos problemas como el que está enfrentando.
Dado que está compilado contra el mysql-devel
paquete (por ejemplo, un .rpm
o .deb
archivo proporcionado por MySQL), mysqlclient
está vinculado a un binario específico de la plataforma, como libmysqlclient.so
para que funcione. En otras palabras, el libmysqlclient.so
desde una computadora portátil Mac OS (como ejemplo) no funcionará en el entorno AWS Lambda que utiliza algún tipo de Amazon Linux 2
al momento de escribir este artículo. Tu necesitas un libmysqlclient.so
compilado en y para el entorno de AWS Lambda (o lo más cerca posible de él) para que funcione en su función de AWS Lambda.
Un entorno AWS-Lambda muy simulado está disponible en forma de imágenes de Docker de lambci.
Entonces, para empaquetar un AWS-Lambda compatible mysqlclient
tú podrías:
- tirar de un contenedor acoplable adecuado como
lambci/lambda:build-python3.8
- importar la clave GPG del repositorio de MySQL
- instale el RPM de configuración del repositorio de MySQL para que
yum
puede encontrar y descargar otros paquetes de repositorio de MySQL -
yum install
las dependencias necesarias, como la apropiadamysql-devel
rpm para su caso de uso - correr
pip install mysqlclient
en el contenedor - zip lo necesario
libmysqlclient.so
archivos y directorios python lib de mysqlclient
Este es más o menos el procedimiento recomendado oficialmente por AWS: consulte ¿Cómo creo una capa Lambda utilizando un entorno Lambda simulado con Docker? .
El zip así creado se puede utilizar para crear una nueva capa de AWS Lambda para mysqlclient
. Puede usar esta capa para usar fácilmente mysqlclient
sin errores en su función Lambda.
Después de muchos tirones de cabello, finalmente logré que el procedimiento completo funcionara y lo automaticé en un solo script (build.sh
) en este proyecto de GitHub. El código construye un layer.zip
archivo que puede cargar directamente como una nueva capa de AWS Lambda. El proyecto actualmente se compila para Python3.8 y el servidor MySQL 8.0.x, pero se puede adaptar fácilmente a una versión diferente de Python y a la versión de MySQL de destino usando las instrucciones y herramientas proporcionadas. También hay un listo para usar layer.zip
en el repositorio, en caso de que desee utilizar mysqlclient
contra MySQL v8.0.xy en Python 3.8 (ambos probados) en su función AWS Lambda. Nuestro entorno de producción usa SqlAlchemy, que usa esta capa MySqlClient Lambda y nos ha funcionado muy bien.
Después de configurar su función Lambda para usar una capa construida como se describe (por ejemplo, usando las herramientas en el repositorio mencionado anteriormente), puede simplemente import MySQLdb
como de costumbre en su función Lambda y continúe escribiendo su código real:
import MySQLdb
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': 'MySQLdb was successfully imported'
}
Espero que esto ayude.