Creación de un servicio de monitoreo de sitios web altamente escalable en media hora usando AWS Lambda

Las funciones de Lambda son realmente increíbles, si no has leído sobre mi teoría de que los servidores sin servidor y más específicamente AWS Lambdas van a tomar el mundo en 2018, entonces échale un vistazo aquí:

Cómo la informática sin servidor cambiará el mundo en 2018
La informática sin servidor es un concepto bastante nuevo que de alguna manera explotó en términos de popularidad. Esto se debe en parte a … hackernoon.com

Tiene un par de lectores y de alguna manera se etiquetó como uno de los artículos medianos más leídos el 1 de enero … debe haber sido un día de noticias lento, supongo.

¿Qué puede hacer Serverless realmente?

Está muy bien evangelizar estas tecnologías sin servidor, pero no te muestra el verdadero potencial de la tecnología.

Entonces, en un intento por mostrarle lo que es realmente posible con Lambda, pensé que podría armar esto para guiarlo y mostrarle lo que realmente podría hacerse con la tecnología.

Presentando UpTimeGirl – Mi última puesta en marcha de Million Dollar

En este artículo voy a construir un monitor de tiempo de actividad del sitio web que permitirá a las personas completar un formulario y creará una nueva función lambda de manera automática para usted que controlará el estado de su sitio cada 15 minutos y le enviará un correo electrónico si uno de estos sitios muere. Me voy a centrar más en los conceptos orientados a Lambda y en los aspectos como IAM y la configuración de roles.

Cada buena startup necesita un nombre UpTimeGirl así que llamaremos a este servicio de supervisión del sitio web UpTimeGirl un pequeño homenaje a Billy Joel.

Descargo de responsabilidad: ¡Si gana un millón de dólares con esta idea, espero al menos una cerveza!

Requisitos

Como se trata de un proyecto de software, necesita un conjunto de requisitos; de lo contrario, ¿cómo podremos definir cualquier forma de éxito de nuestro proyecto? Como quiero construir una solución de monitoreo multimillonaria de primer nivel para todos mis sitios, quiero que tenga los siguientes requisitos:

  • NO DEBE bajar nunca.
  • DEBE ser barato para correr. Necesitamos maximizar las ganancias, por supuesto.
  • DEBE NOTIFICARME cuando un sitio se caiga, ya sea por mensaje de texto o correo electrónico
  • DEBE escalar a cientos, sino miles de sitios.

Un conjunto bastante aceptable de requisitos para un proyecto que reuniremos en menos de media hora, creo que estarás de acuerdo.

El frontend

El Frontend será una aplicación simple de VueJS que contará con un cuadro de entrada que tomará nuevos sitios para monitorear y una lista de mosaicos que muestran los sitios web ya registrados.

¿Por qué VueJS? – Actualmente estoy tratando de aprenderlo y pensé por qué no?

Esta será una interfaz simple que se verá así:

Si quieres el código fuente para esto, podrás encontrarlo en mi repositorio github aquí: https://github.com/elliotforbes/uptimegirl

Actualmente solo estoy usando una solicitud HTTP GET muy simple para activar la API de Python que construye las funciones de lambda.

La API

La API se escribirá en Python y usará Boto3 AWS SDK para permitirme interactuar con las diversas API de AWS. Esta API esencialmente incluirá una URL y el time_period y generará dinámicamente y creará una nueva función Lambda basada en estos parámetros.

Descargo de responsabilidad: puedo garantizar que esto no está listo para producción.

En este trozo de código, hemos creado una API REST aiohttp simple en Python 3.6. Esto contará con 2 puntos finales principales, un punto final get_functions y un punto final create_lambda_function al que se puede acceder a través de /funcs y /create respectivamente.

En la función get_functions() simplemente devolvemos una respuesta json que contiene todas las funciones actualmente registradas en nuestro servicio Lambda.

La función create_lambda_function() es donde se vuelve interesante. En esto creamos un objeto de diccionario de todas las variables de entorno que deseamos pasar. En este caso, solo estamos pasando la URL que deseamos supervisar. Para garantizar de algún modo los nombres de función únicos, creamos un nombre de función alfanumérica a partir de la URL con un poco de magia regex.

Después de hacer esto, creamos nuestro objeto de diccionario de Code que simplemente pasará en nuestro archivo lambda.zip como bytes. A continuación, pasamos el dict env y el dict de code a la función create_function AWS y es de esperar que creemos nuestra función lambda para nosotros.

Después de esto, tratamos de adjuntar un desencadenante de evento de CloudWatch a nuestra función lambda recién creada utilizando la función put_targets() y pasando el nombre de la regla de 15 minutos que ya definimos en la consola de AWS y la lista de objetivos. , en este caso, un solo objetivo.

Una vez que todo esto ha funcionado felizmente, devolvemos una respuesta simple que no es json (lo sé … lo siento).

En el repositorio github he incluido un archivo docker que se puede ejecutar y desplegar en AWS 'ECS si desea ir por esa ruta, por ahora lo mantengo todo en localhost porque todavía hay mucho más trabajo de desarrollo para estar hecho.

Las Lambdas

Las funciones de Lambda que crearemos de forma dinámica esencialmente intentarán captar cualquier URL que ingresemos mediante una simple solicitud GET . A continuación, ejecutaremos esto cada 15 minutos según la regla de eventos de CloudWatch que estamos utilizando para activar cada función.

En caso de que alguna de estas solicitudes programadas falle, se publicará automáticamente un evento en el SNS, que luego soltará un correo electrónico y enviará un mensaje de texto a quien esté suscrito a ese SNS.

El código

El código para nuestra función lambda es increíblemente simple. Todo lo que hace es intentar enviar una solicitud GET a una URL que recoge de una variable de entorno que se establece cuando creamos dinámicamente la función. Si esta solicitud falla, arroja una excepción.

Si quisiéramos que nuestro sistema nos notificara algún error, podríamos hacerlo de dos maneras diferentes. Podríamos ampliar nuestra función Lambda y agregar el código necesario para publicar en un tema SNS o podríamos configurar una alerta en CloudWatch siempre que un error informado por una de nuestras funciones Lambda arroje un error.

En aras de la simplicidad, optaremos por lo último:

¡Y bum! Tenemos un sistema de alerta que nos enviará un correo electrónico cada vez que nuestro sistema no funcione.

La lista de personas suscritas a este tema SNS podría ser modificada dinámicamente por la interfaz, pero tenemos que dejar algo de trabajo para hacer una vez que pase la primera ronda de financiación para nuestra startup.

Estamos en producción!

En menos de media hora hemos podido construir con éxito una solución de monitoreo completa utilizando una serie de funciones lambda que ahora están en vivo y en producción.

No solo es increíblemente resistente, sino que también se puede escalar a potencialmente miles de sitios y el costo de hacerlo es mínimo debido a la naturaleza muy pequeña de las lambdas que estamos creando.

La interfaz y la API que orquestan la incorporación de nuevos sitios a través de la creación de nuevas lambdas no se han implementado en ECS en este artículo, ya que sentí que estaba un poco fuera de alcance, pero hay un archivo Docker allí si desea comenzar con esto. . Si se sintiera realmente meta, podría servir totalmente la aplicación frontend desde una función Lambda y afrontarla usando el gateway API y luego dividir la API de Python en una serie de puntos finales Lambda, pero lo dejaré como una tarea de seguimiento para ¡el lector!

Todavía hay mucho por hacer para mejorar esto, pero espero que este simple ejemplo ayude a resaltar el increíble poder de las funciones de Lambda y cómo se pueden usar. En una aplicación tradicional, no solo habría tenido que escribir muchísimo más código, sino que habría tenido que implementarlo en múltiples zonas de disponibilidad. Todos estos representan una complejidad adicional que habría tomado más tiempo para construir y lanzar.

Conclusión

¡Espero que hayas encontrado este artículo perspicaz y divertido! Si necesita más ayuda para configurar estas funciones de lambda, no dude en dejar un comentario en la sección de comentarios a continuación o twittearme: Elliot Forbes

¡También estoy en LinkedIn si deseas conectarte!

Para aquellos que me siguen regularmente y disfrutan mi estilo de escritura, estoy publicando mi segundo libro a través de LeanPub titulado: ¡Una introducción al desarrollo de la nube a través de la historia! ¡Si te gusta apoyar tanto a mí como a EFF, échale un vistazo!

Una introducción al desarrollo de la nube
Este libro proporciona una introducción suave al mundo del desarrollo de la nube. Vamos a echar un vistazo en profundidad a … leanpub.com

Texto original em inglês.

Creación de un servicio de monitoreo de sitios web altamente escalable en media hora usando AWS Lambda

Las funciones de Lambda son realmente increíbles, si no has leído sobre mi teoría de que los servidores sin servidor y más específicamente AWS Lambdas van a tomar el mundo en 2018, entonces échale un vistazo aquí:

Cómo la informática sin servidor cambiará el mundo en 2018
La informática sin servidor es un concepto bastante nuevo que de alguna manera explotó en términos de popularidad. Esto se debe en parte a … hackernoon.com

Tiene un par de lectores y de alguna manera se etiquetó como uno de los artículos medianos más leídos el 1 de enero … debe haber sido un día de noticias lento, supongo.

¿Qué puede hacer Serverless realmente?

Está muy bien evangelizar estas tecnologías sin servidor, pero no te muestra el verdadero potencial de la tecnología.

Entonces, en un intento por mostrarle lo que es realmente posible con Lambda, pensé que podría armar esto para guiarlo y mostrarle lo que realmente podría hacerse con la tecnología.

Presentando UpTimeGirl – Mi última puesta en marcha de Million Dollar

En este artículo voy a construir un monitor de tiempo de actividad del sitio web que permitirá a las personas completar un formulario y creará una nueva función lambda de manera automática para usted que controlará el estado de su sitio cada 15 minutos y le enviará un correo electrónico si uno de estos sitios muere. Me voy a centrar más en los conceptos orientados a Lambda y en los aspectos como IAM y la configuración de roles.

Cada buena startup necesita un nombre UpTimeGirl así que llamaremos a este servicio de supervisión del sitio web UpTimeGirl un pequeño homenaje a Billy Joel.

Descargo de responsabilidad: ¡Si gana un millón de dólares con esta idea, espero al menos una cerveza!

Requisitos

Como se trata de un proyecto de software, necesita un conjunto de requisitos; de lo contrario, ¿cómo podremos definir cualquier forma de éxito de nuestro proyecto? Como quiero construir una solución de monitoreo multimillonaria de primer nivel para todos mis sitios, quiero que tenga los siguientes requisitos:

  • NO DEBE bajar nunca.
  • DEBE ser barato para correr. Necesitamos maximizar las ganancias, por supuesto.
  • DEBE NOTIFICARME cuando un sitio se caiga, ya sea por mensaje de texto o correo electrónico
  • DEBE escalar a cientos, sino miles de sitios.

Un conjunto bastante aceptable de requisitos para un proyecto que reuniremos en menos de media hora, creo que estarás de acuerdo.

El frontend

El Frontend será una aplicación simple de VueJS que contará con un cuadro de entrada que tomará nuevos sitios para monitorear y una lista de mosaicos que muestran los sitios web ya registrados.

¿Por qué VueJS? – Actualmente estoy tratando de aprenderlo y pensé por qué no?

Esta será una interfaz simple que se verá así:

Si quieres el código fuente para esto, podrás encontrarlo en mi repositorio github aquí: https://github.com/elliotforbes/uptimegirl

Actualmente solo estoy usando una solicitud HTTP GET muy simple para activar la API de Python que construye las funciones de lambda.

La API

La API se escribirá en Python y usará Boto3 AWS SDK para permitirme interactuar con las diversas API de AWS. Esta API esencialmente incluirá una URL y el time_period y generará dinámicamente y creará una nueva función Lambda basada en estos parámetros.

Descargo de responsabilidad: puedo garantizar que esto no está listo para producción.

En este trozo de código, hemos creado una API REST aiohttp simple en Python 3.6. Esto contará con 2 puntos finales principales, un punto final get_functions y un punto final create_lambda_function al que se puede acceder a través de /funcs y /create respectivamente.

En la función get_functions() simplemente devolvemos una respuesta json que contiene todas las funciones actualmente registradas en nuestro servicio Lambda.

La función create_lambda_function() es donde se vuelve interesante. En esto creamos un objeto de diccionario de todas las variables de entorno que deseamos pasar. En este caso, solo estamos pasando la URL que deseamos supervisar. Para garantizar de algún modo los nombres de función únicos, creamos un nombre de función alfanumérica a partir de la URL con un poco de magia regex.

Después de hacer esto, creamos nuestro objeto de diccionario de Code que simplemente pasará en nuestro archivo lambda.zip como bytes. A continuación, pasamos el dict env y el dict de code a la función create_function AWS y es de esperar que creemos nuestra función lambda para nosotros.

Después de esto, tratamos de adjuntar un desencadenante de evento de CloudWatch a nuestra función lambda recién creada utilizando la función put_targets() y pasando el nombre de la regla de 15 minutos que ya definimos en la consola de AWS y la lista de objetivos. , en este caso, un solo objetivo.

Una vez que todo esto ha funcionado felizmente, devolvemos una respuesta simple que no es json (lo sé … lo siento).

En el repositorio github he incluido un archivo docker que se puede ejecutar y desplegar en AWS 'ECS si desea ir por esa ruta, por ahora lo mantengo todo en localhost porque todavía hay mucho más trabajo de desarrollo para estar hecho.

Las Lambdas

Las funciones de Lambda que crearemos de forma dinámica esencialmente intentarán captar cualquier URL que ingresemos mediante una simple solicitud GET . A continuación, ejecutaremos esto cada 15 minutos según la regla de eventos de CloudWatch que estamos utilizando para activar cada función.

En caso de que alguna de estas solicitudes programadas falle, se publicará automáticamente un evento en el SNS, que luego soltará un correo electrónico y enviará un mensaje de texto a quien esté suscrito a ese SNS.

El código

El código para nuestra función lambda es increíblemente simple. Todo lo que hace es intentar enviar una solicitud GET a una URL que recoge de una variable de entorno que se establece cuando creamos dinámicamente la función. Si esta solicitud falla, arroja una excepción.

Si quisiéramos que nuestro sistema nos notificara algún error, podríamos hacerlo de dos maneras diferentes. Podríamos ampliar nuestra función Lambda y agregar el código necesario para publicar en un tema SNS o podríamos configurar una alerta en CloudWatch siempre que un error informado por una de nuestras funciones Lambda arroje un error.

En aras de la simplicidad, optaremos por lo último:

¡Y bum! Tenemos un sistema de alerta que nos enviará un correo electrónico cada vez que nuestro sistema no funcione.

La lista de personas suscritas a este tema SNS podría ser modificada dinámicamente por la interfaz, pero tenemos que dejar algo de trabajo para hacer una vez que pase la primera ronda de financiación para nuestra startup.

Estamos en producción!

En menos de media hora hemos podido construir con éxito una solución de monitoreo completa utilizando una serie de funciones lambda que ahora están en vivo y en producción.

No solo es increíblemente resistente, sino que también se puede escalar a potencialmente miles de sitios y el costo de hacerlo es mínimo debido a la naturaleza muy pequeña de las lambdas que estamos creando.

La interfaz y la API que orquestan la incorporación de nuevos sitios a través de la creación de nuevas lambdas no se han implementado en ECS en este artículo, ya que sentí que estaba un poco fuera de alcance, pero hay un archivo Docker allí si desea comenzar con esto. . Si se sintiera realmente meta, podría servir totalmente la aplicación frontend desde una función Lambda y afrontarla usando el gateway API y luego dividir la API de Python en una serie de puntos finales Lambda, pero lo dejaré como una tarea de seguimiento para ¡el lector!

Todavía hay mucho por hacer para mejorar esto, pero espero que este simple ejemplo ayude a resaltar el increíble poder de las funciones de Lambda y cómo se pueden usar. En una aplicación tradicional, no solo habría tenido que escribir muchísimo más código, sino que habría tenido que implementarlo en múltiples zonas de disponibilidad. Todos estos representan una complejidad adicional que habría tomado más tiempo para construir y lanzar.

Conclusión

¡Espero que hayas encontrado este artículo perspicaz y divertido! Si necesita más ayuda para configurar estas funciones de lambda, no dude en dejar un comentario en la sección de comentarios a continuación o twittearme: Elliot Forbes

¡También estoy en LinkedIn si deseas conectarte!

Para aquellos que me siguen regularmente y disfrutan mi estilo de escritura, estoy publicando mi segundo libro a través de LeanPub titulado: ¡Una introducción al desarrollo de la nube a través de la historia! ¡Si te gusta apoyar tanto a mí como a EFF, échale un vistazo!

Una introducción al desarrollo de la nube
Este libro proporciona una introducción suave al mundo del desarrollo de la nube. Vamos a echar un vistazo en profundidad a … leanpub.com