Saltar al contenido

Problemas al usar MySQL con AWS Lambda en Python

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 apropiada mysql-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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *