Cómo usar Cloud Firestore en AWS Lambda

Esta guía le enseñará cómo implementar correctamente una función AWS Lambda que utiliza el SDK de administración de Node.js Firebase para llamar a Cloud Firestore.

Antes de seguir leyendo, vale la pena mencionar que la forma más sencilla de escribir código sin servidor es usar Cloud Functions para Firebase, que funciona con Cloud Firestore de fábrica. Esta guía es solo para aquellos que están decididos a usar AWS Lambda.

Entonces, ¿por qué esto necesita una guía? Bueno, el SDK de Node.js para Cloud Firestore usa gRPC para comunicarse. gRPC se basa en código nativo y, de manera predeterminada, las funciones de AWS Lambda no pueden ejecutar código nativo. Si solo realiza la instalación de npm y luego carga su código, puede recibir un mensaje de error como este cuando intenta ejecutar su función lambda:

¡No temáis! Hay una solución bastante simple si sigue leyendo.

Prerrequisitos

Antes de continuar, debemos asegurarnos de que esté en el lugar correcto. Esta no es una guía sobre por qué es posible que desee utilizar AWS Lambda Functions ni es una guía sobre cómo usar Cloud Firestore. Además de conocer estos dos servicios, deberá asegurarse de que las siguientes dependencias estén instaladas en su máquina:

Estibador

Debe tener docker instalado en su máquina. Puede verificar si tiene docker ejecutando docker run hello-world. Si eso no funciona para usted, consulte los documentos sobre cómo instalar Docker.

AWS CLI (Opcional)

En esta guía usaremos la AWS CLI para implementar funciones de Lambda, aunque puede implementar sus funciones de la forma que desee. Para instalar la AWS CLI, siga las instrucciones en el archivo README de Github.

Preparar

Solo necesitaremos algunos archivos para completar esta guía. Cree un nuevo directorio con los siguientes archivos:

Su package.json puede ser extremadamente simple, todo lo que necesita es una dependencia de firebase-admin:

El cuerpo de su función debe estar en index.js. Cualquier función que escriba en Cloud Firestore funcionará, aquí hay una función extremadamente simple que agrega un nuevo documento en cada ejecución:

El archivo final, serviceAccount.json es una clave JSON para una cuenta de servicio que está autorizada para modificar los datos de Cloud Firestore en su proyecto Firebase. Este paso es necesario para usar firebase-admin en Lambda y no es específico para usar Cloud Firestore. Para obtener una nueva clave de cuenta de servicio, vaya a la página Cuentas de servicio en la consola de Firebase y seleccione "Node.js" y luego haga clic en "Generar nueva clave privada":

Genere una nueva clave de cuenta de servicio JSON

Si está utilizando el código anterior, cambie el nombre del archivo JSON resultante a serviceAccount.json y muévalo al directorio actual.

Instalar e implementar

Ahora que tiene configurado su entorno de desarrollo, está listo para implementar su función. El primer paso, y el paso más importante en esta guía, es usar docker para instalar sus dependencias:

Cuando este comando se complete, debe tener un directorio node_modules que contenga una carpeta firebase_admin. El uso de Docker para instalar las dependencias lo hace de manera que sea compatible con el entorno de tiempo de ejecución en su función AWS Lambda.

Ahora es el momento de implementar su función. Primero comprima su directorio actual. Esto creará un archivo ZIP bastante grande ya que se incluye todo el directorio node_modules:

Luego, use la CLI de AWS para implementar su función. Puede usar cualquier nombre, región y función que desee. Los únicos argumentos importantes aquí son handler, runtime y zip-file:

Finalmente, ejecuta tu función. Si funciona, debería ver algo como esto:

Ejecución exitosa de Lambda

Y en Firebase Console debería ver un nuevo documento en la colección lambda-docs:

Nuevos datos en Firebase

¡Eso es! Ha escrito datos con éxito en Cloud Firestore desde una función AWS Lambda.