Muy buenas, soy Luis y hoy les traigo otro nuevo post.
El popular marco sin servidor le permite usar YAML o JSON para describir y versionar su configuración de infraestructura. El archivo serverless.yml
o serverless.json
almacenado en la raíz del proyecto se utiliza de forma predeterminada para aprovisionar cualquier proyecto que utilice este marco.
Esta no es una revolución en el mundo de los frameworks IaC, donde la mayoría de ellos se basan en sintaxis de archivos declarativos para describir la infraestructura.
Sin embargo, una característica menos conocida e introducida recientemente le permite utilizar un archivo serverless.js
o serverless.ts
como el archivo de configuración predeterminado. En este artículo, describiré las ventajas de usar un formato de este tipo para crear aplicaciones sin servidor más rápido y con una mejor experiencia de desarrollador.
Índice
TL; DR
Puedes usar archivo serverless.ts
de servicio en el marco Serverless. Puede beneficiarse de:
- Tipos: puede utilizar los tipos de definición de archivos de servicio para obtener comentarios rápidos sobre las propiedades disponibles para cada bloque. Sin embargo, el marco no está escrito en TypeScript, por lo que las definiciones a veces pueden estar desactualizadas. Se requiere mantenimiento comunitario regular.
- Importaciones: Las importaciones de archivos JavaScript le permiten dividir el archivo de definición en varios archivos. Esto significa que puede tener definiciones detalladas de bloques de funciones junto a la base de código de su controlador.
- Referencias: puede escribir funciones personalizadas para crear una sintaxis intrínseca de AWS y navegar fácilmente a través de las definiciones de infraestructura, dependencia por dependencia, utilizando las funciones nativas de clic y seguimiento de su IDE.
Mecanografía
Las comunidades de TypeScript y Serverless unieron sus fuerzas para sentar las bases de los tipos de marcos sin servidor, que permiten comentarios directos al escribir un archivo de servicio sin servidor.
Si quieres probarlo, simplemente corre serverless create --template aws-nodejs-typescript
en un nuevo directorio (y asegúrese de que está utilizando al menos la versión 1.75 del marco Serverless para beneficiarse de serverless.ts
definición de archivo de servicio). El nuevo type Serverless
incluye todas las claves de configuración disponibles para el marco, lo que significa que no es necesario pasar por el ejemplo de configuración serverless.yml para obtener la sintaxis correcta.
A medida que el marco evoluciona, la comunidad mantiene todas las definiciones dentro del repositorio DefinitelyTyped. A diferencia de la validación del esquema JSON recientemente agregada, que se realizó directamente dentro del código fuente del marco, las definiciones requieren una mejora constante para seguir la evolución de las definiciones del archivo de servicio. Informe cualquier problema que encuentre para asegurarse de que esta definición se mantenga actualizada.
Importaciones
Los formatos de archivo JSON y YAML no se pueden dividir en varios archivos. Para evitar grandes archivos de definición de servicios al usar esos formatos, Serverless ideó una resolver variable dedicado, permitiendo el uso de la función $file(filepath)
para importar contenido de otros archivos.
Esto puede ser un apalancamiento, por ejemplo, para la definición de funciones. Un archivo serverless.yml todo en uno que contiene la definición de servicio completa:
Se puede dividir en varios archivos:
El problema con este enfoque es que confía en la definición de cadena de los otros archivos para que sea precisa. Esto puede provocar errores cuando la ruta de un archivo contiene un error tipográfico o cuando se mueve el archivo de origen. También afecta la experiencia del desarrollador, porque esos enlaces no pueden ser resueltos por su IDE de preferencia.
Cambiar a JavaScript y TypeScript elimina este problema. Los archivos dependientes se importan y sus enlaces generalmente se actualizan dinámicamente cada vez que cambia la estructura de directorios de su proyecto, gracias a su IDE. Cualquier desarrollador puede hacer clic y seguir los archivos referenciados para sumergirse en bloques de configuración de servicios específicos.
Usando el poder de las importaciones de Javascript, ahora podemos mantener la definición de la función mucho más cerca del código del controlador de funciones para aplicaciones complejas sin servidor:
Como puede ver arriba, tanto la configuración de funciones como el controlador están dentro del mismo archivo. Acelera considerablemente el desarrollo, ya que no se requiere navegación entre archivos para desarrollar una función de un extremo a otro. Tanto el contexto de ejecución como las instrucciones se encuentran dentro del mismo archivo de fácil acceso.
Referencias
A menudo es necesario inyectar atributos específicos de la infraestructura aprovisionada en otras partes de la infraestructura dentro de su aplicación. Por ejemplo, el código de su controlador Lambda puede depender del nombre de la tabla de DynamoDB para realizar la función requerida.
La forma habitual de hacer esto es utilizar funciones intrínsecas nativas de AWS en toda su archivo serverless.ts
de configuración. Inyecta bloques de sintaxis nativa de AWS CloudFormation en su archivo de servicio resources
propiedad, y esos servicios se proporcionan junto con sus funciones. A continuación, puede utilizar el Ref
función intrínseca para inyectar la tabla DynamoDB generada como una de las variables de entorno de su lambda en create.ts
.
El problema con esta sintaxis es el uso de Ref
con una cadena que representa la tabla de DynamoDB aprovisionada. No hay forma de que un desarrollador pase por la función create
para rastrear fácilmente qué recurso se hace referencia en el entorno del controlador. También es bastante fácil cambiar accidentalmente este valor sin notar su impacto. No recibirá ningún comentario que le diga que hizo referencia a un recurso inexistente hasta que realmente lo implemente en AWS.
Para que sea más amigable para los desarrolladores, puede escribir un pequeño servicio que maneje la función intrínseca de AWS por usted. Este servicio realmente usa tanto su valor resources
, así como el recurso único de AWS CloudFormation en sí mismo, para generar la sintaxis Ref
de salida correcta:
Luego, puede usar una sintaxis mucho más natural en la configuración de su función para que todos sepan qué definición está usando realmente el nombre. También es mucho más fácil saber qué funciones realmente dependen del recurso de AWS especificado, ya que su IDE puede decirle activamente todo el uso de la variable que representa el recurso MyTable
.
Conclusión
Otros marcos de IaC, como el AWS CDK, han comenzado a utilizar una sintaxis de configuración que permite una definición más funcional de la infraestructura.
El uso de objetos JavaScript y TypeScript para potenciar las definiciones del marco Serverless abre un nuevo mundo de posibilidades, con menos opciones definidas por texto, menos errores y facilitando que los desarrolladores conozcan el alcance del uso de un bloque de infraestructura específico.
Añadir comentario