Función AWS Lambda para iniciar y detener una instancia EC2

Lambda pertenece al servicio «Compute» de AWS (Amazon Web Services). Con Lambda podemos codificar sin aprovisionar ni gestionar servidores. Lambda ejecuta automáticamente nuestro código sin que tengamos que aprovisionar o gestionar servidores. Sólo tenemos que escribir el código y subirlo a la función Lambda.

Lambda ejecuta el código sólo cuando es necesario. Crece automáticamente soportando desde unas pocas peticiones hasta miles de peticiones.

Se nos cobra por cada 100ms que ejecuta nuestro código y por el número de veces que se dispara. Se nos cobra sólo por el tiempo de computación que consume nuestro código y no se nos cobra cuando el código no se ejecuta. Para saber más sobre la facturación haz clic aquí.

Lo que tenemos que proporcionar es sólo el código y AWS Lambda se encarga del mantenimiento, el autoescalado y la alta disponibilidad. Este código también puede ejecutarse en respuesta a eventos. Para utilizar Lambda, tenemos que escribir el código en uno de los lenguajes que proporciona.

En este artículo, veremos cómo crear una función Lambda sencilla que pueda iniciar/detener una instancia EC2.

Requisitos previos

  1. Cuenta de AWS (Crea si no tienes una)
  2. Conceptos básicos del servicio EC2(Haz clic aquí para aprender EC2).

Qué vamos a hacer

  1. Iniciar sesión en AWS.
  2. Crear una Función Lambda.
  3. Modificar el rol IAM
  4. Ejecutar el rol

Inicia sesión en AWS

  1. Haz clic en aquí para ir a la página de inicio de sesión de AWS.

Cuando pulsemos el enlace anterior, veremos una página web como la siguiente en la que se nos pide que iniciemos sesión con nuestros datos de acceso.

Acceso a AWS

Una vez que iniciemos sesión en AWS con éxito, veremos la consola principal con todos los servicios listados como sigue.

Consola de administración de AWS

Crear una función Lambda

Antes de proceder a la creación de una Función Lambda, selecciona la región deseada y más cercana.

Haz clic en la flecha cerca de la región por defecto (Aquí es París) y verás una lista de regiones disponibles y selecciona la región deseada. Aquí he seleccionado «París», manteniéndola sin cambios. Puedes seleccionarla según tu elección o necesidad.

Crear una función lambda

Haz clic en «Servicios» en la esquina superior izquierda y verás la siguiente pantalla con todos los servicios disponibles en AWS. Haz clic en «Lambda» disponible en «Computación»

Lamda

Obtendrás una pantalla donde podrás crear una Función Lambda. Haz clic en «Crear función».

Crear función

Puedes crear una función por tu cuenta, utilizar los blueprints existentes o navegar por un repositorio donde podemos buscar la función requerida para ver si existe. En este caso, crearemos nuestra propia y sencilla Función Lambda utilizando Python.

Haz clic en «Autor desde cero» para escribir nuestra propia Función Lambda.

Proporciona un nombre a la Función.

Selecciona «Python 3.6» en la lista desplegable de Tiempo de ejecución.

Elige el tiempo de ejecución de Python

La Función Lambda necesita tener permisos suficientes para su ejecución. Selecciona «Crear un nuevo rol con permisos básicos de Lambda». Esto creará un nuevo Rol con el mismo nombre que el de la Función con alguna clave aleatoria como sufijo.

Configurar los permisos

Los permisos por defecto anteriores no son suficientes. Lo entenderemos mejor en el siguiente paso. Por ahora, nos limitaremos a crear una función y a ver qué posibles errores pueden surgir.

Añade el siguiente código en la función y haz clic en el botón «Guardar» para guardar la función.

Cambia el valor de «región e instancias«.

import boto3
region = 'eu-west-3'
instances = ['i-05be5c0c4039881ed']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
    ec2.stop_instances(InstanceIds=instances)
    print('stopped your instances: ' + str(instances))

Función Lamda en AWS

Código de función

Haz clic en el botón «Seleccionar un evento de prueba» disponible junto al botón «Prueba» y selecciona en «Configurar evento de prueba». Obtendrás la siguiente pantalla. No hagas ningún cambio y sólo dale un nombre al evento, aquí es «testStopEC2» y haz clic en «Guardar». Este evento es sólo un evento de muestra y no tiene ninguna relevancia con nuestra función. Podemos crear un evento diferente según nuestras necesidades.

Configurar el evento de prueba

Nota: Podemos crear un evento de Cloudwatch con el que podemos activar esta función Lambda basándonos en el evento que se activó en Cloudwatch. No vamos a hablar de esto ahora, ya que necesitaría una comprensión clara de Cloudwatch.Así que procederemos con un evento sencillo. Puedes explorar esto una vez que te familiarices con Lambda y Cloudwatch.

Ahora haz clic en «Prueba». Fíjate bien, la función no se ha ejecutado por falta de permisos. Esto es lo que comentaba en el paso anterior. No te asustes al ver el error. Vamos a asignar los permisos necesarios al rol que se creó al crear la función Lambda.

Prueba de la función Lamda

Modificar el rol IAM

Haz clic en «Servicios» en la parte superior derecha de la pantalla y busca IAM.

Servicio IAM

Verás una pantalla como la siguiente. Esta es la pantalla principal de IAM. No entraremos en detalles de IAM en este artículo.

AWS IAM

Haz clic en «Roles» del panel de la izquierda y haz clic en el Rol que empieza con el mismo nombre que el de la Función Lambda y que tiene alguna cadena aleatoria como sufijo.

Roles

Haz clic en «Adjuntar políticas».

Adjuntar políticas

Busca «ec2» en el cuadro de búsqueda y selecciona «AmazonEC2FullAccess» de la lista y haz clic en el botón «Adjuntar política». Ahora ya tenemos todo listo para ejecutar la función Lambda con los permisos necesarios.

Adjuntar política

Ejecutar la función Lambda

Vuelve a nuestra función Lambda y ahora haz clic en el botón «Probar». Esta vez puedes ver en los registros que la función se ha ejecutado con éxito. Esto significa que la función Lambda ha lanzado una petición para detener la instancia.

Ejecuta la función lambda

Ve al servicio «EC2» y comprueba si la instancia con el id de instancia que proporcionamos a la función Lambda se ha detenido o no. Aquí puedes ver que el Estado de la Instancia es «Parando», lo que significa que la función Lambda ha procesado con éxito nuestra petición de parar la instancia requerida.

lanzar Instancia

En los pasos anteriores hemos visto una función Lambda para detener la instancia de EC2. Ahora veremos cómo se puede iniciar una instancia EC2 utilizando Lambda. Para ello, puedes editar la misma función o escribir una nueva función siguiendo los mismos pasos anteriores.

En este caso, utilizaremos la misma función y sólo cambiaremos nuestro código Python.

Iniciar la función de instancia

Utiliza el siguiente código para iniciar una instancia EC2 utilizando Lambda.

Cambia el valor de «región e instancias».

import boto3
region = 'eu-west-3'
instances = ['i-05be5c0c4039881ed']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
#    ec2.stop_instances(InstanceIds=instances)
    ec2.start_instances(InstanceIds=instances)
    print('stopped your instances: ' + str(instances))

Guarda la función

Nota: Ten cuidado al escribir el código Python, puede dar errores si la sangría no es la adecuada.

Código de función

Haz clic en «Probar» para ejecutar la función.

Observa los detalles de la ejecución y podrás ver claramente que la función se ha ejecutado con éxito, lo que significa que la función Lambda ha lanzado una petición para iniciar la instancia.

Ejecuta la función Lamda

Aquí puedes ver que el estado de la instancia es «Inicializando», lo que significa que la función Lambda ha procesado con éxito nuestra solicitud para iniciar la instancia requerida.

Conclusión:

En este artículo, hemos visto cómo crear una función Lambda sencilla para detener la instancia ec2, asignar las políticas necesarias a los roles que utiliza la función Lambda. También vimos cómo iniciar una instancia EC2 utilizando la función Lambda. Editamos la misma función para realizar la parada/arranque de la instancia EC2, puedes crear 2 funciones diferentes para esto.

También te podría gustar...