AWS Lambda: Guía rápida
AWS Lambdaes un servicio que realiza computación sin servidor, lo que implica computación sin ningún servidor. El código se ejecuta en función de la respuesta de eventos en los servicios de AWS, como agregar / eliminar archivos en el depósito S3, actualizar las tablas de dB de Amazon dynamo, solicitud HTTP desde la puerta de enlace de la API de Amazon, etc.
Para empezar a trabajar con AWS Lambda, solo tenemos que insertar el código en el servicio AWS Lambda. AWS se encarga de todas las demás tareas y recursos, como la infraestructura, el sistema operativo, el mantenimiento del servidor, la supervisión del código, los registros y la seguridad.
AWS Lambdaadmite lenguajes como Java, NodeJS, Python, C # y Go. Tenga en cuenta que AWS Lambda solo funcionará con los servicios de AWS.
¿Qué es AWS Lambda?
La definición de AWS Lambda dada por su documentación oficial es la siguiente:
AWS Lambda es un servicio informático que le permite ejecutar código sin aprovisionar ni administrar servidores. AWS Lambda ejecuta su código solo cuando es necesario y escala automáticamente, desde unas pocas solicitudes por día hasta miles por segundo. Solo paga por el tiempo de cálculo que consume; no hay ningún cargo cuando su código no se está ejecutando.
¿Cómo funciona AWS Lambda?
El diagrama de bloques que explica el funcionamiento de AWS Lambda en cinco sencillos pasos se muestra a continuación:
Step 1 − Cargue el código lambda de AWS en cualquiera de los lenguajes que admite AWS lambda, es decir, NodeJS, Java, Python, C # y Go.
Step 2 − Estos son algunos servicios de AWS en los que se puede activar AWS lambda.
Step 3 −AWS Lambda que tiene el código de carga y los detalles del evento en el que se produjo el desencadenante. Por ejemplo, evento de Amazon S3, Amazon API Gateway, Dynamo dB, Amazon SNS, Amazon Kinesis, CloudFront, Amazon SES, CloudTrail, aplicación móvil, etc.
Step 4 − Ejecuta AWS Lambda Code solo cuando lo activan los servicios de AWS en escenarios como:
- El usuario carga archivos en el depósito de S3
- http get / post endpoint URL is hit
- los datos se agregan / actualizan / eliminan en las tablas de dB de dinamo
- notificación de inserción
- recopilación de flujos de datos
- alojamiento de sitio web
- envío de correo electrónico
- aplicación móvil, etc.
Step 5 − Recuerde que AWS cobra solo cuando se ejecuta el código lambda de AWS, y no de otro modo.
Ventajas de usar AWS Lambda
AWS Lambda ofrece múltiples beneficios cuando trabaja en ello. Esta sección los analiza en detalle:
Facilidad para trabajar con código
AWS Lambda le brinda la infraestructura para cargar su código. Se encarga de mantener el código y lo activa cada vez que ocurre el evento requerido. Le permite elegir la memoria y el tiempo de espera requerido para el código.
AWS Lambda también puede ejecutar solicitudes en paralelo según los desencadenantes de eventos.
Provisión de registro
AWS Lambda brinda los detalles de la cantidad de veces que se ejecutó un código y el tiempo de ejecución, la memoria consumida, etc. AWS CloudWatch recopila todos los registros, lo que ayuda a comprender el flujo de ejecución y depurar el código.
Facturación basada en el uso
La facturación de AWS Lambda se realiza en función del uso de memoria, la solicitud realizada y la ejecución, que se factura en incrementos de un mínimo de 100 ms. Entonces, para una ejecución de 500 ms, la facturación será cada 100 ms. Si especifica que su código lambda de AWS se ejecute en 500 ms y el tiempo de ejecución es de solo 200 ms, AWS le facturará solo por el tiempo de ejecución, es decir, 200 ms de ejecución en lugar de 500 ms. AWS siempre cobra por el tiempo de ejecución utilizado. No es necesario pagar si la función no se ejecuta.
Soporte multilingüe
AWS Lambda admite lenguajes populares como Node. js, Python, Java, C # y Go. Estos son lenguajes muy utilizados y cualquier desarrollador encontrará fácil escribir código para AWS Lambda.
Facilidad de creación e implementación de código
Hay muchas opciones disponibles para Lambda para crear e implementar código. Para escribir su código, puede utilizar el editor en línea de AWS, Visual Studio IDE o Eclipse IDE. También es compatible con un marco sin servidor que facilita la escritura y la implementación del código AWS Lambda. Además de la consola de AWS, tenemos AWS-cli para crear e implementar código.
Otras características
Puede utilizar AWS Lambda de forma gratuita si obtiene un inicio de sesión en la capa gratuita de AWS. Te da servicio gratis por 1 año. Eche un vistazo a los servicios gratuitos que ofrece la capa gratuita de AWS.
Desventajas de usar AWS Lambda
A pesar de muchas ventajas, AWS Lambda posee las siguientes desventajas:
No es adecuado para proyectos pequeños.
Necesita analizar cuidadosamente su código y decidir la memoria y el tiempo de espera. En caso de que su función necesite más tiempo del asignado, se terminará según el tiempo de espera especificado en ella y el código no se ejecutará por completo.
Dado que AWS Lambda depende completamente de AWS para la infraestructura, no puede instalar ningún software adicional si su código lo exige.
Eventos que activan AWS Lambda
Los eventos que pueden activar AWS Lambda son los siguientes:
- Entrada en un objeto S3
- Inserción, actualización y eliminación de datos en la tabla Dynamo DB
- Notificaciones push de SNS
- Llamadas GET / POST a API Gateway
- Modificación de encabezados en el visor o solicitud / respuesta de origen en CloudFront
- Entradas de registro en el flujo de datos de AWS Kinesis
- Historial de registros en CloudTrail
Casos de uso de AWS Lambda
AWS Lambda es un servicio informático que se utiliza principalmente para ejecutar procesos en segundo plano. Puede activarse cuando se utiliza con otros servicios de AWS. La lista de servicios de AWS donde podemos usar AWS Lambda se proporciona a continuación:
Objeto S3 y AWS Lambda
Amazon S3 pasa los detalles del evento a AWS Lambda cuando se carga algún archivo en S3. Los detalles de la carga o eliminación del archivo o el movimiento del archivo se pasan a AWS Lambda. El código en AWS Lambda puede dar el paso necesario para cuando reciba los detalles del evento. Por ejemplo, creando una miniatura de la imagen insertada en S3.
DynamoDB y AWS Lambda
DynamoDB puede activar AWS Lambda cuando se agregan, actualizan y eliminan datos en la tabla. El evento AWS Lambda tiene todos los detalles de la tabla de AWS DynamoDB sobre la inserción, actualización o eliminación.
API Gateway y AWS Lambda
API Gateway puede activar AWS Lambda en métodos GET / POST. Podemos crear un formulario y compartir detalles con el punto final de API Gateway y usarlo con AWS Lambda para su posterior procesamiento, por ejemplo, haciendo una entrada de los datos en la tabla de DynamoDB.
SNS y AWS Lambda
SNS se utiliza para notificaciones push, envío de SMS, etc. Podemos activar AWS lambda cuando hay alguna notificación push en SNS. También podemos enviar SMS al número de teléfono de AWS Lambda cuando recibe el disparador.
Eventos programados y AWS Lambda
Los eventos programados se pueden utilizar para trabajos cron. Puede activar AWS Lambda para que realice la tarea en un patrón de tiempo regular.
CloudTrail y AWS Lambda
CloudTrail puede ser útil para monitorear los registros de la cuenta. Podemos utilizar AWS Lambda para seguir procesando los registros de CloudTrail.
Kinesis y AWS Lambda
Kinesis se utiliza para capturar / almacenar datos de seguimiento en tiempo real provenientes de clics en sitios web, registros, feeds de redes sociales y un disparador para que AWS Lambda pueda realizar un procesamiento adicional en estos registros.
CloudFront y Lambda @ Edge
CloudFront es una red de entrega de contenido donde puede alojar su sitio web y Lambda @ Edge se puede utilizar para procesar los encabezados provenientes de la solicitud del espectador, la solicitud de origen, la respuesta de origen y la respuesta del espectador. La modificación de los encabezados incluye tareas como la modificación de los datos de las cookies, la reescritura de URL, que se utilizan para las pruebas AB para cambiar el envío de respuesta al usuario, agregar información adicional de los encabezados por motivos de seguridad, etc.
Antes de comenzar a trabajar con AWS Lambda, debe tener un inicio de sesión con la consola de Amazon. AWS Lambda admite dos IDE:Visual studio y Eclipse. En este capítulo, analizaremos la instalación de AWS Lambda paso a paso en detalle.
Crear inicio de sesión en la consola de AWS
Puede crear su inicio de sesión en la consola de AWS de forma gratuita utilizando el nivel gratuito de Amazon. Puede seguir estos pasos que se indican a continuación para crear un inicio de sesión con Amazon para hacer uso de los servicios de Amazon:
Paso 1
Ir https://aws.amazon.com/free/y haga clic en crear una cuenta gratuita. Puede ver la captura de pantalla como se muestra a continuación:
Paso 2
Haga clic en Create a Free Account y será redirigido a la pantalla como se muestra a continuación:
Ahora, complete los detalles de la dirección de correo electrónico, la contraseña y el nombre de la cuenta de AWS según su elección en este formulario que se muestra arriba y haga clic en Continue.
Paso 3
Ahora, puede encontrar la pantalla como se muestra a continuación:
Ingrese todos los detalles requeridos en este formulario.
Tenga en cuenta que hay cargos mínimos a pagar según el país seleccionado. Lo mismo se reembolsa una vez validados los datos ingresados. Necesita los datos de la tarjeta de crédito o débito para crear la cuenta gratuita. Para usuarios indiosRs 2/- se deduce y para nosotros $1 El mismo se reembolsa al respectivo usuario de la tarjeta una vez que el usuario es validado.
Tenga en cuenta que la cuenta es gratuita y hay un límite para el uso de los servicios. Si el uso excede el límite, se le cobrará al usuario.
Una vez que se ingresan los detalles en el formulario que se muestra arriba, haga clic en Create Account and Continue.
Se le redirigirá a la siguiente pantalla como se muestra a continuación.
Etapa 4
Debe ingresar los detalles de pago, es decir, tarjeta de crédito o débito, junto con su fecha de vencimiento y el nombre del titular de la tarjeta como se muestra a continuación:
Paso 5
Una vez que ingrese todos los detalles, haga clic en Secure Submit y validará la tarjeta con el banco y te dará la OTPen su móvil que está vinculado con la tarjeta. Puede encontrar una ventana como se muestra a continuación:
Ahora, ingrese el OTP detalles y haga clic en Make Payment. Se le cobrará según el país seleccionado.
Paso 6
Una vez realizado el pago, el siguiente paso es la verificación por teléfono. Debe ingresar su número de teléfono móvil como se muestra a continuación:
Una vez completados los detalles, haga clic en Call Me Now. AWS llamará de inmediato mediante un sistema automatizado. Cuando se le solicite en la llamada, ingrese el número de 4 dígitos que aparecerá en su sitio de AWS en su teléfono usando el teclado de su teléfono. Esto verificará su número y obtendrá la activación de correo en la identificación de correo especificada al principio mientras crea el inicio de sesión.
Paso 7
Haga clic en el enlace de correo electrónico e ingrese el nombre de la cuenta o la identificación de correo electrónico y la contraseña e inicie sesión en los servicios de AWS como se muestra a continuación:
El nombre de la cuenta se muestra en la esquina superior derecha como se muestra arriba. Ahora puede comenzar a utilizar el servicio AWS Lambda. Para el servicio AWS Lambda, los idiomas admitidos son NodeJS, Python, Java, C # y Go.
Instalación de Visual Studio 2017
Hay 2 IDE compatibles con AWS: Visual Studio y Eclipse. En esta sección, discutiremos la instalación de Visual Studio 2017 en Windows, Linux Mac. Vaya al sitio oficial de Visual Studio:https://www.visualstudio.com/downloads/. Puede encontrar la pantalla de bienvenida como se muestra:
Descarga la versión comunitaria, es decir Visual Studio Community 2017ya que es gratis ahora para practicar. Una vez instalado, lo llevará a través de los pasos de instalación en los que debe seleccionar los paquetes que se utilizarán más adelante. Puedes elegir nodejs, python, c# paquete para que trabajemos más tarde.
Soporte de AWS Toolkit para Visual Studio 2017
Una vez que tenga instalado Visual Studio 2017, deberá seguir los pasos dados para instalar el soporte de AWS Toolkit para Visual Studio 2017:
Paso 1
Ir https://aws.amazon.com/visualstudio/ y descargue el kit de herramientas de AWS para Visual Studio. La pantalla es la que se muestra a continuación:
Tenga en cuenta que el paquete descargado para Visual Studio 2017 es vsixpaquete. Si su versión de Visual Studio está entre 2013-2015, instalará unmsiinstalador. Haga clic en elDownload botón como se muestra a continuación.
Paso 2
Ahora, haga doble clic en el paquete vsix descargado y lo llevará a través de los pasos de instalación como se muestra a continuación:
Una vez que Visual Studio se haya instalado correctamente, puede ver una ventana, como se muestra a continuación:
Paso 3
Ahora, abra Visual Studio 2017 y debería ver una página de bienvenida de AWS como se muestra a continuación:
Tenga en cuenta que debe agregar la clave de acceso, la clave secreta y el número de cuenta para comenzar y utilizar los servicios de AWS de visual studio.s
AWS Lambda BoilerPlate para NodeJS
Puedes usarlo con visual studio code Como se muestra abajo.
Paso 1
Tú puedes descargar Visual studio code gratis desde el sitio web oficial:https://www.visualstudio.com/downloads/. La página de inicio de descargas de Visual Studio se ve así:
Paso 2
Ahora, abra el código de Visual Studio como se muestra a continuación:
Paso 3
Para instalar soporte para AWS, support for nodejsLa opción está disponible dentro de las extensiones. Puede buscar AWS y mostrará la opción de la siguiente manera:
Etapa 4
Ahora, instale el texto estándar de AWS Lambda en nodejs como se muestra -
Paso 5
Haga clic en el repositorio y clónelo en Visual Studio para comenzar a escribir la función Lambda en Visual Studio. Te redirige a este repositorio que podemos clonar en Visual Studio:https://github.com/loganarnett/vscode-lambda-snippets. Ahora, abra la paleta de comandos desdeView opción en Visual Studio.
Paso 6
Haga clic en él y elija git clone como se muestra a continuación:
Paso 7
Ingrese la URL del repositorio y guárdela según su elección localmente. Crearindex.js archivo como se muestra a continuación para trabajar con la función lambda -
Instalación de Eclipse IDE
Ahora, tendrá que instalar el último eclipse Java EE IDE. Puede descargarlo del sitio oficial de Eclipse:https://www.eclipse.org/downloads/
Soporte de AWS Toolkit para Eclipse IDE
Una vez que Eclipse esté instalado, realice los siguientes pasos:
Paso 1
Vaya a ayuda desde el menú y haga clic en Install New Software.
Paso 2
Entrar https://aws.amazon.com/eclipse en el cuadro de texto etiquetado Work with en la parte superior del cuadro de diálogo.
Paso 3
Ahora, seleccione el requerido AWS Core Management Tools y otros elementos opcionales de la lista que se muestra a continuación.
Etapa 4
Ahora, haga clic en Next. Eclipse lo guiará a través de los pasos de instalación restantes como se indica en los pasos adicionales que se indican a continuación.
Paso 5
Los módulos principales de AWS se muestran en la siguiente cuadrícula, como se muestra en la captura de pantalla que se muestra a continuación:
Paso 6
Una vez instalada, la herramienta AWS estará disponible en Eclipse como se muestra a continuación:
Paso 7
Puede ver la siguiente pantalla cuando hace clic en el servicio de Amazon.
Ahora, haga clic en AWS Explorer para ver los servicios disponibles. Discutiremos cómo trabajar con el IDE instalado en los próximos capítulos.
AWS Lambda es un servicio que se encarga de calcular su código sin ningún servidor. Se dice que es computación sin servidor. El código se ejecuta en función de la respuesta de eventos en los servicios de AWS, como agregar / eliminar archivos en el depósito S3, actualizar Amazon DynamoDBtables, solicitud HTTP desde la puerta de enlace de Amazon Api, etc.
El código de AWS Lambda se puede escribir en NodeJS, Java, C #, Python y Go. Este capítulo hablará en detalle sobre la creación de la función AWS Lambda en la consola de AWS.
Consola de AWS
Inicie sesión en la consola de AWS en el enlace https://aws.amazon.com/console. Una vez que inicie sesión, lo redireccionará a la pantalla donde se muestran los servicios de AWS.
Ejemplo: crear una función
Comprendamos la funcionalidad de la consola de AWS con la ayuda de un ejemplo. Haga clic en Lambda (marcado arriba), se redirigirá para crear la función como se muestra a continuación:
Hacer clic Create function y la pantalla muestra los siguientes detalles:
Tenga en cuenta que, de forma predeterminada, la opción es Author from scratch. Esta opción le permite escribir el código Lambda desde cero. Solo tendrá una función simple conhello world mensaje.
La segunda opción Blue prints tiene los siguientes detalles.
Proporciona detalles del código ya escrito para algunos de los servicios de aws en idiomas disponibles con AWS Lambda. En caso de que necesite escribir código AWS Lambda para cualquier servicio que pueda registrarblue prints y empezar.
La tercera opcion Serverless Application Repository tiene la configuración de una aplicación sin servidor que ayudará a implementar el código AWS Lambda.
En la discusión más adelante, trabajaremos en la primera opción donde creamos la función lambda de AWS usando Author from scratch.
Antes de crear la función Lambda, necesitará un rol, es decir, permiso para trabajar con servicios de AWS y aws lambda. Posteriormente, el rol debe asignarse a la función aws lambda.
Creación de roles en la consola de AWS
Para crear un rol en la consola de AWS, vaya a los servicios de la consola de AWS y haga clic en IAM como se muestra a continuación:
Ahora, si hace clic en IAM, aparecerá la pantalla como se muestra a continuación:
Si selecciona Roles, puede ver los siguientes botones en la pantalla:
Ahora, haga clic en Create role. Le pedirá que elija el servicio donde necesita usar el rol creado.
Dado que necesitamos usar este rol con AWS Lambda, seleccione Lambda y haga clic en Next:Permissionsbotón como se muestra arriba. La siguiente pantalla muestra el nombre de la política que está disponible según los servicios de AWS. Puede seleccionar la política desde aquí:
Por ejemplo, si desea permiso para que AWS Lambda funcione con S3 y DynamoDB, debe seleccionar la política. En el cuadro de búsqueda, ingrese el servicio AWS y haga clic en la casilla de verificación. Puede seleccionar varias políticas y luego hacer clic enNext:Review.
También es posible crear su propia política. Por ejemplo, hay una tabla dynamodb y necesita otorgar permiso solo a esa tabla, en tales casos puede crear una política.
Haga clic en Create policycomo se muestra en la pantalla de arriba. A continuación se muestran los detalles que se muestran en la pantalla.
Escoge un Servicepara el que está creando la política. Más tarde, mostrará datos para Acciones,resources y Request conditions.
Ahora, deberíamos elegir el servicio. SeleccionemosAWS Dynamodb de la búsqueda. Actions tiene los siguientes detalles:
Ahora, ingrese el Access leveldesea donar a DynamoDB. Luego,resources mostrará los siguientes detalles:
Ahora, seleccione el tipo de recurso de la tabla. Puede ver el siguiente resultado:
Para obtener permiso en la mesa, necesita Add ARN. ARN son los detalles que son exclusivos de la tabla creada en AWS DynamoDB. Obtendrá los detalles cuando se cree la tabla en dynamodb.
Si hace clic en Add ARN y mostrará los siguientes detalles:
Ahora, si ingresa al ARN y el Region, Account y Tablese completará el nombre. Deberías hacer clicAddbotón para agregar la política. Del mismo modo, puede crear políticas para otros servicios.
Aquí, hemos seleccionado dos políticas AmazonS3FullAccess y AmazonDynamoDBFullACcess. Hemos otorgado acceso completo a S3 y DynamoDB en ese rol. Sin embargo, se sugiere que otorgue permiso solo a los depósitos y tablas necesarios.
Puede seguir los pasos descritos anteriormente para crear las políticas utilizando ARN.
Paso 1
Hacer clic Create rolebotón para crear el rol. Todos los roles creados se muestran como se muestra:
Paso 2
Tenga en cuenta que puede seleccionar el rol que necesita en caso de que necesite alguna modificación para el rol creado. Si seleccionamosAuthor from scratch option, tienes que entrar Name, Runtime and Role.
Paso 3
Puede observar los siguientes detalles en Runtime desplegable -
Etapa 4
Puede seleccionar el tiempo de ejecución de su elección y proceder como se muestra.
Role el menú desplegable tiene las siguientes opciones:
Choose an existing role − Esto mostrará todos los roles creados en los roles de IAM.
Create new role from template(s) −Esto le permitirá crear un rol y mostrará el permiso para ser seleccionado para ese rol. Observe la captura de pantalla para una mejor comprensión.
Create a custom role − Esto permite al usuario crear políticas como comentamos anteriormente.
Paso 5
Selecciona el runtime, roley agregue la función. Haga clic enCreate functionpara crear la función lambda. La siguiente pantalla que se muestra es la siguiente:
Partes de la función AWS Lambda
Hay dos partes para la función AWS Lambda:Configuration y Monitoring. Discutamos cada uno en detalle.
Configuración
Las siguientes funcionalidades están incluidas en la Configuración.
Add Triggers
Los desencadenantes que se necesitan para agregar a la función AWS Lambda se muestran de la siguiente manera:
Tenga en cuenta que cuando seleccionamos un disparador, necesitamos agregar los detalles de configuración para ese disparador. Por ejemplo, para el disparador S3, debemos seleccionar el nombre del depósito; para el disparador de Dynamodb, debemos seleccionar el nombre de la tabla.
Ejemplo
Veamos un ejemplo de detalles de configuración para un disparador S3:
Ahora, agregue los detalles de configuración para el disparador S3 agregado -
Aquí debe seleccionar el bucket name, event type en el que desea activar Lambda, prefijo y patrón de filtro si lo hay y Add el gatillo.
Agregar código en Lambda
Ahora, deberíamos centrarnos en el código Lambda que se escribirá. Para agregar código en aws lambda, hay tres opciones:
- Usando el editor en línea
- Usando archivo .zip
- Cargar archivo desde Amazon S3
Se muestra en la captura de pantalla que se muestra a continuación:
Analicemos cada uno de ellos en detalle.
Using the inline editor
El editor de código en línea donde puede escribir su código es el siguiente:
Puede escribir su código eligiendo el idioma de su elección. Puede elegir el tiempo de ejecución nuevamente aquí.
Observe la siguiente captura de pantalla para una mejor comprensión:
El código debe estar escrito en index.js.Handler. Los detalles diferirán según el tiempo de ejecución. pornodejs, es filename.export function que es ahora mismo index.lambda handler.
Upload a .ZIP file
Primero puede escribir el código, comprimirlo y cargar el archivo zip seleccionando Upload a .ZIP file.
Upload a file from Amazon S3
Puede cargar el archivo en el depósito S3 y elegir la opción Upload a file from Amazon S3.
Tenga en cuenta que para .ZIP y S3 no será posible cambiar el tiempo de ejecución.
Variables de entorno
Toman pares clave-valor y los comparten con el código AWS Lambda. Podemos usar variables de entorno en AWS Lambda para almacenar los detalles de la conexión de la base de datos, los detalles del archivo para almacenar la salida, los detalles del archivo de registro, etc.
Etiquetas
Son pares clave-valor agregados a AWS Lambda para organizar mejor la función cuando se utilizan en diferentes regiones. Para un caso de uso simple, no es necesario. Cuando se crean muchas funciones Lambda, el etiquetado ayuda a filtrar y administrar las funciones Lambda.
Rol de ejecución
Puede cambiar el rol nuevamente aquí si no se hizo correctamente al comienzo de la creación de la función Lambda. Puede actualizar o crear un nuevo rol aquí. Proporciona las mismas opciones que se mostraron al inicio de la creación de la función Lambda.
Ajustes básicos
Aquí debe ingresar una breve descripción de lo que está haciendo su función Lambda. Seleccione la memoria y el tiempo de espera necesarios para la función Lambda.
Red
Esto le permite seleccionar la VPC que le permitirá acceder a la función Lambda desde la VPC. De forma predeterminada, no se selecciona ninguna VPC.
Depuración y manejo de errores
Para la depuración y el manejo de errores, puede seleccionar el servicio AWS para enviar los detalles. Las opciones disponibles sonNone, SNS y SQS.
Concurrencia
Esto le permite asignar un límite específico de ejecuciones simultáneas permitidas para esta función.
Auditoría y cumplimiento
Contiene registros que se administran con la ayuda de AWS CloudTrail.
Una vez hecho esto, debe guardar los cambios usando el botón Guardar como se muestra aquí -
Ahora, si hace clic en Test, le pedirá un evento de prueba. Puede aprobar un evento de prueba de muestra de la siguiente manera:
El evento de prueba creado es como se muestra aquí:
Ahora, guarde el evento de prueba y haga clic en el botón de prueba para ver la ejecución de la función AWS Lambda:
El código para index.js es como sigue -
exports.lambdahandler = (event, context, callback) => {
// TODO implement
console.log(event.key1);
console.log(event.key2);
console.log(event.key3);
callback(null, 'Lambda test');
};
Tenga en cuenta que la función de devolución de llamada se llama cuando hay un error o éxito. Si tiene éxito, puede verLambda test se mostrará.
Supervisión
Seleccione la pestaña de supervisión para ver los detalles de ejecución de la función Lambda. Los gráficos muestran los detalles del tiempo de ejecución, errores ocurridos, etc.
También puede ver los registros en Cloudwatch. Para ello, vaya a los servicios de AWS y seleccione cloudwatch como se muestra:
Ahora, seleccione los registros del lado izquierdo e ingrese el nombre de su función en el filtro:
La función AWS Lambda ejecuta un código cuando se invoca. En este capítulo, se describen todos estos pasos relacionados con el ciclo de vida de la función AWS Lambda en detalle.
Pasos para crear una función Lambda
El ciclo de vida de la función Lambda incluye cuatro pasos necesarios:
- Authoring
- Deploying
- Monitoring
- Troubleshooting
Creación de código Lambda
El código de función de AWS Lambda se puede escribir en los siguientes idiomas:
- NodeJS
- Java,
- Python
- C#
- Go.
Podemos escribir código para AWS Lambda usando la consola de AWS, AWS CLI, desde Eclipse IDE, desde Visual Studio IDE, marco sin servidor, etc.
La siguiente tabla muestra una lista de idiomas y las diferentes herramientas e IDE que se pueden usar para escribir la función Lambda:
Idioma | IDE para la creación de código Lambda |
---|---|
NodeJS | Consola AWS Lambda IDE de Visual Studio |
Java | Eclipse IDE |
Pitón | Consola AWS Lambda |
C# | IDE de Visual Studio .NET core |
Vamos | Consola AWS Lambda |
Implementación de código Lambda
Una vez que decida el idioma en el que desea escribir la función Lambda, hay dos formas de implementar el código:
- Escriba directamente el código en la consola de AWS
- Comprima o jar los archivos con todos los archivos y dependencias
Sin embargo, recuerde que se debe otorgar el permiso adecuado al archivo zip.
Prueba de código Lambda
El código Lambda se puede probar para detectar eventos dentro de la consola de AWS Lambda. También es posible probar la función Lambda desde la cli de AWS y la cli sin servidor. La consola de AWS también tiene datos de eventos que se pueden usar como eventos de muestra mientras se prueba la función AWS Lambda.
Supervisión de la función Lambda
La supervisión de la función Lambda se puede realizar mediante AWS CloudWatch. Podemos agregar los mensajes de registro necesarios en los idiomas que elegimos y ver lo mismo en AWS CloudWatch.
Para comenzar a escribir la función Lambda, se debe seguir un patrón. Los siguientes son los principales conceptos básicos que se deben seguir para escribir una función Lambda:
Manipulador
Handler es un nombre de la función lambda de AWS desde donde comienza la ejecución. Aparece en la consola de AWS como se muestra a continuación:
Tenga en cuenta que aquí hemos cambiado el controlador predeterminado a otro nombre y actualizado el mismo en el controlador:
Tenga en cuenta que la forma en que se llama a un controlador difiere de los idiomas seleccionados como tiempo de ejecución.
Parámetros pasados al controlador
Si observa la función del controlador, los parámetros pasados son event, context y call back function como se muestra a continuación -
Event El parámetro tiene todos los detalles del disparador utilizado.
ContextBásicamente, el parámetro se encarga de los detalles del tiempo de ejecución para que se ejecute la función Lambda. Podemos interactuar con la función Lambda usando elcontextparam. Tiene detalles como el tiempo restante antes de que AWS Lambda finalice una función, es decir, el tiempo de espera especificado al crear la función Lambda, el nombre de la función Lambda, el nombre del grupo de observación en la nube, los detalles de arn, etc.
Ejemplo
Entendamos los detalles obtenidos del objeto de contexto de AWS Lambda con la ayuda de un ejemplo:
exports.lambdahandler = (event, context, callback) => {
// TODO implement
console.log("context object details");
console.log(JSON.stringify(context));
callback(null, 'Lambda test');
};
Cuando ejecuta la función Lambda que se muestra arriba, puede ver el siguiente resultado:
Salida
los context los detalles se dan de la siguiente manera:
{
"callbackWaitsForEmptyEventLoop":true,"logGroupName":"/aws/lambda/myfirstlambdafunction",
"logStreamName":"2018/05/20/[$LATEST]04f17ee4ff7048d5bb1fedffaa807c71","functionName":
"myfirstlambdafunction","memoryLimitInMB":"128","functionVersion":"$LATEST","invokeid":
"c931e21c-5bf3-11e8-acfe-47fdbb39eee9","awsRequestId":"c931e21c-5bf3-11e8-acfe-47fdbb39eee9",
"invokedFunctionArn":"arn:aws:lambda:us-east-1:625297745038:function:myfirstlambdafunction"
}
Observe que tiene detalles como functionName, memorylimit, requestId, etc.
Inicio sesión
Los registros agregados dentro de la función Lambda se muestran en AWS CloudWatch cuando se ejecuta la función AWS. La sintaxis de los registros variará del idioma seleccionado. Por ejemplo ennodejs, es console.log.
Esta es la salida que puede ver en AWSCloudWatch:
Manejo de errores
La función AWS Lambda proporciona una función de devolución de llamada que se utiliza para notificar a la función Lambda que se ha producido un error o un éxito. Tenga en cuenta que aquí hemos utilizado nodejs como tiempo de ejecución. El manejo de errores variará según el idioma seleccionado.
Observe el ejemplo dado aquí para una mejor comprensión:
exports.lambdahandler = (event, context, callback) => {
// TODO implement
var error = new Error("There is error in code");
callback(error);
};
Salida
Cuando prueba el código Lambda, puede encontrar el resultado como se muestra a continuación:
Los detalles del registro de la siguiente manera:
Nodejs es uno de los lenguajes que admite la función AWS Lambda. Las versiones compatibles con nodejs son v6.10 y v8.10. En este capítulo, aprenderemos en detalle sobre varias funcionalidades de la función AWS Lambda en NODEJS.
Manejador en NodeJS
Para escribir la función AWS Lambda en nodejs, primero debemos declarar un controlador. El controlador en nodejs es el nombre del archivo y el nombre de la función de exportación. Por ejemplo, el nombre del archivo esindex.js y el nombre de la función de exportación es lambda handler, por lo que su controlador correspondiente es index.lambdahandler
Observe un controlador de muestras que se muestra aquí:
exports.lambdahandler = function(event, context, callback) { //code goes here}
Params to Handler
Handler es el núcleo principal para la construcción de la función Lambda. El manejador toma tres parámetros:event, context y callback.
Parámetro de evento
Tiene todos los detalles del evento desencadenado. Por ejemplo, si usamos la función Lambda para que se active en S3, el evento tendrá detalles del objeto S3.
Parámetro de contexto
Tiene los detalles del contexto, como las propiedades y los detalles de configuración de la función Lambda.
Función de devolución de llamada
Ayuda a dar detalles a la persona que llama. La estructura de la devolución de llamada se ve de la siguiente manera:
callback(error, result);
Los parámetros de la función de devolución de llamada se explican a continuación:
Error −Esto tendrá detalles si se ha producido algún error durante la ejecución de la función Lambda. Si la función Lambda tiene éxito,null se puede pasar como el primer parámetro para la función de devolución de llamada.
Result −Esto dará los detalles de la ejecución exitosa de la función lambda. Si se produce un error, se ignora el parámetro de resultado.
Note −No es obligatorio utilizar la función de devolución de llamada en AWS Lambda. En caso de que no haya una función de devolución de llamada, el controlador la devolverá como nula.
Las firmas de devolución de llamada válidas se dan a continuación:
callback(); // It will return success, but no indication to the caller
callback(null); // It will return success, but no indication to the caller
callback(null, "success"); // It will return the success indication to the caller
callback(error); // It will return the error indication to the caller
Siempre que se ejecuta AWS Lambda, los detalles de la devolución de llamada, como el error o el éxito, se registran en AWS CloudWatch junto con los mensajes de la consola, si los hubiera.
Trabajar con AWS Lambda en Nodejs8.10
Entendamos cómo trabajar con AWS Lambda en nodejs8.10 e invoquemos la función de forma sincronizada y asincrónica.
Invocación de la función Lambda de forma sincronizada
El siguiente ejemplo le da una idea sobre cómo invocar la función Lambda de forma sincronizada:
exports.handler = function(event, context, callback) {
let arrItems = [4,5,6,8,9,10,35,70,80,31];
function countevennumbers (items) {
return new Promise(resolve => {
setTimeout(() => {
let a = 0;
for (var i in items) {
if (items[i] % 2 == 0) {
a++;
}
}
resolve(a);
},2000);
});
}
let evennumber = countevennumbers(arrItems);
callback(null,'even numbers equals ='+evennumber);
};
Puede observar el siguiente resultado después de probar este código en la consola de AWS:
Tenga en cuenta que la salida del código anterior es un objeto de promesa. No da el recuento, ya que el recuento se incrementa dentro de un setTimeout y la llamada a la función no espera la ejecución dentro de setTimeout y devuelve el objeto de promesa.
Si tuvieramos async/await en la función del controlador obtendrá la salida exacta de la función lambda.
Invocar al controlador de forma asincrónica
El siguiente ejemplo le da una idea sobre cómo invocar la función Lambda de forma asíncrona:
exports.handler = async function(event, context, callback) {
let arrItems = [4,5,6,8,9,10,35,70,80,31];
function countevennumbers (items) {
return new Promise(resolve => {
setTimeout(() => {
let a = 0;
for (var i in items) {
if (items[i] % 2 == 0) {
a++;
}
}
resolve(a);
}, 2000);
});
}
let evennumber = await countevennumbers(arrItems);
callback(null,'even numbers equals ='+evennumber);
};
Hemos agregado async y awaiten el código anterior. Cuando usamosawaitjunto a la llamada a la función, la ejecución se detiene hasta que se resuelve la promesa dentro de la función. Tenga en cuenta queawait es válido solo para async funciones.
Puede observar el siguiente resultado después de probar este código en la consola de AWS:
Detalles de contexto en NodeJS
El objeto de contexto proporciona detalles como el nombre de la función Lambda, el tiempo restante en milisegundos, la identificación de la solicitud, el nombre del grupo de observación en la nube, los detalles del tiempo de espera, etc.
Las siguientes tablas muestran la lista de métodos y atributos disponibles con el objeto de contexto:
Método disponible para el objeto de contexto
No Señor | Nombre y descripción del método |
---|---|
1 | getRemainingTimeInMillis() Este método proporciona el tiempo restante en milisegundos hasta que la función Lambda finaliza la función |
Atributos disponibles para el objeto de contexto
No Señor | Nombre y descripción del atributo |
---|---|
1 | functionName Esto le da el nombre de la función de AWS Lambda |
2 | functionVersion Esto da la versión de la función AWS Lambda que se ejecuta |
3 | nvokedFunctionArn Esto le dará detalles de ARN. |
4 | memoryLimitInMB Esto muestra el límite de memoria agregado al crear la función Lambda |
5 | awsRequestId Esto proporciona el ID de solicitud de AWS. |
6 | logGroupName Esto le dará el nombre del grupo de Cloudwatch |
7 | logStreamName Esto le dará el nombre del flujo de registro de Cloudwatch donde se escriben los registros. |
8 | identity Esto proporcionará detalles sobre el proveedor de identidad de amazon cognito cuando se usa con aws mobile sdk. Los detalles dados son los siguientes:
|
9 | clientContext Esto mostrará detalles de la aplicación cliente cuando se usa con aws mobile sdk. Los detalles dados son los siguientes:
|
Mire el siguiente ejemplo para tener una mejor idea sobre el objeto de contexto:
exports.handler = (event, context, callback) => {
// TODO implement
console.log('Remaining time =>', context.getRemainingTimeInMillis());
console.log('functionName =>', context.functionName);
console.log('AWSrequestID =>', context.awsRequestId);
console.log('logGroupName =>', context.log_group_name);
console.log('logStreamName =>', context.log_stream_name);
console.log('clientContext =>', context.clientContext);
callback(null, 'Name of aws Lambda is=>'+context.functionName);
};
Puede observar el siguiente resultado después de probar este código en la consola de AWS:
Puede observar la siguiente salida de registro después de probar este código en la consola de AWS:
Iniciar sesión en NodeJS
Podemos usar console.log para iniciar sesión en NodeJS. Los detalles del registro se pueden obtener del servicio CloudWatch con la función Lambda.
Observe el siguiente ejemplo para una mejor comprensión:
exports.handler = (event, context, callback) => {
// TODO implement
console.log('Logging for AWS Lamnda in NodeJS');
callback(null, 'Name of aws Lambda is=>'+context.functionName);
};
Puede observar el siguiente resultado después de probar este código en la consola de AWS:
Puede observar la siguiente captura de pantalla de CloudWatch:
Manejo de errores en NodeJS
Entendamos cómo se realiza la notificación de errores en NodeJS. Observe el siguiente código:
exports.handler = function(event, context, callback) {
// This Source code only throws error.
var error = new Error("something is wrong");
callback(error);
};
Puede observar lo siguiente en la salida del registro:
Los detalles del error se dan en la devolución de llamada de la siguiente manera:
{
"errorMessage": "something is wrong",
"errorType": "Error",
"stackTrace": [ "exports.handler (/var/task/index.js:2:17)" ]
}
En este capítulo, comprendamos en detalle cómo crear una función AWS Lambda simple en Java en detalle.
Creando un archivo JAR en Eclipse
Antes de comenzar a trabajar en la creación de una función lambda en AWS, necesitamos el soporte del kit de herramientas de AWS para Eclipse. Para cualquier orientación sobre la instalación del mismo, puede consultar elEnvironment Setup capítulo de este tutorial.
Una vez que haya terminado con la instalación, siga los pasos que se indican aquí:
Paso 1
Abra Eclipse IDE y cree un nuevo proyecto con AWS Lambda Java Project. Observe la captura de pantalla que se muestra a continuación para una mejor comprensión:
Paso 2
Una vez que seleccione Next, te redirigirá a la pantalla que se muestra a continuación:
Paso 3
Ahora, se crea un código predeterminado para el tipo de entrada Custom. Una vez que haces clicFinish botón el proyecto se crea como se muestra a continuación -
Etapa 4
Ahora, haz clic derecho en tu proyecto y expórtalo. SeleccioneJava / JAR archivo del Export asistente y haga clic en Next.
Paso 5
Ahora, si hace clic en Next, se le pedirá que guarde el archivo en la carpeta de destino que se le preguntará cuando haga clic en siguiente.
Una vez guardado el archivo, vuelva a la consola de AWS y cree la función de AWS Lambda para Java.
Paso 6
Ahora, sube el .jar archivo que creamos usando el Upload botón como se muestra en la captura de pantalla que se muestra a continuación:
Detalles del controlador para Java
Handler es package name y class name. Mire el siguiente ejemplo para comprender el manejador en detalle:
Ejemplo
package com.amazonaws.lambda.demo;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaFunctionHandler implements RequestHandler
Observe que a partir del código anterior, el controlador será com.amazonaws.lambda.demo.LambdaFunctionHandler
Ahora, probemos los cambios y veamos el resultado:
Objeto de contexto en Java
La interacción con la ejecución de AWS Lambda se realiza mediante el contexto. Proporciona los siguientes métodos para usar dentro de Java:
No Señor | Métodos de contexto y descripción |
---|---|
1 | getMemoryLimitInMB() esto le dará el límite de memoria que especificó al crear la función lambda. |
2 | getFunctionName() esto le dará el nombre de la función lambda. |
3 | getFunctionVersion() esto dará la versión de la función lambda en ejecución. |
4 | getInvokedFunctionArn() esto le dará el ARN usado para invocar la función. |
5 | getAwsRequestId() esto dará la identificación de la solicitud aws. Esta identificación se crea para la función lambda y es única. La identificación se puede utilizar con el soporte de AWS en caso de que tenga algún problema. |
6 | getLogGroupName() esto le dará el nombre del grupo aws cloudwatch vinculado con la función aws lambda creada. Será nulo si el usuario de iam no tiene permiso para el registro de Cloudwatch. |
7 | getClientContext() Esto proporcionará detalles sobre la aplicación y el dispositivo cuando se use con aws mobile sdk. Dará detalles como el nombre y el código de la versión, la identificación del cliente, el título, el nombre del paquete de la aplicación. Puede ser nulo. |
8 | getIdentity() this will give details about the amazon cognito identity when used with aws mobile sdk. It can be null. |
9 | getRemainingTimeInMillis() this will give the remaining time execution in milliseconds when the function is terminated after the specified timeout. |
10 | getLogger() this will give the lambda logger linked with the context object. |
Now, let us update the code given above and observe the output for some of the methods listed above. Observe the Example code given below for a better understanding −
package com.amazonaws.lambda.demo;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaFunctionHandler implements RequestHandler<Object, String> {
@Override
public String handleRequest(Object input, Context context) {
context.getLogger().log("Input: " + input);
System.out.println("AWS Lambda function name: " + context.getFunctionName());
System.out.println("Memory Allocated: " + context.getMemoryLimitInMB());
System.out.println("Time remaining in milliseconds: " + context.getRemainingTimeInMillis());
System.out.println("Cloudwatch group name " + context.getLogGroupName());
System.out.println("AWS Lambda Request Id " + context.getAwsRequestId());
// TODO: implement your handler
return "Hello from Lambda!";
}
}
Una vez que ejecute el código dado arriba, puede encontrar el resultado como se indica a continuación:
Registros para el contexto
Puede observar la siguiente salida cuando está viendo su salida de registro:
La memoria asignada para la función Lambda es de 512 MB. El tiempo asignado es de 25 segundos. El tiempo restante como se muestra arriba es 24961, que está en milisegundos. Por tanto, 25000 - 24961, que equivale a 39 milisegundos, se utiliza para la ejecución de la función Lambda. Tenga en cuenta que el nombre del grupo de Cloudwatch y el ID de solicitud también se muestran como se muestra arriba.
Tenga en cuenta que hemos utilizado el siguiente comando para imprimir registros en Java:
System.out.println (“log message”)
Lo mismo está disponible en CloudWatch. Para ello, vaya a los servicios de AWS, seleccioneCloudWatchservices y haga clic en Logs.
Ahora, si selecciona la función Lambda, mostrará la fecha de los registros como se muestra a continuación:
Iniciar sesión en Java
También puede utilizar Lambdalogger en Java para registrar los datos. Observe el siguiente ejemplo que muestra lo mismo:
Ejemplo
package com.amazonaws.lambda.demo;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
public class LambdaFunctionHandler implements RequestHandler<Object, String> {
@Override
public String handleRequest(Object input, Context context) {
LambdaLogger logger = context.getLogger();
logger.log("Input: " + input);
logger.log("AWS Lambda function name: " + context.getFunctionName()+"\n");
logger.log("Memory Allocated: " + context.getMemoryLimitInMB()+"\n");
logger.log("Time remaining in milliseconds: " + context.getRemainingTimeInMillis()+"\n");
logger.log("Cloudwatch group name " + context.getLogGroupName()+"\n");
logger.log("AWS Lambda Request Id " + context.getAwsRequestId()+"\n");
// TODO: implement your handler
return "Hello from Lambda!";
}
}
El código que se muestra arriba le dará el siguiente resultado:
La salida en CloudWatch será la que se muestra a continuación:
Manejo de errores en Java para la función Lambda
Esta sección explica cómo manejar errores en Java para la función Lambda. Observe el siguiente código que muestra lo mismo:
package com.amazonaws.lambda.errorhandling;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaFunctionHandler implements RequestHandler<Object, String> {
@Override
public String handleRequest(Object input, Context context) {
throw new RuntimeException("Error from aws lambda");
}
}
Tenga en cuenta que los detalles del error se muestran en json formato con mensaje de error Error from AWS Lambda. También elErrorType y stackTrace da más detalles sobre el error.
La salida y la salida de registro correspondiente del código dado arriba será como se muestra en las siguientes capturas de pantalla que se muestran a continuación:
En este capítulo, crearemos una función AWS Lambda simple en Python y comprenderemos sus conceptos de trabajo a continuación.
Antes de comenzar a trabajar en la creación de una función Lambda en AWS, necesitamos la compatibilidad con el kit de herramientas de AWS para Python. Para ello, siga los pasos que se indican a continuación y observe las capturas de pantalla correspondientes adjuntas:
Paso 1
Inicie sesión en la consola de AWS, cree la función Lambda y seleccione el idioma como Python.
Paso 2
Ahora, haga clic en Create functione ingrese los detalles para crear un AWS Lambda simple en Python. Este código devuelve el mensajeHello from Lambda using Python y se ve como se muestra aquí -
Paso 3
Ahora, guarde los cambios y pruebe el código para ver el resultado. Debería ver la siguiente salida y registros cuando lo pruebe en la consola de AWS con el botón de prueba de la interfaz de usuario.
Etapa 4
Ahora, puede escribir código dentro de cualquier editor o un IDE para Python. Aquí, estamos usando código de Visual Studio para escribir el código. Posteriormente, debería comprimir el archivo y cargarlo en la consola de AWS.
Aquí, hemos comprimido el código y lo usamos en la consola de AWS.
Paso 5
Ahora, seleccione Upload a .ZIP file opción como se muestra a continuación -
Detalles del controlador para Python
Tenga en cuenta que el controlador debe ser el nombre del archivo seguido del nombre de la función. En el caso anterior, nuestro nombre de archivo eshellopython.py y el nombre de la función es my_handler; entonces el manejador será hellopython.my_handler.
Una vez que se realiza la carga y se guardan los cambios, en realidad muestra los detalles del archivo zip en el editor en línea en la consola de AWS Lambda. Ahora, probemos el código para ver la salida y los registros.
Ahora, comprendamos los detalles de la función Lambda utilizando el siguiente código de muestra:
def my_handler(event, context):
return "aws lambda in python using zip file"
En el código anterior, el nombre de la función my_handler tiene 2 parámetros, evento y contexto.
Objeto de contexto en Python
El objeto de contexto proporciona detalles como el nombre de la función Lambda, el tiempo restante en milisegundos, la identificación de la solicitud, el nombre del grupo de observación en la nube, los detalles del tiempo de espera, etc.
Los métodos y atributos disponibles en el objeto de contexto se muestran en las tablas que se muestran a continuación:
No Señor | Nombre y descripción del método |
---|---|
1 | get_remaining_time_in_millis() Este método da el tiempo restante en milisegundos hasta que la función lambda termina la función |
No Señor | Atributo y descripción |
---|---|
1 | function_name Esto le da el nombre de la función aws lambda |
2 | function_version Esto da la versión de la función lambda aws ejecutando |
3 | invoked_function_arn Esto le dará detalles de ARN. |
4 | memory_limit_in_mb Esto muestra el límite de memoria agregado al crear la función lambda |
5 | aws_request_id Esto da el ID de solicitud aws. |
6 | og_group_name Esto le dará el nombre del grupo de Cloudwatch |
7 | log_stream_name Esto le dará el nombre del flujo de registro de Cloudwatch donde se escriben los registros. |
8 | identity Esto proporcionará detalles sobre el proveedor de identidad de amazon cognito cuando se usa con aws mobile sdk. Los detalles dados son los siguientes:
|
9 | client_context Esto mostrará detalles de la aplicación cliente cuando se usa con aws mobile sdk. Los detalles dados son los siguientes:
|
Veamos un ejemplo funcional en Python que genera los detalles del contexto. Observe el código que se proporciona a continuación:
def my_handler(event, context):
print("Log stream name:", context.log_stream_name)
print("Log group name:", context.log_group_name)
print("Request ID:",context.aws_request_id)
print("Mem. limits(MB):", context.memory_limit_in_mb)
print("Time remaining (MS):", context.get_remaining_time_in_millis())
return "aws lambda in python using zip file"
La salida correspondiente del código que se muestra arriba se da a continuación:
Registro usando Python
Para registrar información usando Python, podemos usar la función de impresión o registro disponible. Usemos el ejemplo anterior de contexto y revisemos en CloudWatch para ver si los registros están impresos. Observe el siguiente código:
def my_handler(event, context):
print("Log stream name:", context.log_stream_name)
print("Log group name:", context.log_group_name)
print("Request ID:",context.aws_request_id)
print("Mem. limits(MB):", context.memory_limit_in_mb)
print("Time remaining (MS):", context.get_remaining_time_in_millis())
return "aws lambda in python using zip file"
La salida de este código en CloudWatch es como se muestra a continuación:
Observe el siguiente ejemplo para comprender cómo usar el registrador para imprimir registros en CloudWatch:
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def my_handler(event, context):
logger.info('Using logger to print messages to cloudwatch logs')
return "aws lambda in python using zip file"
El resultado para esto será como se muestra en la captura de pantalla que se muestra a continuación:
Manejo de errores en Python para la función Lambda
En esta sección, veamos un ejemplo de trabajo que muestra cómo manejar errores en Python. Observe el fragmento de código que se proporciona aquí:
def error_handler(event, context):
raise Exception('Error Occured!')
La pantalla de registro es como se muestra en la imagen aquí -
La compatibilidad con Go Language es una adición reciente a AWS. Para trabajar con Go, debe seleccionar el idioma de la consola de AWS mientras crea la función AWS Lambda. En este capítulo, aprendamos en detalle sobre la función AWS Lambda en el lenguaje Go.
Instalación de Go
Para comenzar, necesitamos el soporte de Go Language. En esta sección, repasaremos los siguientes detalles para comenzar a trabajar con AWS Lambda en Go. Este es el sitio oficial para descargar Go:https://golang.org/dl/
Ahora, descargue el paquete según el sistema operativo. Siga el procedimiento que se proporciona aquí para instalar Go en el sistema operativo correspondiente.
Instalación en Windows
Observe que para Windows, hay disponibles descargas de 32 y 64 bits. Descargue el archivo zip y extraiga el contenido y guárdelo en un directorio de su elección.
Agregue las variables de entorno disponibles en ControlPanel ---> System ---> Advanced system settings.
Ahora, haga clic en Environment Variables y agregue la ruta del directorio como se muestra aquí -
También puede editar la variable del sistema como se muestra aquí:
Una vez realizados estos pasos, debería poder empezar a trabajar con Go. Abra el símbolo del sistema y verifique la versión del comando Ir. Observe la siguiente captura de pantalla para el mismo.
Instalación para Linux y Mac OS
Para instalar paquetes en Linux y Mac OS, siga las instrucciones que se muestran a continuación:
Desembale los paquetes y guárdelos en el lugar /usr/local/go. Ahora, agregue/usr/local/go/bina la variable de entorno PATH. Se puede hacer usando/etc/profile o $HOME/.profile.
Para ello, puede utilizar el siguiente comando
export PATH=$PATH:/usr/local/go/bin
Para agregar soporte de AWS para Windows, Linux y mac, use lo siguiente en su línea de comandos de git:
go.exe get -u github.com/aws/aws-lambda-go/lambda
go.exe get -u github.com/aws/aws-lambda-go/lambdacontext
go.exe get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip
Para compilar el código Windows / Linux / Mac, use los siguientes comandos:
GOOS=linux GOARCH=amd64 go build -o main main.go
%GOPATH%\bin\build-lambda-zip.exe -o main.zip main
Función AWS Lambda con GO
Un programa devuelto en Go cuando la compilación proporciona un archivo ejecutable. El siguiente es un programa simple en Go con soporte de AWS Lambda. Necesitamos importar elgithub.com/aws/aws-lambda-go/lambda, ya que tiene la funcionalidad de programación Lambda. Otra necesidad importante de AWS Lambda es el controlador.
Main.go
// main.go
package main
import (
"github.com/aws/aws-lambda-go/lambda"
)
func hello() (string, error) {
return "Hello Lambda", nil
}
func main() {
// Make the handler available for Remote Procedure Call by AWS Lambda
lambda.Start(hello)
}
Tenga en cuenta que la ejecución del GoEl programa comienza desde main donde lambda. start se llama con la función handler. Observe el código que se muestra a continuación:
func main() {
// Make the handler available for Remote Procedure Call by AWS Lambda
lambda.Start(hello)
}
Ahora, ejecutemos el archivo anterior usando el comando Ir y luego comprima el archivo ejecutable.
La estructura del archivo que hemos estado usando es la que se muestra aquí:
Con go build, crea un archivo ejecutable llamado main.exe. Para comprimir el archivo y cargarlo en AWS Lambda, puede utilizar el siguiente procedimiento:
Para compilar el código Windows / Linux / Mac, use los siguientes comandos:
GOOS=linux GOARCH=amd64 go build -o main main.go
%GOPATH%\bin\build-lambda-zip.exe -o main.zip main
Luego, inicie sesión en la consola de AWS y cree la función Lambda usando Go como tiempo de ejecución -
Una vez creada la función, cargue el archivo zip ejecutable creado anteriormente.
Controlador de funciones lambda con Go
El controlador es donde comienza la ejecución del programa Go. De llamada principal alambda.start, la ejecución se llama con la función de controlador. Tenga en cuenta que el controlador que se agregará serámain.
Observe el código aquí para comprenderlo:
func main() {
// Make the handler available for Remote Procedure Call by AWS Lambda
lambda.Start(hello)
}
Siga las capturas de pantalla que se muestran a continuación:
Ahora, guarde la función y pruébela. Puede ver el resultado de la ejecución como se muestra aquí.
La salida de registro correspondiente será como se muestra aquí:
Objeto de contexto con Go
AWS Lambda en Go ofrece las siguientes variables y propiedades globales para el contexto.
MemoryLimitInMB - Límite de memoria, en MB que se configura en aws lambda.
FunctionName - nombre de la función lambda aws.
FunctionVersion - la versión de la función aws lambda en ejecución.
LogStreamName - Nombre del flujo de registro de Cloudwatch.
LogGroupName - nombre del grupo de Cloudwatch.
Las propiedades disponibles en contexto se dan a continuación:
AwsRequestID
Este es el ID de solicitud de AWS que obtiene cuando se invoca la función AWS Lambda.
ClientContext
Contiene detalles sobre la aplicación cliente y el dispositivo cuando se invoca a través del AWS Mobile SDK. Puede ser nulo. El contexto del cliente proporciona detalles como el ID del cliente, el título de la aplicación, el nombre de la versión, el código de la versión y el nombre del paquete de la aplicación.
InvokedFunctionArn
El ARN de la función invocada. Un ARN no calificado ejecuta la versión $ LATEST y los alias ejecutan la versión de la función a la que apunta.
Identidad
Proporciona detalles sobre el proveedor de identidad de Amazon Cognito cuando se utiliza con AWS Mobile SDK.
Los cambios agregados a main.go para imprimir detalles de contexto -
// main.go
package main
import (
"context"
"log"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-lambda-go/lambdacontext"
)
func hello(ctx context.Context) (string, error) {
lc, _ := lambdacontext.FromContext(ctx);
log.Print(lc);
log.Print(lc.AwsRequestID);
log.Print(lc.InvokedFunctionArn);
return "Hello Lambda", nil
}
func main() {
// Make the handler available for Remote Procedure Call by AWS Lambda
lambda.Start(hello)
}
Necesitamos importar el log y lambda contextpara usarlo con Go. Los detalles del contexto son los siguientes:
func hello(ctx context.Context) (string, error) {
lc, _ := lambdacontext.FromContext(ctx);
log.Print(lc);
log.Print(lc.AwsRequestID);
log.Print(lc.InvokedFunctionArn);
return "Hello Lambda", nil
}
Puede observar el siguiente resultado al probar el código anterior:
Registro de datos
Con Go puede registrar datos utilizando el módulo log o fmt como se muestra a continuación:
// main.go
package main
import (
"log"
"fmt"
"github.com/aws/aws-lambda-go/lambda"
)
func hello() (string, error) {
log.Print("Hello from Lambda Go using log");
fmt.Print("Hello from Lambda Go using fmt");
return "Hello Lambda", nil
}
func main() {
// Make the handler available for Remote Procedure Call by AWS Lambda
lambda.Start(hello)
}
La salida para lo mismo es como se muestra a continuación:
Comprobación de registros en CloudWatch
También puede ver los registros en CloudWatch. Para esto, vaya al servicio AWS y seleccione cloudwatch y haga clic enLogsen el lado izquierdo. Ahora, busque la función Lambda en la lista para ver los registros:
Errores de función
Puede crear un manejo de errores personalizado en AWS Lambda utilizando el módulo de errores como se muestra en el siguiente código:
// main.go
package main
import (
"errors"
"github.com/aws/aws-lambda-go/lambda"
)
func hello() error {
return errors.New("There is an error in the code!")
}
func main() {
// Make the handler available for Remote Procedure Call by AWS Lambda
lambda.Start(hello)
}
La salida para el código que se muestra arriba es como se indica a continuación:
Este capítulo le explicará cómo trabajar con la función AWS Lambda en C # en detalle. Aquí, usaremos Visual Studio para escribir e implementar el código en AWS Lambda. Para obtener información y ayuda sobre la instalación de Visual Studio y la adición del kit de herramientas de AWS a Visual Studio, consulte laIntroductioncapítulo de este tutorial. Una vez que haya terminado con la instalación de Visual Studio, siga los pasos que se indican a continuación. Consulte las capturas de pantalla respectivas para una mejor comprensión:
Paso 1
Abra su Visual Studio y siga los pasos para crear un nuevo proyecto. Haga clic enFile -> New -> Project.
Paso 2
Ahora, se muestra la siguiente pantalla en la que selecciona AWS Lambda for Visual C#. SeleccioneAWS Lambda Project (.NET Core).
Puede cambiar el nombre si es necesario, mantendrá aquí el nombre predeterminado. Hacer clicOK continuar.
El siguiente paso le pedirá que seleccione un Blueprint.
Seleccione Empty function para este ejemplo y haga clic en Finish. Creará una nueva estructura de proyecto como se muestra a continuación:
Ahora, seleccione Function.cs que es el archivo principal donde se crea el controlador con evento y contexto para AWS Lambda.
La visualización del archivo Functions.cs es la siguiente:
Puede utilizar el comando que se proporciona a continuación para serializar los parámetros de entrada y salida en la función AWS Lambda.
[assembly:
LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]
Detalles del controlador para C #
El controlador se muestra de la siguiente manera:
public string FunctionHandler(string input, ILambdaContext context) {
return input?.ToUpper();
}
Varios componentes del código anterior se explican a continuación:
FunctionHandler −Este es el punto de partida de la función C # AWS Lambda.
String input − Los parámetros para el controlador string input tiene todos los datos del evento, como el objeto S3, los detalles de la puerta de enlace API, etc.
ILambdaContext context −ILamdaContext es una interfaz que tiene detalles de contexto. Tiene detalles como el nombre de la función lambda, detalles de la memoria, detalles del tiempo de espera, etc.
El controlador de Lambda se puede invocar de forma sincronizada y asincrónica. Si se invoca de forma sincronizada como se muestra arriba, puede tener el tipo de retorno. Si es asíncrono, el tipo de retorno debe ser nulo.
Ahora, implementemos AWS Lambda C # y probemos lo mismo. Haga clic derecho en el proyecto y haga clic enPublish to AWS Lambda como se muestra a continuación -
Llena el Function Name y haga clic en Next. La siguiente pantalla que se muestra es laAdvanced Function Details como se muestra -
Introducir el Role Name, Memory y Timeout. detalles Tenga en cuenta que aquí hemos seleccionado la función existente creada y la memoria utilizada como 128 MB y el tiempo de espera como 10 segundos. Una vez hecho, haga clic enUpload para publicar en la consola de AWS Lambda.
Puede ver la siguiente pantalla una vez que se cargue la función AWS Lambda. Hacer clicInvokepara ejecutar la función AWS Lambda creada. En la actualidad, muestra un error ya que necesita alguna entrada según el código escrito.
Ahora, ingresemos una entrada de muestra y Invokede nuevo. Tenga en cuenta que aquí hemos ingresado algo de texto en el cuadro de entrada y lo mismo al hacer clicinvokese muestra en mayúsculas en la sección de respuesta. La salida del registro se muestra a continuación:
Ahora, también revisemos la consola de AWS para ver si la función se crea como la hemos implementado desde Visual Studio.
La función Lambda creada anteriormente es aws lambda using csharp y lo mismo se muestra en la consola de AWS como se muestra en las capturas de pantalla que se muestran a continuación:
Firma del manejador
El controlador es el punto de partida para que AWS se ejecute. El nombre del controlador debe definirse como:
ASSEMBLY::TYPE::METHOD
Los detalles de la firma se explican a continuación:
ASSEMBLY- Este es el nombre del ensamblado .NET para la aplicación creada. Básicamente es el nombre de la carpeta desde donde se crea el proyecto.
TYPE- Este es el nombre del controlador. Básicamente es el espacio de nombres.
METHOD - Este es el nombre del controlador de funciones.
El código para la firma del controlador es el que se muestra a continuación:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Amazon.Lambda.Core;
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]
namespace AWSLambda3 {
public class Function {
/// <summary>
/// A simple function that takes a string and does a ToUpper
/// </summary>
/// <param name="input"></param>
/// <param name="context"></param>
/// <returns></returns>
public string FunctionHandler(string input, ILambdaContext context) {
return input?.ToUpper();
}
}
}
Tenga en cuenta que aquí el montaje es AWSLamda3, El tipo es espacio de nombres.nombre de clase que es AWSLambda3.Function y el método es FunctionHandler. Por tanto, la firma del manejador esAWSLamda3::AWSLambda3.Function::FunctionHandler
Objeto de contexto en C #
El objeto de contexto proporciona información útil sobre el tiempo de ejecución en el entorno de AWS. Las propiedades disponibles en el objeto de contexto son las que se muestran en la siguiente tabla:
No Señor | Propiedades y descripción |
---|---|
1 | MemoryLimitInMB Esto dará detalles de la memoria configurada para la función AWS Lambda. |
2 | FunctionName Nombre de la función AWS Lambda |
3 | FunctionVersion Versión de la función AWS Lambda |
4 | InvokedFunctionArn ARN utilizado para invocar esta función. |
5 | AwsRequestId ID de solicitud de AWS para la función de AWS creada |
6 | LogStreamName Nombre del flujo de registro de Cloudwatch |
7 | LogGroupName Nombre del grupo de Cloudwatch |
8 | ClientContext Información sobre la aplicación cliente y el dispositivo cuando se utiliza con AWS Mobile SDK |
9 | Identity Información sobre la identidad de amazon cogbnito cuando se usa con AWS Mobile SDK |
10 | RemainingTime Tiempo de ejecución restante hasta que se termine la función |
11 | Logger El registrador asociado al contexto |
Ejemplo
En esta sección, probemos algunas de las propiedades anteriores en AWS Lambda en C #. Observe el código de muestra que se proporciona a continuación:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Amazon.Lambda.Core;
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]
namespace AWSLambda6 {
public class Function {
/// <summary>
/// </summary>
/// <param name="input"></param>
/// <param name="context"></param>
/// <returns></returns>
public void FunctionHandler(ILambdaContext context) {
LambdaLogger.Log("Function name: " + context.FunctionName+"\n");
context.Logger.Log("RemainingTime: " + context.RemainingTime+"\n");
LambdaLogger.Log("LogGroupName: " + context.LogGroupName+"\n");
}
}
}
La salida relacionada que puede observar cuando invoca el código anterior en C# es como se muestra a continuación -
La salida relacionada que puede observar cuando invoca el código anterior en AWS Console es como se muestra a continuación -
Registro usando C #
Para el registro, puede utilizar dos funciones:
context.Logger.Log
LambdaLogger.Log
Observe el siguiente ejemplo que se muestra aquí:
public void FunctionHandler(ILambdaContext context) {
LambdaLogger.Log("Function name: " + context.FunctionName+"\n");
context.Logger.Log("RemainingTime: " + context.RemainingTime+"\n");
LambdaLogger.Log("LogGroupName: " + context.LogGroupName+"\n");
}
Aquí se muestra la salida correspondiente al código dado arriba:
Puede obtener los registros de CloudWatch como se muestra a continuación:
Manejo de errores en C # para la función Lambda
Esta sección trata sobre el manejo de errores en C #. Para el manejo de errores,Exception La clase debe extenderse como se muestra en el ejemplo que se muestra a continuación:
ejemplo
namespace example {
public class AccountAlreadyExistsException : Exception {
public AccountAlreadyExistsException(String message) :
base(message) {
}
}
}
namespace example {
public class Handler {
public static void CreateAccount() {
throw new AccountAlreadyExistsException("Error in AWS Lambda!");
}
}
}
La salida correspondiente para el código dado arriba es como se indica a continuación:
{
"errorType": "LambdaException",
"errorMessage": "Error in AWS Lambda!"
}
En los capítulos anteriores, aprendimos cómo crear la función AWS Lambda en la consola de AWS. Sin embargo, existen otros parámetros para crear una función Lambda. Estos incluyen asignación de memoria, tiempo de espera, etc.
En este capítulo, comprendamos en detalle las siguientes propiedades de configuración para AWS Lambda.
Asignación de memoria
Inicie sesión en la consola de AWS y cree o seleccione la función lambda existente. Haga clic en elConfigurationpestaña para obtener los detalles de la memoria asignada. Mire la captura de pantalla que se muestra a continuación:
Tenga en cuenta que, por defecto, la memoria asignada es 128MB. Si desea aumentar la memoria, puede hacer clic en el control deslizante.
La memoria se incrementará a 64MBa medida que mueve el control deslizante. Observe que la memoria máxima disponible es3008MB. Mire la captura de pantalla que se muestra a continuación:
También puedes usar aws clidesde el símbolo del sistema para aumentar el límite de memoria. Tendrá que dar la memoria en incrementos de 64 MB.
Ahora, aumentemos el límite de memoria de AWS Lambda con el nombre:myfirstlambdafunction.
Los detalles de la memoria de la función se muestran en la captura de pantalla que se muestra a continuación:
El comando usado para cambiar la memoria usando aws cli es como sigue -
aws lambda update-function-configuration --function-name your function name --
region region where your function resides --memory-size memory amount --
profile admin user
La salida correspondiente de la función AWS Lambda myfirstlambdafunctionen la consola de AWS se muestra aquí. Observe que la memoria se cambia de 128 MB a 256 MB.
Tiempo máximo de ejecución
El tiempo de espera es el tiempo asignado a la función AWS Lambda para finalizar si se agota el tiempo de espera. La función AWS Lambda se ejecutará dentro del tiempo asignado o finalizará si excede el tiempo de espera dado. Debe evaluar el tiempo necesario para que se ejecute la función y, en consecuencia, seleccionar el tiempo enConfiguration pestaña en la consola de AWS como se muestra a continuación -
Rol de IAM
Al crear la función AWS Lambda, es necesario asignar el rol o el permiso. En caso de que necesite AWS Lambda para S3 o dynamoDB, se debe asignar un permiso con respecto a los servicios de lambda. Según el rol asignado, AWS Lambda decidirá los pasos a seguir. Por ejemplo, si otorga acceso completo a dynamodb, puede agregar, actualizar y eliminar las filas de la tabla dynamodb.
Nombre del controlador
Este es el inicio de la ejecución de la función AWS Lambda. La función del controlador tiene los detalles del evento desencadenado, el objeto de contexto y la devolución de llamada que debe enviarsesuccess o error de AWS Lambda.
El formato de la función del controlador en nodejs se muestra aquí:
exports.handler = (event, context, callback) => {
callback(null, "hello from lambda");
};
Función Lambda usando variables de entorno
En esta sección, crearemos una función Lambda simple utilizando variables de entorno agregadas en la sección de configuración. Para ello, siga los pasos que se indican a continuación y consulte las capturas de pantalla respectivas:
Paso 1
Vaya a la consola de AWS y cree una función en Lambda como se muestra.
Paso 2
Ahora, agregue las variables de entorno como se muestra:
Paso 3
Ahora, busquemos lo mismo en el código Lambda de la siguiente manera:
exports.handler = (event, context, callback) => {
var hostName = process.env.host;
var userName = process.env.username;
callback(null, "Environment Variables =>"+hostName+" and "+userName);
};
Etapa 4
Para obtener los detalles de las variables de entorno, necesitamos usar process.envcomo se muestra. Tenga en cuenta que esta sintaxis es paraNodeJS tiempo de ejecución.
var hostName = process.env.host;
var userName = process.env.username;
Paso 5
El resultado de la función Lambda en ejecución será como se muestra:
Podemos crear la función Lambda y probar la misma en la consola de AWS. Este capítulo analiza esto en detalle. Para este propósito, deberá seguir los pasos que se detallan aquí y observar las capturas de pantalla respectivas:
Paso 1
Inicie sesión en la consola de AWS https://aws.amazon.com/console/. Ahora, será redirigido a la pantalla donde se muestran los servicios de AWS.
Paso 2
Ahora, haga clic en Lambdaservicio como se destaca arriba. Esto redirigirá para crear la función como se muestra a continuación:
Paso 3
Ahora, haga clic en Create functione ingrese los detalles de la función. Entonces puede ver una pantalla como se muestra a continuación:
Etapa 4
Puede escribir su código eligiendo el idioma de su elección. El código debe escribirse en el editor si la opción seleccionada es editar código en línea. Las otras opciones disponibles son las siguientes:
Paso 5
Una vez hecho esto, debe guardar los cambios para los que se muestra el botón en la esquina superior derecha como se muestra a continuación:
Paso 6
Ahora, haga clic en Testbotón. Esto proporciona todos los detalles de la ejecución de la función Lambda como se muestra a continuación:
Paso 7
El código para index.js es como sigue -
exports.handler = (event, context, callback) => {
// TODO implement
callback(null, 'Lambda test');
};
Esto llamará al Callback functiony el resultado puede ser un error o un éxito. Si tiene éxito, verá unLambda testmensaje; si hay error, pasará nulo.
Paso 8
los Role Los detalles de la función Lambda son parte de la configuración y se muestran como se muestra a continuación:
Paso 9
Ahora, puede actualizar el rol si es necesario y guardar la función Lambda. Luego, los detalles de la memoria y el tiempo de espera para la función lambda se muestran como se muestra a continuación:
Paso 10
Ahora, necesitamos agregar un disparador a la función Lambda para que se ejecute cuando ocurra el evento. Los detalles del disparador se muestran al inicio de la pantalla de la función AWS Lambda como se muestra a continuación:
A partir de aquí, puede seleccionar el activador que desea que se active su función Lambda. Cuando selecciona el disparador, deben agregarse los detalles de configuración del disparador.
Por ejemplo, para el disparador en S3, los detalles de configuración que se agregarán son los siguientes:
Paso 11
Ahora, seleccione el cubo en el que desea activar el disparador. El tipo de evento tiene los siguientes detalles:
Paso 12
Para el disparador, también puede mencionar los archivos de tipo de prefijo o el patrón de archivo, el Lambda debe ser disparador. Los detalles son los que se muestran:
Paso 13
Ahora, complete los detalles requeridos para el disparador y haga clic en Add Botón. Guarde la función Lambda para que se agregue el disparador. Al guardar la función, se implementan los detalles y, a partir de ahora, cada vez que se agregan archivos al depósito S3, Lambda se activará.
Observe la siguiente captura de pantalla que muestra el disparador S3 agregado a AWS Lambda:
Paso 14
Ahora, usemos el evento de muestra S3 para probar la función Lambda. El código para el mismo se muestra aquí:
Evento de muestra de envío de Amazon S3
{
"Records": [{
"eventVersion": "2.0",
"eventTime": "1970-01-01T00:00:00.000Z",
"requestParameters": {
"ExampleIPAddress": "127.0.0.1"
},
"s3": {
"configurationId": "testConfigRule",
"object": {
"eTag": "0123456789abcdef0123456789abcdef",
"sequencer": "0A1B2C3D4E5F678901",
"key": "HappyFace.jpg",
"size": 1024
},
"bucket": {
"arn": bucketarn,
"name": "Examplebucket",
"ownerIdentity": {
"principalId": "Example"
}
},
"s3SchemaVersion": "1.0"
},
"responseElements": {
"x-amz-id-2": "Example123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
"x-amz-request-id": "Example123456789"
},
"awsRegion": "us-east-1",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "Example"
},
"eventSource": "aws:s3"
}]
}
Tendrá que usar el siguiente comando para obtener los detalles del archivo cargado desde el evento put de S3:
event.Records[0].s3.object.key //will display the name of the file
Tendrá que usar el siguiente comando para obtener el nombre del depósito:
event.Records[0].s3.bucket.name //will give the name of the bucket.
Tendrá que usar el siguiente comando para obtener el EventName:
event.Records[0].eventName // will display the event name
Paso 15
Ahora, actualice el código AWS Lambda para imprimir los detalles de S3 como se muestra a continuación:
exports.lambdahandler = (event, context, callback) => {
callback(null, "Bucket name: "+event.Records[0].s3.bucket.name+"
File name:"+event.Records[0].s3.object.key );
};
Paso 16
Guarde los cambios. Hacer clicTest e ingrese el evento de muestra S3 -
Paso 17
Ahora haga clic Test y puede ver la salida como se muestra:
Paso 18
Para probar el activador en S3 mediante el servicio S3 AWS, cargue un archivo en el depósito S3: test bucket trigger. Actualice el rol utilizado con Lambda para tomar la política S3 y SES (para enviar correo) para los permisos. Esto actualizará el código de AWS Lambda para enviar correo y ver cómo funciona el disparador:
El código de AWS Lambda actualizado es como se muestra:
var aws = require('aws-sdk');
var ses = new aws.SES({
region: 'us-east-1'
});
exports.lambdahandler = function(event, context, callback) {
var eParams = {
Destination: {
ToAddresses: ["[email protected]"]
},
Message: {
Body: {
Text: {
Data: "Bucket name: "+event.Records[0].s3.bucket.name+" File name:"+event.Records[0].s3.object.key
}
},
Subject: {
Data: "S3 and AWS Lambda"
}
},
Example: "[email protected]"
};
console.log('===SENDING EMAIL===');
var email = ses.sendEmail(eParams, function(err, data) {
if (err) console.log(err);
else {
console.log("===EMAIL SENT===");
console.log("EMAIL CODE END");
console.log('EMAIL: ', email);
context.succeed(event);
callback(null, "email is send");
}
});
};
La captura de pantalla correspondiente se muestra aquí:
Paso 19
Ahora, cargue el archivo y verifique la identificación de correo proporcionada en el código AWS Lambda:
AWS CLIes una herramienta de línea de comandos que ayuda a trabajar con los servicios de AWS. Podemos usarlo para crear, actualizar, eliminar, invocar la función aws lambda. En este capítulo, analizará en detalle la instalación y el uso de la AWS CLI.
Instalación de AWS CLI
Esta sección lo guiará a través de la instalación de AWS CLI en varios sistemas operativos. Siga los pasos dados y observe las capturas de pantalla correspondientes dondequiera que estén adjuntas.
Para ventanas
Verifique su configuración de Windows y elija uno de los siguientes enlaces para instalar AWS CLI MSI -
Para Windows de 64 bits: instalación de AWS CLI MSI para Windows (64 bits)
Para Windows de 32 bits: instalación de AWS CLI MSI para Windows (32)
Una vez que elija el enlace correspondiente y haga clic en él, puede encontrar una ventana como se muestra aquí:
A continuación, configure el Environment path in windows como se muestra en las capturas de pantalla a continuación -
Una vez hecho esto, puede usar el siguiente comando en el símbolo del sistema para ver si aws cli está instalado -
aws --version
Muestra los detalles de la versión de aws-cli como se muestra en la siguiente captura de pantalla:
Para Linux / Mac
Para instalar en Linux y Mac, necesita Python 2.6.3 o una versión superior. Luego, use los siguientes comandos para otros procesos de instalación:
$ curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip" $ unzip awscli-bundle.zip
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
Ahora, necesitamos configurar los ajustes de AWS. Puede usar el siguiente comando para este propósito:
aws configure
Para este propósito, requiere detalles como:
- ID de clave de acceso de AWS
- Clave de acceso secreta de AWS
- Nombre de región predeterminado
- Salida predeterminada del formato
Puede obtener estos detalles en la consola de aws. Vaya a su nombre de cuenta en la esquina superior derecha como se muestra -
Ahora, haga clic en My Security Credentialsy seleccione usuarios del lado izquierdo. Agregue un usuario con los detalles solicitados.
Agregue el usuario y obtenga la clave de acceso y la clave secreta. Para ver la nueva clave de acceso, elijaShow. Sus credenciales se verán como se muestra a continuación:
Access key ID − AOSAIOSFOCDD7Example
Secret access key − aJuirCVtnROUN/K7MDENG/bPxRfiCYExampleKEY
Comandos de referencia para AWS CLIS
La siguiente tabla dará referencias de comandos disponibles para trabajar con aws cli.
Nombre del comando aws cli | Referencia de comando |
---|---|
create-function | create-function --function-name <valor> --runtime <value> --role <value> --handler <value> [--code <value>] [--description <value>] [--timeout < valor>] [--memory-size <valor>] [--environment <valor>] [--kms-key-arn <valor>] [--tags <valor>] [--zip-file <valor> ] [--cli-input-json <valor>] |
list-functions | lista-funciones [--master-region <valor>] [--function-version <valor>] [--max-items <valor>] [--cli-input-json <valor>] [--starting- token <valor>] [--page-size <valor>] [--generate-cli-skeleton <valor>] |
get-function | get-function --function-name <valor> [--qualifier <valor>] [--cli-input-json <valor>] [--generate-cli-skeleton <valor>] |
get-function-configuration | get-function-configuration --nombre-función <valor> [--qualifier <valor>] [--cli-input-json <valor>] [--generate-cli-skeleton <valor>] |
get-account-settings | get-account-settings [--cli-input-json <valor>] [--generate-cli-skeleton <valor>] |
update-function-configuration | actualización-configuración-función --nombre-función <valor> [--role <valor>] [--handler <valor>] [--descripción <valor>] [--tiempo de espera <valor>] [--memoria- tamaño <valor>] [--vpc-config <valor>] [--environment <valor>] [--runtime <valor>] [--dead-letter-config <valor>] [--kms-key- arn <valor>] [--tracing-config <valor>] [--revision-id <valor>] [--cli-input-json <valor>] [--generate-cli-skeleton <valor>] |
update-function-code | update-function-code --function-name <valor> [--zip-file <valor>] [--s3-bucket <valor>] [--s3-key <valor>] [--s3-object- versión <valor>] [--publish | --no-publicar] [--dry-run | --no-dry-run] [--revision-id <valor>] [- cli-input-json <value>] [- generate-cli-skeleton <value>] |
delete-function | eliminar-función --nombre-función <valor> [--qualifier <valor>] [--cli-input-json <valor>] [--generate-cli-skeleton <valor>] |
Ahora, analicemos estos comandos uno por uno en detalle.
función de creación
Esta api creará una nueva función lambda. El código debe presentarse en formato zip. Si la función que se va a crear ya existe, la API fallará. Tenga en cuenta que el nombre de la función distingue entre mayúsculas y minúsculas.
Comandos incluidos
La lista de comandos que puede usar con create-function se proporciona aquí:
create-function
--function-name <value>
--runtime <value>
--role <value>
--handler <value>
[--code <value>]
[--description <value>]
[--timeout <value>]
[--memory-size <value>]
[--environment <value>]
[--kms-key-arn <value>]
[--tags <value>]
[--zip-file <value>]
[--cli-input-json <value>]
Opciones incluidas
Varias opciones que puede utilizar con las funciones anteriores son las siguientes:
--function-name (string)- Toma el nombre de la función. El nombre puede tener caracteres de 64 bits.
--runtime(string)- Aquí debe especificar el entorno de ejecución, es decir, la selección de idioma. Los detalles del tiempo de ejecución son los que se indican a continuación:
Opciones disponibles | tiempo de ejecución |
---|---|
Python v3.6 | python3.6 |
Python v2.7 | python2.7 |
NodeJS v6.10 | nodejs6.10 |
NodeJS v8.10 | nodejs8.10 |
Java | java8 |
C # 1 | dotnetcore1.0 |
C # 2 | dotnetcore2.0 |
Vamos | go1.x |
--role(string)- Este será el nombre de la política lambda, es decir, el rol que se le dará a la función lambda para acceder a otros servicios. Tendrá el permiso según el rol especificado.
--handler (string) - Este es el nombre del controlador donde comenzará la ejecución del código lambda.
- Para nodejs, el nombre del controlador es el nombre del módulo que exportamos.
- Para java, es package.classname :: handler o package.classname
- Para Python, el controlador es el nombre del archivo.
--code (structure) −Código Lambda AWS
--description (string) - descripción de la función AWS Lambda
--timeout (integer)- timeout tendrá el tiempo en el que la función lambda tiene que terminar la ejecución. El valor predeterminado es 3 segundos.
--memory-size (integer)- Esta es la memoria que se le da a la función lambda aws. AWS asignará la cantidad de CPU y la asignación de memoria en función de la memoria proporcionada.
--environment (structure) - es un objeto con detalles del entorno requeridos en la función lambda de AWS.
e.g : Variables = {Name1 = string, Name2 = string}
--kms-key-arn (string): Este es el nombre de recurso de Amazon (ARN) que se utiliza para cifrar las variables de entorno. Si no se proporciona, se necesitará la configuración predeterminada para cifrar.
--zip-file (blob) - ruta del archivo zip que contiene los detalles del código.
--cli-input-json (string): Realiza la operación del servicio según la cadena JSON proporcionada. La cadena JSON sigue el formato proporcionado por --generate-cli-skeleton. Si se proporcionan otros argumentos en la línea de comando, los valores de CLI anularán los valores proporcionados por JSON.
Ahora, creemos una función AWS Lambda simple usando el tiempo de ejecución como nodej y agreguemos algunos console.logs para imprimir.
Considere un código de muestra para comprender lo mismo:
exports.handler = async (event) => {
console.log("Using aws cli");
return 'Hello from Lambda from aws cli!'
};
Ahora, comprima el archivo y guárdelo como awscli.zip.
Obteniendo ARN
Para el papel, usemos el arndel rol existente que hemos creado. Para obtener el ARN, deberá seguir los pasos que se muestran aquí. Observe las capturas de pantalla respectivas dondequiera que estén adjuntas -
Paso 1
Vaya a IAM y seleccione la función que desee. Roles. Los detalles del ARN para el rol se muestran como se muestra a continuación. UtilizarRole ARN con create-function en aws cli.
Observe aquí que el rol arn es: arn: aws: iam :: 625297745038: role / lambdaapipolicy
El comando con valores para create-function es como sigue -
aws lambda create-function
--function-name "awslambdausingcli"
--runtime "nodejs8.10"
--role "arn:aws:iam::625297745038:role/lambdaapipolicy"
--handler "awscli.handler"
--timeout 5
--memory-size 256
--zip-file "fileb://awscli.zip"
Ahora, si ejecuta el comando en aws cli, puede encontrar un resultado como se muestra a continuación:
En la consola de AWS, la función Lambda se muestra como se muestra a continuación:
Los detalles de las funciones se muestran aquí:
Los detalles de la configuración son los que se indican a continuación:
Puede probar la función y verificar la salida como se muestra:
La salida de registro correspondiente se muestra aquí:
funciones de lista
Esta API proporciona la lista de funciones creadas hasta ahora en AWS Lambda.
Comandos incluidos
Los siguientes son los comandos asociados con esta API:
list-functions
[--master-region <value>]
[--function-version <value>]
[--max-items <value>]
[--cli-input-json <value>]
Opciones en funciones de lista
Las siguientes son varias opciones que puede usar en esta API de funciones de lista:
--master-region(string)- opcional. La región desde la que se deben mostrar las funciones.
--function-version(string)- opcional. Esto le dará la versión de la función.
--max-items(integer)- opcional. Esto le dará los elementos según el valor especificado.
--cli-input-json(string)- opcional. Realizará la operación en función del archivo json proporcionado.
El comando con valores list-functions es como sigue -
aws lambda list-functions --max-items 3
El comando muestra los detalles de la siguiente manera:
get-function
Esta API dará detalles de las funciones y también un enlace URL que tiene un archivo zip cargado usando create-function. La URL con los detalles del zip será válida solo durante 10 minutos.
Comandos incluidos
Los siguientes son los comandos asociados con esta API:
get-function
--function-name <value>
[--qualifier <value>]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]
Opciones incluidas
--function-name- Nombre de la función AWS Lambda. También puede especificar el nombre de recurso de Amazon de la función.
--qualifier(string)- Opcional. La versión de la función se puede utilizar para obtener los detalles de la función.
El comando con valores para obtener la función son:
aws lambda get-function --function-name awslambdausingcli
Los detalles de la pantalla de comandos son los siguientes:
Proporciona la URL que tiene el código postal cargado. En el caso anterior, la URL es:
https://prod-04-2014-
tasks.s3.amazonaws.com/snapshots/625297745038/awslambdausingcli-97048f8d-4a08
-4ed9-99d9-acb00d2063d2?versionId=d04HKvPu9S2zz8pzjbW6Rmf5o5fxnc_r&X-Amz-Security
-Token=FQoDYXdzEKT%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDCpTmGvtwKToPBiWcyK3A96UcJEnwvYDhMbbxu
%2Bg2gffK2ocfnlEeiCHak8QqqE1RFpbKrdks9NzxP9gNbagL4M9RValxJ1a9PUY%2FOdAekscRHOiX00MVAxUlI8
2pKryhdOwLJWSj0uRzqvOxCcBwJenHrSNPeG6lMa2ZDo0qZFEUDONSaTg4nuSnJK1f6t3pMAKu4vF9wPvf92G%2BU
60rUxwleggigISmD9l1IlZse3%2BVF1JlNuN%2F5d85v0y2Q%2F%2BO515CybcZpn91sHPYG8JMJ00LsrkQ2Ww4VU
9Zz5c5QYH4JYPj0CyEgSz9b%2FMceMPpOoPUAMjctb%2FEwQqcShZeqAr9%2Fcd2ZI%2BXl2%2Bs4ri0ucgPvQQvs
eGIIiZbX3GqdwR2jb1nylrAEIfiuFMoSWfcFYoYtuL0MZnjGR9jy2GNkp6MB%2BlHHr7%2BnuFRUzU26rgDYmdE1w
Rb3%2B21Jm49WGDa9opRLvUxFaux57Or70haib2FuKzN6Gf3Vzzk5KPdWsYUpaLyf%2B1ovEytOZhB1JEXuCs%2FG
IlOXS88yxT%2BpOKmyxweiezpGgI%2FAkSAQTbSRsYQKIOFyIJNHzplwrJKhy28vy60numIBIo9Zqq2AU%3D
&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20180527T112426Z&X-Amz-
SignedHeaders=host&X-Amz-Expires=600&X-Amz-
Credential=ASIAICSQHLSBWFP37U4Q%2F20180527%2Fus-
east-1%2Fs3%2Faws4_request&X-Amz-Signature=
8b97e7d6d7da13313068e027894d2c875be5e50a0c5a62550f55307985bdc1aa
get-function-configuration
Esto proporcionará los detalles de configuración de la función AWS Lambda.
Los siguientes son los comandos utilizados junto con esta api:
get-function-configuration
--function-name <value>
[--qualifier <value>]
The following are the options used with
--function-name (string) −nombre de la función lambda aws. También puede especificar el nombre de recurso de Amazon de la función.
--qualifier(string) − Opcional. La versión de la función se puede utilizar para obtener los detalles de la función.
El comando con valores para obtener la función son:
aws lambda get-function-configuration --function-name awslambdausingcli
El comando muestra los detalles de la siguiente manera:
get-account-settings
Esta API proporciona la configuración de las cuentas.
Comandos involucrados
El comando que puede usar con esta api es:
get-account-settings
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]
Opciones involucradas
Puede utilizar las siguientes opciones con esta api:
--cli-input-json(string) − Realiza el servicio en función de la cadena json proporcionada.
--generate-cli-skeleton(string) − Imprime la salida json sin enviar la solicitud de API.
Puede usar el siguiente comando para get-account-settings -
aws lambda get-account-settings
Puede ver el siguiente resultado cuando ejecuta el comando dado anteriormente:
configuración-función-actualización
Esta API ayuda a actualizar los detalles de configuración de la función AWS Lambda creada. Puede cambiar la memoria, el tiempo de espera, el controlador, el rol, el tiempo de ejecución, la descripción, etc.
Comandos involucrados
Los siguientes son los comandos involucrados en la API de configuración de función de actualización:
update-function-configuration
--function-name <value>
[--role <value>]
[--handler <value>]
[--description <value>]
[--timeout <value>]
[--memory-size <value>]
[--environment <value>]
[--runtime <value>]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]
Opciones involucradas
Las siguientes son las opciones involucradas en la API de configuración de función de actualización:
--function-name − nombre de la función lambda aws
--role (string) −Opcional. Es necesario actualizar el ARN del rol.
--handler (string) −Opcional. Los detalles del controlador de la función lambda aws.
--description(string) −Opcional. Descripción de la función.
--timeout(integer) −Opcional. Tiempo necesario para que la función aws lambda pueda finalizar.
--memory-size(integer) −Opcional. Esta es la memoria dada a la función lambda aws. AWS asignará la cantidad de CPU y la asignación de memoria en función de la memoria proporcionada.
--environment (structure) −Opcional. Es un objeto con detalles de entorno requeridos en la función lambda aws.
e.g: Variables = {Name1 = string, Name2 = string}
--runtime(string) − Aquí debe especificar el entorno de ejecución, es decir, la selección de idioma.
Los detalles del tiempo de ejecución se muestran en la tabla siguiente:
Opciones disponibles | tiempo de ejecución |
---|---|
Python v3.6 | python3.6 |
Python v2.7 | python2.7 |
NodeJS v6.10 | nodejs6.10 |
NodeJS v8.10 | nodejs8.10 |
Java | java8 |
C # 1 | dotnetcore1.0 |
C # 2 | dotnetcore2.0 |
Vamos | go1.x |
--cli-input-json (string) −Opcional. Esto realizará la operación en la API como se especifica en la cadena json proporcionada.
--generate-cli-skeleton (string) −Opcional. Esto generará el esqueleto JSON de todos los detalles sin ejecutar la API. La salida se puede utilizar como entrada para--cli-input-json.
Ahora, cambiemos la memoria y el tiempo de espera de la función AWS Lambda que hemos creado anteriormente. Siga los pasos que se indican a continuación y observe las capturas de pantalla correspondientes adjuntas para este propósito:
Paso 1
La memoria y el tiempo de espera antes de que ocurriera el cambio son los siguientes:
Paso 2
Ahora con update-function-configuration, cambiemos la memoria y el tiempo de espera a 320 MB y el tiempo de espera a 10 segundos. Para este propósito, use el siguiente comando con valores:
aws lambda update-function-configuration --function-name “awslambdusingcli”
--timeout 10 --memory-size 320
Paso 3
Entonces puede ver la siguiente salida como pantalla:
Etapa 4
La pantalla en la consola de AWS después de usar update-function-configuration es como sigue -
Código de función de actualización
Esta API actualizará el código de una función de AWS Lambda existente.
Comandos involucrados
update-function-code
--function-name <value>
[--zip-file <value>]
[--s3-bucket <value>]
[--s3-key <value>]
[--s3-object-version <value>]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]
Opciones involucradas
Las siguientes son las opciones involucradas con la api update-function-code:
--function-name(string) − nombre de la función lambda aws
--zip-file (blob) −Opcional. Ruta del archivo zip que tiene el código a actualizar.
--s3-bucket(string) −Opcional. Nombre del depósito de S3 que tiene el archivo zip con el código cargado.
--s3-key(string) −Opcional. Nombre de la clave de objeto de AWS s3 que se debe cargar.
--s3-object-version (string) −Opcional. Versión del objeto AWS s3.
--cli-input-json (string) −Opcional. Esto realizará la operación en la API como se especifica en la cadena json proporcionada.
--generate-cli-skeleton (string) −Opcional. Esto generará el esqueleto JSON de todos los detalles sin ejecutar la API. La salida se puede utilizar como entrada para --cli-input-json.
El código actualizado es como se muestra a continuación:
exports.handler = async (event, context) => {
console.log("Using aws cli");
console.log()
return 'Hello from Lambda from aws cli!'
};
Puede utilizar lo siguiente command with values for this purpose -
aws lambda update-function-code --function-name "awslambdausingcli"
--zip-file "fileb://awscli.zip"
La salida correspondiente es la que se muestra aquí:
La pantalla de la consola de AWS se muestra aquí:
La salida de registro correspondiente es la que se muestra a continuación:
función de eliminación
los delete aws cli api eliminará la función dada.
Comandos incluidos
Los detalles del comando para el mismo se dan aquí:
delete-function
--function-name <value>
[--qualifier <value>]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]
Opciones incluidas
Las opciones incluidas en esta api son las siguientes:
--function-name(string) − esto tomará el nombre de la función lambda o el arn de la función lambda aws.
--qualifier (string) −Esto es opcional. Aquí puede especificar la versión de aws lambda que debe eliminarse.
-- cli-input-json(string) −Realiza la operación del servicio según la cadena JSON proporcionada. La cadena JSON sigue el formato proporcionado por --generate-cli-skeleton. Si se proporcionan otros argumentos en la línea de comando, los valores de CLI anularán los valores proporcionados por JSON.
--generate-cli-skeleton(string) − imprime el esqueleto json en la salida estándar sin enviar la solicitud de API.
aws lambda delete-function --function-name "lambdatestcli"
Ahora, observe que la función no se verá en la lista de funciones de AWS Lambda:
AWS Lambda se puede crear e implementar mediante un marco sin servidor. Le permite crear activadores de AWS Lambda y también implementarlos mediante la creación de los roles necesarios. El marco sin servidor permite manejar grandes proyectos de una manera más fácil. Los eventos y los recursos necesarios están escritos en un solo lugar y solo unos pocos comandos ayudan a implementar la funcionalidad completa en la consola de AWS.
En este capítulo, aprenderá en detalle cómo comenzar con el marco sin servidor de AWS.
Instale Serverless Framework usando npm install
Para empezar, primero debe instalar nodejs. Puede verificar nodejs de la siguiente manera:
Tendrá que usar el siguiente comando para instalar sin servidor usando el paquete npm:
npm install -g serverless
Una vez hecho npm, ejecute el comando sin servidor que muestra la lista de comandos que se utilizarán para crear e implementar la función AWS Lambda. Observe las capturas de pantalla que se muestran a continuación:
También puede utilizar sls en lugar de sin servidor. sls es el comando abreviado para serverless.
En caso de que necesite ayuda en el comando sls, puedes usar el siguiente comando:
sls create --help
Para crear un marco sin servidor, debe seguir los pasos que se detallan a continuación:
Paso 1
Para comenzar a usar el marco sin servidor, debemos agregar las credenciales. De esta manera, puede el usuario primero en la consola de AWS de la siguiente manera:
Paso 2
Haga clic en Next:Permissionsbotón para agregar permisos. Deberá adjuntar las políticas existentes o el acceso de administrador a este usuario.
Paso 3
Hacer clic Create Userpara agregar el usuario. Mostrará la clave de acceso y la clave secreta que necesitamos para configurar el marco sin servidor -
Configurar AWS Serverless Framework
Veamos cómo configurar el marco sin servidor de AWS. Puede usar el siguiente comando para este propósito:
sls config credentials --provider aws --key accesskey --secret secretkey
Tenga en cuenta que los detalles de las credenciales ingresadas, que es el access key y secret key se almacenan en el file /aws/credentials.
Primero, cree una carpeta donde desee almacenar los archivos de su proyecto.
A continuación, comenzaremos a trabajar en aws-serverless carpeta.
Cree AWS Lambda utilizando Serverless Framework
Ahora, creemos una función Lambda con el marco sin servidor siguiendo los pasos que se indican a continuación:
Paso 1
A continuación se muestran los detalles de serverless create comando -
Paso 2
Ahora, necesitamos asignar la plantilla que es la siguiente:
AWS-nodejs, aws-nodejs-typescript, aws-nodejs-ecma-script, aws-python, aws-python3, aws-groovy-gradle etc.
Paso 3
Haremos uso de aws-nodejsplantilla para crear nuestro primer proyecto utilizando un marco sin servidor. El comando para el mismo propósito es el que se muestra aquí:
sls create --template aws-nodejs
Tenga en cuenta que este comando crea un texto estándar para la plantilla aws-nodejs.
Etapa 4
Ahora, abra la carpeta creada en un IDE. Aquí estamos usando el código de Visual Studio y la estructura de carpetas es la siguiente:
Paso 5
Hay 2 archivos creados: handler.js y Serverless.yml
Los detalles de la función básica de AWS Lambda se muestran en handler.js como sigue -
'use strict';
module.exports.hello = (event, context, callback) => {
const response = {
statusCode: 200,
body: JSON.stringify({
message: 'Go Serverless v1.0! Your function executed successfully!',
input: event,
}),
};
callback(null, response);
// Use this code if you don't use the http event with the LAMBDA-PROXY integration
// callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event });
};
Este archivo Serverless.yml tiene los detalles de configuración del marco sin servidor como se muestra a continuación:
# Welcome to Serverless!
#
# This file is the main config file for your service.
# It's very minimal at this point and uses default values.
# You can always add more config options for more control.
# We've included some commented out config Examples here.
# Just uncomment any of them to get that config option.
#
# For full config options, check the docs:
# docs.serverless.com
#
# Happy Coding!
service: aws-nodejs # NOTE: update this with your service name
# You can pin your service to only deploy with a specific Serverless version
# Check out our docs for more details
# frameworkVersion: "=X.X.X"
provider:
name: aws
runtime: nodejs6.10
# you can overwrite defaults here
# stage: dev
# region: us-east-1
# you can add statements to the Lambda function's IAM Role here
# iamRoleStatements:
# - Effect: "Allow"
# Action:
# - "s3:ListBucket"
# Resource: { "Fn::Join" : ["", ["arn:aws:s3:::", { "Ref" : "ServerlessDeploymentBucket" } ] ] }
# - Effect: "Allow"
# Action:
# - "s3:PutObject"
# Resource:
# Fn::Join:
# - ""
# - - "arn:aws:s3:::"
# - "Ref" : "ServerlessDeploymentBucket"
# - "/*"
# you can define service wide environment variables here
# environment:
# variable1: value1
# you can add packaging information here
#package:
# include:
# - include-me.js
# - include-me-dir/**
# exclude:
# - exclude-me.js
# - exclude-me-dir/**
functions:
hello:
handler: handler.hello
# The following are a few example events you can configure
# NOTE: Please make sure to change your handler code to work with those events
# Check the event documentation for details
# events:
# - http:
# path: users/create
# method: get
# - s3: ${env:BUCKET}
# - schedule: rate(10 minutes)
# - sns: greeter-topic
# - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000
# - alexaSkill: amzn1.ask.skill.xx-xx-xx-xx
# - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx
# - iot:
# sql: "SELECT * FROM 'some_topic'"
# - cloudwatchEvent:
# event:
# Example:
# - "aws.ec2"
# detail-type:
# - "EC2 Instance State-change Notification"
# detail:
# state:
# - pending
# - cloudwatchLog: '/aws/lambda/hello'
# - cognitoUserPool:
# pool: MyUserPool
# trigger: PreSignUp
# Define function environment variables here
# environment:
# variable2: value2
# you can add CloudFormation resource templates here
#resources:
# resources:
# NewResource:
# Type: AWS::S3::Bucket
# Properties:
# BucketName: my-new-bucket
# Outputs:
# NewOutput:
# Description: "Description for the output"
# Value: "Some output value"
Ahora, necesitamos agregar cambios en el archivo serverless.yml según nuestros requisitos. Puede utilizar los comandos que se indican a continuación:
Puede utilizar el siguiente comando para Service -
service: aws-nodejs # NOTE: update this with your service name
Ahora, cambie el servicio aquí y agregue el nombre dado a nuestra carpeta como se muestra:
service: aws-serverless # NOTE: update this with your service name
Los detalles del proveedor son los que se muestran:
provider:
name: aws
runtime: nodejs6.10
El proveedor es aws y el tiempo de ejecución es nodejs6.10. Necesitamos agregar elregion en el que estaremos trabajando y el stage, es decir dev or prodentorno para el proyecto. Así que aquí están los detalles actualizados del proveedor: proveedor -
name: aws
runtime: nodejs6.10
# you can overwrite defaults here
stage: prod
region: us-east-1
Rol de IAM
los iam role, es decir, el código de permiso para trabajar con Lambda se muestra aquí en la .yml archivo -
# iamRoleStatements:
# - Effect: "Allow"
# Action:
# - "s3:ListBucket"
# Resource: { "Fn::Join" : ["", ["arn:aws:s3:::", { "Ref" : "ServerlessDeploymentBucket" } ] ] }
# - Effect: "Allow"
# Action:
# - "s3:PutObject"
# Resource:
# Fn::Join:
# - ""
# - - "arn:aws:s3:::"
# - "Ref" : "ServerlessDeploymentBucket"
# - "/*"
Tenga en cuenta que debemos proporcionar los detalles del rol, que es el permiso requerido con otros servicios de AWS, en la sección anterior.
Detalles del controlador AWS Lambda
El nombre de la función de exportación en handler.jses hola. Entonces, el controlador es el nombre del archivo seguido del nombre de exportación.
functions:
hello:
handler: handler.hello
Los detalles del recurso sobre el servicio s3 agregado como se muestra a continuación aquí:
# you can add CloudFormation resource templates here
#resources:
# resources:
# NewResource:
# Type: AWS::S3::Bucket
# Properties:
# BucketName: my-new-bucket
# Outputs:
# NewOutput:
# Description: "Description for the output"
# Value: "Some output value"
Implemente AWS Lambda mediante Serverless Framework
Implementemos la función lambda anterior en la consola de AWS. Puede utilizar los siguientes pasos para este propósito:
Paso 1
Primero, tendrá que usar el siguiente comando:
sls deploy
Paso 2
Ahora, debería ver la función en la consola de AWS ahora como se muestra. Los detalles de AWS sin servidor se registran en la formación de la nube de AWS. Para ello, vaya al servicio de AWS y seleccioneCloudFormation. Los detalles de AWS Lambda se muestran de la siguiente manera:
Observe que el nombre dado es el nombre del proyecto seguido de la etapa utilizada.
Paso 3
Crea el rol iam para AWS Lambda y el grupo de registros para AWS Cloudwatch. Se crea un bucket de S3 que tiene los detalles del código almacenados y los detalles de configuración.
Esto es creado por el comando sls deploy. No es necesario especificar el rol de iam, sino que se crea de forma predeterminada durante ladeploy etapa.
Etapa 4
El flujo detallado de eventos se muestra a continuación en el servicio de formación de nubes.
Código AWS Lambda
El código de AWS Lambda y su configuración de ejecución se muestran en la captura de pantalla que se muestra a continuación:
Cuando prueba la función Lambda, puede encontrar el siguiente resultado:
La salida de registro para la función anterior se muestra aquí:
También podemos probar la función AWS Lambda utilizando el comando sin servidor como se muestra a continuación:
sls invoke --function hello
La sintaxis del comando invoke se muestra aquí:
sls invoke --function hello
Este comando de invocación activa la función AWS Lambda y muestra el resultado en el símbolo del sistema como se muestra a continuación:
También puede probar la función Lambda antes de la implementación y el comando para la misma usando el siguiente comando:
sls invoke local --function hello
Tenga en cuenta que no siempre es posible realizar pruebas localmente, ya que los recursos como S3 y DynanoDB no se pueden simular en el entorno local. Solo las llamadas a funciones básicas pueden probarse localmente.
Uso de API Gateway y AWS Lambda con Serverless Framework
Veamos cómo crear un nuevo proyecto para trabajar con Lambda y API Gateway. Puede usar el siguiente comando para este propósito:
sls create --template aws-nodejs
Ahora abierto aws-apiproyecto en código visual. Puedes ver que elhandler.js y serverless.ymlarchivos creados. Hagamos los cambios en eso para agregar la puerta de enlace api.
Tendrá que hacer los siguientes cambios en serverless.yml -
Ahora, los detalles de los eventos agregados para la activación de la puerta de enlace de la API con AWS Lambda:
Hay algo nuevo agregado aquí llamado events. Hemos especificado el evento comohttp, junto con su ruta y método.
La ruta es el punto final que usaremos cuando se cree la ruta de la puerta de enlace de la API y el método utilizado es GET.
Observe que el manejador es handler.helloy hola es el nombre de exportación de handler.js.
Tenga en cuenta que no tiene que implementar la puerta de enlace api aquí, ya que el marco sin servidor lo hará.
Ahora, ejecutaremos el sls deploy comando para crear la función AWS Lambda con el disparador como api gateway.
sls deploy
Observe que los detalles de implementación se enumeran arriba. Da elGeturl con el punto final como detalles de la ruta. El escenario esprodlo mismo se usa en la url. El nombre de la función esaws-api-prod-hello.
Presionemos la URL y veamos el resultado. Puede ver lo siguiente, la respuesta que obtenemos del api-gateway get url:
{"message":"Go Serverless v1.0! Your function executed
successfully!","input":{"resource":"/first-api","path":"/first-api","httpMethod":
"GET","headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,
image/webp,image/apng,*/*;q=0.8","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","CloudFront-Forwarded-Proto":
"https","CloudFront-Is-Desktop-Viewer":"true","CloudFront-Is-Mobile-Viewer":
"false","CloudFront-Is-SmartTV-Viewer":"false","CloudFront-Is-Tablet-Viewer":
"false","CloudFront-Viewer-Country":"IN","Host":"nvbhfdojfg.execute-api.us-east-1.
amazonaws.com","upgrade-insecure-requests":"1","User-Agent":"Mozilla/5.0
(Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/66.0.3359.181 Safari/537.36","Via":"2.0 707912794802dbb4825c79b7d8626a5d.cloudfront.net (CloudFront)","X-Amz-Cf-Id":"j70MMqkWFp6kmvuauzp_nvTbI-WwKIQmm2Jl5hzSoN6gkdvX11hh-g==",
"X-Amzn-Trace-Id":"Root=1-5b13f9ef-5b012e36b7f40b5013a326fc","X-Forwarded-For":"157.33.133.217, 54.182.242.73","X-Forwarded-Port":"443","X-Forwarded-Proto":"https"},
"queryStringParameters":null,"pathParameters":null,"stageVariables":null,
"requestContext":{"resourceId":"pes5sy","resourcePath":"/first-api","httpMethod":
"GET","extendedRequestId":"H6P9fE-MoAMFdIg=","requestTime":"03/Jun/2018:14:23:
43 +0000","path":"/prod/first-api","accountId":"625297745038","protocol":"HTTP/1.1",
"stage":"prod","requestTimeEpoch":1528035823928,"requestId":"b865dbd6-6739-11e8-b135
-a30269a8ec58","identity":{"cognitoIdentityPoolId":null,"accountId":null,
"cognitoIdentityId":null,"caller":null,"SourceIp":"157.33.133.217","accessKey":null,
"cognitoAuthenticationType":null,"cognitoAuthenticationProvider":null,"userArn":null,
"userAgent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/66.0.3359.181 Safari/537.36","user":null},"apiId":"nvbhfdojfg"},"body":null,
"isBase64Encoded":false}}
Los detalles del evento también están disponibles en la salida cuando presiona la URL. HttpMethod es GET y queryStringParameters son nulos ya que no se pasa nada en la cadena de consulta. Los detalles del evento se dan ainput que hemos especificado en el controlador AWS Lambda -
La salida que obtenemos de la puerta de enlace api es solo la body detalles como message y input. La respuesta está totalmente controlada por la puerta de enlace API y cómo mostrarla como salida.
Ahora, pasemos las entradas a la URL GET en la cadena de consulta y veamos la pantalla:
Luego puede ver la salida de la cadena de consulta como se muestra a continuación:
{"message":"Go Serverless v1.0! Your function executed
successfully!","input":{"resource":"/first-api","path":"/first-api","httpMethod":
"GET","headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,
image/webp,image/apng,*/*;q=0.8","Accept-Encoding":"gzip, deflate,
br","Accept-Language":"en-US,en;q=0.9","CloudFront-Forwarded-Proto":"https",
"CloudFront-Is-Desktop-Viewer":"true","CloudFront-Is-Mobile-Viewer":"false",
"CloudFront-Is-SmartTV-Viewer":"false","CloudFront-Is-Tablet-Viewer":"false",
"CloudFront-Viewer-Country":"IN","Host":"nvbhfdojfg.execute-api.us-east-1.amazonaws.com",
"upgrade-insecure-requests":"1","User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36","Via":"2.0
8b1d3263c2fbd0a2c270b174d7aa3d61.cloudfront.net (CloudFront)","X-Amz-Cf-Id":"JIBZw3I-blKbnpHP8LYXPVolCgdW5KmEukZS4at9mi4vrWBMI-UKNw==",
"X-Amzn-Trace-Id":"Root=1-5b13ff90-7d6e38d4c0e4a5d4e6184f30","X-Forwarded-For":
"157.33.133.217, 54.182.242.127","X-Forwarded-Port":"443","X-Forwarded-Proto":"https"},"queryString
Parameters":{"displaymessage":"Hello"},"pathParameters":null,"stageVariables":null,
"requestContext":{"resourceId":"pes5sy","resourcePath":"/first-api","httpMethod":
"GET","extendedRequestId":"H6TeiG34oAMFguA=","requestTime":"03/Jun/2018:14:47:44 +0000","path":"/prod/first-api","accountId":"625297745038","protocol":"HTTP/1.1",
"stage":"prod","requestTimeEpoch":1528037264252,"requestId":"12e5dca3-
673d-11e8-8966-69fcf43bd4db","identity":{"cognitoIdentityPoolId":null,"accountId":null,
"cognitoIdentityId":null,"caller":null,"exmpleIp":"157.33.133.217","accessKey":null,
"cognitoAuthenticationType":null,"cognitoAuthenticationProvider":null,"userArn":null,
"userAgent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/66.0.3359.181 Safari/537.36","user":null},"apiId":"nvbhfdojfg"},"body":
null,"isBase64Encoded":false}}
Cambiemos la función AWS Lambda para mostrar los detalles de la cadena de consulta como se muestra a continuación:
'use strict';
module.exports.hello = (event, context, callback) => {
const response = {
statusCode: 200,
body: JSON.stringify({
message:(event.queryStringParameters && event.queryStringParameters.displaymessage!="") ? event.queryStringParameters.displaymessage : 'Go Serverless v1.0! Your function executed successfully!'
}),
};
callback(null, response);
// Use this code if you don't use the http event with the LAMBDA-PROXY integration
// callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event });
};
Observe que hemos cambiado el mensaje en función de la cadena de consulta. display message. Esto desplegará la función nuevamente y verificará la salida. Muestra los detalles presentes en el mensaje de visualización de la variable de la cadena de consulta como se muestra a continuación.
Ahora agreguemos post método a los eventos creados como se muestra a continuación -
Ahora, implemente los cambios realizados y podrá ver el siguiente resultado del comando deploy:
Tenga en cuenta que probar la URL de la publicación en el navegador directamente no proporcionará los detalles. Debes probar la URL de la publicación enpostman.
Para conseguir cartero, vaya a https://www.getpostman.com/apps. Descargue la aplicación según su sistema operativo. Una vez instalado, debería poder probar la URL de su publicación como se muestra a continuación:
Esto muestra el mensaje que hemos agregado en la función Lambda.
Este capítulo explicará en detalle sobre el proceso de ejecución e invocación de la función Lambda y los pasos involucrados en él.
Modelo de ejecución de AWS Lambda
La ejecución de AWS depende de los detalles de configuración agregados para la función AWS Lambda. Cuando se crea la función, hay unmemory y time allotted, que se utiliza para la ejecución de la función AWS Lambda.
Con la ayuda de los detalles de configuración, AWS Lambda crea un contexto de ejecución. El contexto de ejecución es un entorno de ejecución temporal que se prepara con cualquier dependencia externa, como conexión de base de datos, puntos finales http, bibliotecas de terceros, etc., si las hubiera.
Cuando se invoca la función AWS Lambda por primera vez o si se actualiza la función lambda, se agrega poca latencia debido a la configuración del contexto de ejecución. Sin embargo, las llamadas posteriores son más rápidas en comparación con la primera. AWS Lambda intenta reutilizar el contexto de ejecución nuevamente si se invoca la función Lambda en menos tiempo.
La reutilización del contexto de ejecución tiene las siguientes implicaciones:
Si se realiza alguna conexión a la base de datos para la ejecución de Lambda, la conexión se mantiene para su reutilización. Por lo tanto, el código Lambda debe ser tal que la conexión debe verificarse primero, si existe y reutilizarse; de lo contrario, tendremos que hacer una nueva conexión.
El contexto de ejecución mantiene un espacio en disco de 500 MB en /tmpdirectorio. Los datos necesarios se almacenan en caché en este directorio. Puede tener una verificación adicional en el código para ver si existen los datos.
Si las devoluciones de llamada o algunos procesos en segundo plano no están completos cuando se invocó la función Lambda, la ejecución comenzará cuando se vuelva a invocar la función lambda. En caso de que no necesite que esto suceda, asegúrese de que todos sus procesos finalicen correctamente, cuando se complete la ejecución de la función.
Debe utilizar el contexto de ejecución y los datos almacenados en el directorio tmp. Tendrá que agregar las comprobaciones necesarias en el código para ver si existen los datos requeridos antes de crear nuevos nuevos. Esto ahorrará tiempo durante la ejecución y la hará más rápida.
Invocación de la función AWS Lambda
Podemos invocar AWS manualmente usando aws cli. Ya hemos visto cómo crear e implementar AWS Lambda utilizandocli. Aquí, primero crearemos una función usandoaws cli e invocar el mismo.
Creación de la función AWS Lambda mediante AWS CLI
Puede utilizar los siguientes comandos para crear la función AWS Lambda utilizando aws cli -
Commands
create-function
--function-name <value>
--runtime <value>
--role <value>
--handler <value>
[--code <value>]
[--description <value>]
[--timeout <value>]
[--memory-size <value>]
[--environment <value>]
[--kms-key-arn <value>]
[--tags <value>]
[--zip-file <value>]
[--cli-input-json <value>]
Command with values
aws lambda create-function
--function-name "lambdainvoke"
--runtime "nodejs8.10"
--role "arn:aws:iam::625297745038:role/lambdaapipolicy"
--handler "index.handler"
--timeout 5
--memory-size 256
--zip-file "fileb://C:\nodeproject\index.zip"
La salida es la que se muestra a continuación:
La función creada en la consola de AWS es la que se muestra a continuación:
Ahora, puede invocar la función usando el comando:invoke
--function-name <value>
[--invocation-type <value>]
[--log-type <value>]
[--client-context <value>]
[--payload <value>]
[--qualifier <value>]
outfile <value>
Options
--function-name − Especifique el nombre de la función que desea invocar.
--invocation-type(string) − por defecto, el tipo de invocación es requestresponse. Los valores disponibles para usar con el tipo de invocación sonRequestResponse, Event y DryRun.
El tipo de invocación de evento se utilizará para la respuesta asíncrona.
DryRun se debe utilizar cuando desee verificar la función Lambda sin necesidad de ejecutarla.
--log-type − Será Tailsi el tipo de invocación es RequestResponse. Proporciona los últimos datos de registro codificados en base64 de 4 KB. Los valores posibles sonTail y None.
--client-context −Puede pasar detalles específicos del cliente a la función Lambda. El contexto del cliente debe estar en formato json y codificado en base64. El tamaño máximo de archivo es 3583 bytes.
--payload − json de entrada de formato a su función lambda.
--qualifier −Puede especificar la versión de la función Lambda o el nombre de alias. Si pasa la versión de la función, la api usará la función calificada arn para invocar la función Lambda. Si especifica un nombre de alias, la API usa el ARN de alias para invocar la función Lambda.
outfile − Este es el nombre del archivo donde se guardará el contenido.
Command with values
aws lambda invoke --function-name "lambdainvoke" --log-type
Tail C:\nodeproject\outputfile.txt
Puede usar la opción de carga útil para enviar un evento ficticio a la función lambda en formato json como se muestra a continuación.
El código de AWS Lambda relacionado es el siguiente:
exports.handler = async (event, callback) => {
console.log("Hello => "+ event.name);
console.log("Address =>"+ event.addr);
callback(null, 'Hello '+event.name +" and address is "+ event.addr);
};
Observa que en el código tenemos consola event.name y event.addr. Ahora, usemos la opción de carga útil en aws cli para enviar el evento con el nombre y la dirección de la siguiente manera:
aws lambda invoke --function-name "lambdainvoke" --log-type
Tail --payload file://C:\clioutput\input.txt C:\clioutput\outputfile.txt
Thenpayload toma la entrada como una ruta de archivo que tiene la entrada json como se muestra:
{"name":"Roy Singh", "addr":"Mumbai"}
La salida correspondiente es la que se muestra a continuación:
La salida se almacena en el archivo C:\clioutput\outputfile.txt como sigue -
"Hello Roy Singh and address is Mumbai"
Eventos de muestra
Puede probar la función de AWS Lambda pasando un evento de muestra. Esta sección ofrece algunos eventos de muestra para los servicios de AWS. Puedes usar elinvokecomando para probar la salida cuando se activa con cualquiera de los servicios. Observe los códigos dados para los eventos de muestra correspondientes a continuación:
Evento de muestra de envío de Amazon S3
{
"Records": [{
"eventVersion": "2.0",
"eventTime": "1970-01-01T00:00:00.000Z",
"requestParameters": {
"SourceIPAddress": "127.0.0.1"
},
"s3": {
"configurationId": "testConfigRule",
"object": {
"eTag": "0123456789abcdef0123456789abcdef",
"sequencer": "0A1B2C3D4E5F678901",
"key": "HappyFace.jpg",
"size": 1024
},
"bucket": {
"arn": bucketarn,
"name": "Sourcebucket",
"ownerIdentity": {
"principalId": "EXAMPLE"
}
},
"s3SchemaVersion": "1.0"
},
"responseElements": {
"x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
"x-amz-request-id": "EXAMPLE123456789"
},
"awsRegion": "us-east-1",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "EXAMPLE"
},
"eventSource": "aws:s3"
}]
}
Para obtener el details of the file from the s3 put event, puede usar el siguiente comando:
event.Records[0].s3.object.key //will display the name of the file
A get the bucket name, puede usar el siguiente comando:
event.Records[0].s3.bucket.name //will give the name of the bucket.
A see the EventName, puede usar el siguiente comando:
event.Records[0].eventName // will display the eventname
Evento de muestra de eliminación de Amazon S3
{
"Records": [{
"eventVersion": "2.0",
"eventTime": "1970-01-01T00:00:00.000Z",
"requestParameters": {
"SourceIPAddress": "127.0.0.1"
},
"s3": {
"configurationId": "testConfigRule",
"object": {
"sequencer": "0A1B2C3D4E5F678901",
"key": "HappyFace.jpg"
},
"bucket": {
"arn": bucketarn,
"name": "Sourcebucket",
"ownerIdentity": {
"principalId": "EXAMPLE"
}
},
"s3SchemaVersion": "1.0"
},
"responseElements": {
"x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
"x-amz-request-id": "EXAMPLE123456789"
},
"awsRegion": "us-east-1",
"eventName": "ObjectRemoved:Delete",
"userIdentity": {
"principalId": "EXAMPLE"
},
"eventSource": "aws:s3"
}]
}
Amazon DynamoDB
Amazon DynamoDB puede ser un evento en AWS Lambda cuando se realizan cambios en la tabla de DynamoDB. Podemos realizar operaciones como agregar entrada, actualizar y eliminar registros de la tabla DynamodDB.
Aquí se muestra un evento de muestra para agregar, insertar y eliminar eventos de DynamoDB:
{
"Records": [{
"eventID": "1",
"eventVersion": "1.0",
"dynamodb": {
"Keys": {
"Id": {
"N": "101"
}
},
"NewImage": {
"Message": {
"S": "New item!"
},
"Id": {
"N": "101"
}
},
"StreamViewType": "NEW_AND_OLD_IMAGES",
"SequenceNumber": "111",
"SizeBytes": 26
},
"awsRegion": "us-west-2",
"eventName": "INSERT",
"eventSourceARN": eventSourcearn,
"eventSource": "aws:dynamodb"
},
{
"eventID": "2",
"eventVersion": "1.0",
"dynamodb": {
"OldImage": {
"Message": {
"S": "New item!"
},
"Id": {
"N": "101"
}
},
"SequenceNumber": "222",
"Keys": {
"Id": {
"N": "101"
}
},
"SizeBytes": 59,
"NewImage": {
"Message": {
"S": "This item has changed"
},
"Id": {
"N": "101"
}
},
"StreamViewType": "NEW_AND_OLD_IMAGES"
},
"awsRegion": "us-west-2",
"eventName": "MODIFY",
"eventSourceARN": Sourcearn,
"eventSource": "aws:dynamodb"
},
{
"eventID": "3",
"eventVersion": "1.0",
"dynamodb": {
"Keys": {
"Id": {
"N": "101"
}
},
"SizeBytes": 38,
"SequenceNumber": "333",
"OldImage": {
"Message": {
"S": "This item has changed"
},
"Id": {
"N": "101"
}
},
"StreamViewType": "NEW_AND_OLD_IMAGES"
}, "awsRegion": "us-west-2",
"eventName": "REMOVE",
"eventSourceARN": Sourcearn,
"eventSource": "aws:dynamodb"
}]
}
Servicio de notificación simple de Amazon
AWS Lambda puede resultar útil para procesar la notificación creada en Simple Notification Service (SNS). Siempre que haya un mensaje publicado en SNS, la función Lambda se puede activar con un evento SNS, que tiene detalles de los mensajes. Estos mensajes se pueden procesar dentro de la función Lambda y se pueden enviar a otros servicios según el requisito.
Una vez que se ingresa el mensaje, SNS activará la función Lambda. Si algún error intenta invocar la función Lambda, SNS volverá a intentar llamar a la función lambda hasta tres veces.
Evento de muestra de Amazon SNS
A continuación, se muestra un evento de muestra que tiene todos los detalles disponibles en la función AWS Lambda para llevar a cabo el proceso adicional:
{
"Records": [{
"EventVersion": "1.0",
"EventSubscriptionArn": eventsubscriptionarn,
"EventSource": "aws:sns",
"Sns": {
"SignatureVersion": "1",
"Timestamp": "1970-01-01T00:00:00.000Z",
"Signature": "EXAMPLE",
"SigningCertUrl": "EXAMPLE",
"MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
"Message": "Hello from SNS!",
"MessageAttributes": {
"Test": {
"Type": "String",
"Value": "TestString"
},
"TestBinary": {
"Type": "Binary",
"Value": "TestBinary"
}
},
"Type": "Notification",
"UnsubscribeUrl": "EXAMPLE",
"TopicArn": topicarn,
"Subject": "TestInvoke"
}
}]
}
Servicio de correo simple de Amazon
Amazon Simple Mail Service se puede utilizar para enviar mensajes y también para recibir mensajes. Se puede llamar a la función AWS Lambda en Simple Mail Service cuando se recibe el mensaje.
Evento de muestra de recepción de correo electrónico de Amazon SES
Los detalles del evento SES cuando se usa dentro de AWS Lambda se muestran a continuación:
{
"Records": [{
"eventVersion": "1.0",
"ses": {
"mail": {
"commonHeaders": {
"from": [
"Jane Doe <[email protected]>"
],
"to": [
"[email protected]"
],
"returnPath": "[email protected]",
"messageId": "<0123456789Source.com>",
"date": "Wed, 7 Oct 2015 12:34:56 -0700",
"subject": "Test Subject"
},
"example": "[email protected]",
"timestamp": "1970-01-01T00:00:00.000Z",
"destination": [
"[email protected]"
],
"headers": [{
"name": "Return-Path",
"value": "<[email protected]>"
},
{
"name": "Received",
"value": "from mailer.example.com (mailer.example.com [203.0.113.1]) by inbound-smtp.us-west-2.amazonaws.com with SMTP id o3vrnil0e2ic for [email protected]; Wed, 07 Oct 2015 12:34:56 +0000 (UTC)"
},
{
"name": "DKIM-Signature",
"value": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=example; h=mime-version:from:date:message-id:subject:to:content-type; bh=jX3F0bCAI7sIbkHyy3mLYO28ieDQz2R0P8HwQkklFj4=; b=sQwJ+LMe9RjkesGu+vqU56asvMhrLRRYrWCbV"
},
{
"name": "MIME-Version",
"value": "1.0"
},
{
"name": "From",
"value": "Jane Doe <[email protected]>"
},
{
"name": "Date",
"value": "Wed, 7 Oct 2015 12:34:56 -0700"
},
{
"name": "Message-ID",
"value": "<0123456789example.com>"
},
{
"name": "Subject",
"value": "Test Subject"
},
{
"name": "To",
"value": "[email protected]"
},
{
"name": "Content-Type",
"value": "text/plain; charset=UTF-8"
}],
"headersTruncated": false,
"messageId": "o3vrnil0e2ic28tr"
},
"receipt": {
"recipients": [
"[email protected]"
],
"timestamp": "1970-01-01T00:00:00.000Z",
"spamVerdict": {
"status": "PASS"
},
"dkimVerdict": {
"status": "PASS"
},
"processingTimeMillis": 574,
"action": {
"type": "Lambda",
"invocationType": "Event",
"functionArn": "arn:aws:lambda:us-west-2:012345678912:function:example"
},
"spfVerdict": {
"status": "PASS"
},
"virusVerdict": {
"status": "PASS"
}
}
},
"eventexample": "aws:ses"
}]
}
Registros de Amazon Cloudwatch
AWS Lambda se puede activar desde Amazon CloudWatch Logs mediante el CloudWatch Logs Subscriptions. Las suscripciones de CloudWatch Logs tienen datos en tiempo real sobre los registros que se pueden procesar y analizar dentro de AWS Lambda o se pueden usar para cargar en otros sistemas.
Evento de muestra de Amazon CloudWatch Logs
{
"awslogs": {
"data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwW
QRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpL
wivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQ
DQiMdxRQEAAA=="
}
}
Amazon API Gateway
La función AWS Lambda se puede invocar en httpsurl. Se puede hacer enGET, POST, PUT. Cuando se invoca la URL https, también se activa la función AWS Lambda y los datos pasados a https mediante get / post pueden estar disponibles dentro de AWS Lambda para usarse para insertar en DynamoDB o para enviar correo, etc.
Evento de solicitud de proxy de API Gateway
{
"path": "/test/hello",
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, lzma, sdch, br",
"Accept-Language": "en-US,en;q=0.8",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-Country": "US",
"Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
"Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
"X-Forwarded-For": "192.168.100.1, 192.168.1.1",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"pathParameters": {
"proxy": "hello"
},
"requestContext": {
"accountId": "123456789012",
"reexampleId": "us4z18",
"stage": "test",
"requestId": "41b45ea3-70b5-11e6-b7bd-69b5aaebc7d9",
"identity": {
"cognitoIdentityPoolId": "",
"accountId": "",
"cognitoIdentityId": "",
"caller": "",
"apiKey": "",
"exampleIp": "192.168.100.1",
"cognitoAuthenticationType": "",
"cognitoAuthenticationProvider": "",
"userArn": "",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
"user": ""
},
"reexamplePath": "/{proxy+}",
"httpMethod": "GET",
"apiId": "wt6mne2s9k"
},
"reexample": "/{proxy+}",
"httpMethod": "GET",
"queryStringParameters": {
"name": "me"
},
"stageVariables": {
"stageVarName": "stageVarValue"
}
}
Evento de respuesta de proxy de API Gateway
{
"statusCode": 200,
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, lzma, sdch, br",
"Accept-Language": "en-US,en;q=0.8",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-Country": "US",
"Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
"Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
"X-Forwarded-For": "192.168.100.1, 192.168.1.1",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"body": "Hello World"
}
La eliminación de la función AWS Lambda eliminará AWS Lambda de la consola de AWS. Hay 2 formas de eliminar la función AWS Lambda.
- Usando la consola de AWS.
- Uso del comando AWS CLI
Este capítulo analiza estas dos formas en detalle.
Uso de la consola de AWS
Para eliminar una función Lambda mediante la consola de AWS, siga los pasos que se indican a continuación:
Paso 1
Inicie sesión en la consola de AWS y vaya al servicio AWS Lambda. Puede encontrar que las funciones lambda de AWS creadas hasta ahora se enumeran en la consola de AWS como se muestra a continuación:
La lista muestra que hasta el momento se han creado 23 funciones de AWS Lambda. Puede verlos usando la paginación proporcionada en la parte superior o buscar en AWS Lambda usando el cuadro de búsqueda.
Paso 2
Observe que hay un botón de opción en cada una de las funciones de AWS Lambda. Seleccione la función que desea eliminar. Observe la captura de pantalla que se muestra a continuación:
Paso 3
Una vez que seleccione la función AWS Lambda, el Actionel menú desplegable que antes estaba en gris ahora está resaltado. Ahora, abra el cuadro combinado y mostrará las opciones como se muestra:
Etapa 4
Selecciona el Deletepara eliminar la función AWS Lambda. Una vez que haces clicDelete, muestra el mensaje de la siguiente manera:
Paso 5
Lea el mensaje con atención y luego haga clic en Delete para eliminar la función lambda de AWS de forma permanente.
Note- Eliminar aws lambda no eliminará el rol vinculado. Para eliminar la función, debe ir a IAM y eliminar la función.
Paso 6
La lista de roles creados hasta ahora se muestra a continuación. Observe que hay unCreate role botón y Delete role botón.
Haga clic en la casilla de verificación del rol que desea eliminar. También puede seleccionar varios roles para eliminarlos a la vez.
Paso 7
Verá un mensaje de confirmación como se muestra a continuación una vez que haga clic en el botón Eliminar -
Ahora, lea atentamente los detalles mencionados y luego haga clic en Yes, delete botón.
Uso del comando AWS CLI
Primero creemos una función Lambda usando aws cli y eliminemos la misma usando el mismo comando. Siga los pasos que se indican a continuación para este propósito:
Paso 1
El comando con valores para la función de creación es el siguiente:aws lambda create-function
--function-name "lambdatestcli"
--runtime "nodejs8.10"
--role "arn:aws:iam::625297745038:role/lambdaapipolicy"
--handler "index.handler"
--timeout 5
--memory-size 256
--zip-file "fileb://C:\demotest\index.zip"
La salida correspondiente se muestra aquí:
Paso 2
La función AWS Lambda creada es lambdatestcli. Hemos utilizado el rol arn existente para crear la función lambda.
Luego, puede encontrar esta función que se muestra en la consola de AWS como se muestra a continuación:
Paso 3
Ahora, invoquemos la función para probar la salida usando el comando que se muestra:aws lambda invoke --function-name "lambdatestcli" --log-type Tail
C:\demotest\outputfile.txt
Este comando le dará la salida como se muestra:
Etapa 4
Puede observar los registros de cloudwatch para la función lambda lambdatestcliPaso 5
Ahora, pasemos a la parte real de eliminar la función AWS. Delete aws cli apieliminará la función dada. Los detalles del comando utilizado para este propósito se dan a continuación:Command
delete-function
--function-name <value>
[--qualifier <value>]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]
Options
--function-name(string) - Esto tomará el nombre de la función Lambda o el arn de la función AWS Lambda.
--qualifier (string)- Esto es opcional. Aquí puede especificar la versión de AWS Lambda que debe eliminarse.
-- cli-input-json(string)- Realiza la operación del servicio según la cadena JSON proporcionada. La cadena JSON sigue el formato proporcionadoby --generate-cli-skeleton. Si se proporcionan otros argumentos en la línea de comando, los valores de CLI anularán los valores proporcionados por JSON.
--generate-cli-skeleton(string) : Imprime el esqueleto json en la salida estándar sin enviar la solicitud de API.
Command with values
aws lambda delete-function --function-name "lambdatestcli"
La salida correspondiente se muestra a continuación:
Paso 6
Si marca ahora, puede observar que la función no se verá en la lista de funciones de AWS Lambda como se muestra en la captura de pantalla que se muestra a continuación:Trabajar con Amazon API Gateway
La función AWS Lambda se puede invocar en HTTPSurl. Se puede hacer en GET, POST, PUT. Cuando se invoca la URL HTTPS, la función AWS Lambda también se puede activar y los datos se pasan a HTTPS medianteget/post puede estar disponible dentro de AWS Lambda para usarse para insertar en DynamoDB o para enviar correo, etc.
Este capítulo trata en detalle sobre varios procesos involucrados en el trabajo con AWS lambda y API Gateway.
Procesos involucrados
Los siguientes son los procesos involucrados en el trabajo con AWS lambda y API Gateway:
- Crear función de IAM para obtener permiso
- Crear función lambda de AWS
- Crear API Gateway
- Vincular la función lambda a la puerta de enlace api
- Pasando datos a la puerta de enlace de la API
Aquí se proporciona un diagrama básico que explica el funcionamiento de la puerta de enlace API y AWS Lambda:
Estos procesos se explican en detalle en este capítulo con capturas de pantalla relevantes.
Crear función de IAM para obtener permiso
En los servicios de Amazon, como se muestra a continuación, seleccione IAM para crear roles que utilizará la función Lambda.
Vaya a IAM y seleccione Roles desde la sección del lado izquierdo como se muestra a continuación -
Hacer clic Create role para la función Lambda.
Seleccione Lambda y haga clic en Permissionsen el fondo. Seleccione el permiso requerido para API Gateway y Lambda.
Busque la puerta de enlace API en la búsqueda y le mostrará todos los permisos relacionados. Aquí hemos elegido el acceso completo a la puerta de enlace API como se muestra a continuación:
Ahora, busque la puerta de enlace API y le mostrará todos los permisos relacionados. Aquí hemos elegido el acceso completo a la puerta de enlace API como se muestra a continuación:
También debe repetir el mismo proceso para las políticas.
Una vez que haya terminado de elegir las políticas necesarias, haga clic en Reviewpara el siguiente paso. Ingrese el nombre de la función según su elección, como se muestra a continuación:
Muestra las políticas adjuntas al rol. Hacer clicCreate role y hemos terminado con la creación del rol y podemos continuar con la función lambda.
Crear función AWS Lambda
Vaya a los servicios de AWS y haga clic en el servicio lambda para crear una función para conectarlo con la puerta de enlace API.
La pantalla de la interfaz de usuario para la función Lambda se muestra a continuación. Hacer clicCreate function para continuar con la creación de la función Lambda.
Ingrese el nombre de la función y elija el rol existente que hemos creado arriba.
Aparece un mensaje que indica que la función con el nombre lambdawithapigateway se crea correctamente.
Tenga en cuenta que aquí usaremos nodejstiempo de ejecución para escribir el código. El código de AWS conhelloworld el mensaje es como se muestra a continuación -
El código AWS Lambda está presente en index.jsarchivo. La función llamada manejador tiene los parámetros a saberevents, context y callback.
La función de devolución de llamada básicamente tiene el error y el mensaje de éxito. Tenga en cuenta que aquí no tenemos ningún código relacionado con el error, por lo que se pasa nulo y el mensaje de éxito esHelloWorld from lambda.
Por último, guarde los cambios agregados y procedamos a agregar la función Lambda a la puerta de enlace API.
Crear API Gateway
Inicie sesión en su cuenta de AWS y abra API Gateway como se muestra a continuación:
Haga clic en API Gateway y lo llevará a la pantalla donde se puede crear una nueva API Gateway.
Hacer clic Create API y agregue detalles como se muestra a continuación -
Haga clic en el Create APIen el lado derecho de la pantalla. Esto mostrará la API recién creada en el lado izquierdo de la pantalla.
Haga clic en el Actions menú desplegable para crear un nuevo recurso para la API.
Ahora, cree un nuevo recurso como se muestra a continuación:
Introducir el Resource NameComo se muestra abajo. Verá el nombre del recurso ingresado en la URL creada al final. Hacer clicCreate Resource y lo verá en la pantalla de la siguiente manera:
Añadir GET/POSTmétodos al recurso creado como se muestra a continuación. Seleccione el método deActions desplegable.
Haga clic en el GET método para agregar el método a la API.
El siguiente paso es la integración que lo integrará con la función Lambda. Ahora agregue la función Lambda como se muestra a continuación:
Vincular la función Lambda a API Gateway
Seleccione la función lambda creada anteriormente.
Guarde los cambios y podrá ver un cuadro de diálogo solicitando permiso como se muestra a continuación:
Hacer clic OKpor el permiso. Estos son los detalles de ejecución entre la solicitud HTTP de la puerta de enlace de API y la función Lambda:
Ahora, implementemos los cambios de la puerta de enlace API. Para ello, debemos seleccionar elDeploy API desde Actions menú desplegable como se muestra a continuación -
Seleccione Deploy API. Le preguntará por el estado de implementación. SeleccioneNew Stage desde el menú desplegable Etapa de implementación y agregue el nombre de la etapa como Production.
Hacer clic Deploy y lo redireccionará a la URL como se muestra a continuación:
Selecciona el GETmétodo del lado izquierdo para obtener la URL. Abra la URL en una nueva pestaña para ver el mensaje de la función Lambda.
Este es un ejemplo básico de trabajo con AWS Lambda y AWS API Gateway. En el ejemplo anterior, hemos codificado el mensaje en la función Lambda.
Ahora, tomemos los detalles del mensaje de API Gateway. En caso de que la llamada HTTPS tenga que ser llamada desde un dominio diferente, por ejemplo, una llamada AJAX a la API, necesitamos habilitar CORS para la puerta de enlace API creada.
Seleccione el recurso creado para la API y haga clic en Actions desplegable -
Ahora, Enable CORS abrirá la siguiente pantalla -
Puede utilizar algunos métodos para HABILITAR CORS. Access-Control-Allow-Origin está marcado como * lo que significa que permitirá obtener contenido de la puerta de enlace API desde cualquier dominio.
También puede especificar el nombre de dominio con el que desea trabajar con la API. Hacer clicEnable CORS and replace existing CORS headers y mostrará un mensaje de confirmación como se muestra a continuación:
Hacer clic Yes, replace existing valuespara habilitarlo. losEnable CORS la pantalla se ve como se muestra a continuación -
Pasar datos a API Gateway
Abra la API creada en API Gateway displayhelloworld como se muestra a continuación -
Hacer clic Integration Request para enviar datos como se muestra a continuación -
Escoger Body Mapping Templates y agrega el Content-Type para este ejemplo como application/json. Haga clic en el tipo de contenido agregado agregue los detalles de la siguiente manera:
Ahora, agregue la plantilla en formato JSON como se muestra a continuación:
Observe que hemos tomado el mensaje como parámetro para obtener datos de API Gateway y compartirlos con AWS Lambda. La sintaxis para obtener los detalles es la que se muestra arriba.
Ahora, implemente la API para que los cambios estén disponibles en la URL de API Gateway. Para esto, necesitamos cambiar la función Lambda para mostrar los datos basados en la URL de API Gateway. El código para la función Lambda se proporciona a continuación. Tenga en cuenta que tomamos el mensaje del evento y lo pasamos a la devolución de llamada.
exports.handler = (event, context, callback) => {
let message = event.message;
callback(null, message);
};
Ahora, guarde los cambios en Lambda y presione la URL para ver los cambios. Observe la captura de pantalla que se muestra a continuación:
Haga clic en la URL como se muestra a continuación:
https://rw2ek1xung.execute-api.us-east-
1.amazonaws.com/prod/hello?message=hello%20from%20api%20gateway
Observe que aquí estamos pasando un mensaje como una cadena de consulta a la URL GET. Entonces puede observar la salida como se muestra a continuación:
Lee los detalles enviados al mensaje desde la URL y los muestra en el navegador.
Uso de la función Lambda con Amazon S3
El servicio Amazon S3 se utiliza para el almacenamiento de archivos, donde puede cargar o eliminar archivos. Podemos activar AWS Lambda en S3 cuando se cargan archivos en los depósitos de S3. AWS Lambda tiene una función de controlador que actúa como punto de partida para la función de AWS Lambda. El manejador tiene los detalles de los eventos. En este capítulo, veamos cómo usar AWS S3 para activar la función AWS Lambda cuando cargamos archivos en el bucket de S3.
Pasos para usar la función AWS Lambda con Amazon S3
Para comenzar a usar AWS Lambda con Amazon S3, necesitamos lo siguiente:
- Crear segmento S3
- Crear rol que tenga permiso para trabajar con s3 y lambda
- Cree la función lambda y agregue s3 como disparador.
Ejemplo
Veamos estos pasos con la ayuda de un ejemplo que muestra la interacción básica entre Amazon S3 y AWS Lambda.
El usuario cargará un archivo en el depósito de Amazon S3
Una vez que se carga el archivo, activará la función AWS Lambda en segundo plano que mostrará una salida en forma de un mensaje de consola que indica que el archivo está cargado.
El usuario podrá ver el mensaje en los registros de Cloudwatch una vez que se cargue el archivo.
El diagrama de bloques que explica el flujo del ejemplo se muestra aquí:
Creación de un bucket de S3
Comencemos primero creando un bucket de s3 en la consola de AWS siguiendo los pasos que se indican a continuación:
Paso 1
Vaya a los servicios de Amazon y haga clic en S3 en la sección de almacenamiento como se destaca en la imagen que se muestra a continuación:
Paso 2
Haga clic en Almacenamiento S3 y Create bucket que almacenará los archivos cargados.
Paso 3
Una vez que haces clic Create bucket , puede ver una pantalla de la siguiente manera:
Etapa 4
Ingrese los detalles Bucket name, Select the Region y haga clic en Createbotón en la parte inferior izquierda. Por lo tanto, hemos creado un cubo con el nombre:workingwithlambdaands3.
Paso 5
Ahora, haga clic en el nombre del depósito y le pedirá que cargue archivos como se muestra a continuación:
Por lo tanto, hemos terminado con la creación de cubos en S3.
Crear rol que funcione con S3 y Lambda
Para crear un rol que funcione con S3 y Lambda, siga los pasos que se indican a continuación:
Paso 1
Vaya a los servicios de AWS y seleccione IAM como se muestra a continuación:
Paso 2
Ahora, haga clic en IAM -> Roles como se muestra a continuación -
Paso 3
Ahora, haga clic en Create roley elija los servicios que utilizarán este rol. Seleccione Lambda y haga clic enPermission botón.
Etapa 4
Agregue el permiso desde abajo y haga clic en Review.
Paso 5
Observe que hemos elegido los siguientes permisos:
Observe que las Políticas que hemos seleccionado son AmazonS3FullAccess, AWSLambdaFullAccess y CloudWatchFullAccess.
Paso 6
Ahora, ingrese el nombre del rol, la descripción del rol y haga clic en Create Role botón en la parte inferior.
Por lo tanto, nuestro rol llamado lambdawiths3service es creado.
Crear función Lambda y agregar disparador S3
En esta sección, veamos cómo crear una función Lambda y agregarle un disparador S3. Para este propósito, deberá seguir los pasos que se detallan a continuación:
Paso 1
Vaya a Servicios de AWS y seleccione Lambda como se muestra a continuación:
Paso 2
Hacer clic Lambda y siga el proceso para agregar Name. Elegir elRuntime, Roleetc. y cree la función. La función Lambda que hemos creado se muestra en la siguiente captura de pantalla:
Paso 3
Ahora agreguemos el disparador S3.
Etapa 4
Elija el disparador de arriba y agregue los detalles como se muestra a continuación:
Paso 5
Seleccione el depósito creado desde el menú desplegable de depósitos. El tipo de evento tiene los siguientes detalles:
Seleccione Object Created (All), ya que necesitamos el disparador AWS Lambda cuando el archivo se carga, se elimina, etc.
Paso 6
Puede agregar el patrón de prefijo y archivo que se utilizan para filtrar los archivos agregados. Por ejemplo, para activar lambda solo para imágenes .jpg. Dejémoslo en blanco por ahora, ya que necesitamos activar Lambda para todos los archivos cargados. Hacer clicAdd para agregar el disparador.
Paso 7
Puede encontrar la pantalla de activación de la función Lambda como se muestra a continuación:
Agreguemos los detalles de la función lambda aws. Aquí, usaremos el editor en línea para agregar nuestro código y usaremos nodejs como entorno de ejecución.
Paso 8
Para activar S3 con AWS Lambda, tendremos que usar el evento S3 en el código como se muestra a continuación:
exports.handler = function(event, context, callback) {
console.log("Incoming Event: ", event);
const bucket = event.Records[0].s3.bucket.name;
const filename = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
const message = `File is uploaded in - ${bucket} -> ${filename}`;
console.log(message);
callback(null, message);
};
Tenga en cuenta que el parámetro de evento tiene los detalles del S3event. Hemos consolado el nombre del depósito y el nombre del archivo que se registrará cuando cargue la imagen en S3bucket.
Paso 9
Ahora, guardemos los cambios y probemos la función lambda con S3upload. Los siguientes son los detalles del código agregados en AWS Lambda:
Paso 10
Ahora, agreguemos el rol, la memoria y el tiempo de espera.
Paso 11
Ahora, guarde la función Lambda. Abra S3 de los servicios de Amazon y abra el depósito que creamos anteriormente, a saberworkingwithlambdaands3.
Sube la imagen como se muestra a continuación:
Paso 12
Hacer clic Upload botón para agregar archivos como se muestra -
Paso 13
Hacer clic Add filespara agregar archivos. También puede arrastrar y soltar los archivos. Ahora, haga clic enUpload botón.
Por lo tanto, hemos subido una imagen a nuestro depósito de S3.
Paso 14
Para ver los detalles del disparador, vaya al servicio de AWS y seleccione CloudWatch. Abra los registros de la función Lambda y use el siguiente código:
exports.handler = function(event, context, callback) {
console.log("Incoming Event: ", event);
const bucket = event.Records[0].s3.bucket.name;
const filename = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
const message = `File is uploaded in - ${bucket} -> ${filename}`;
console.log(message);
callback(null, message);
};
La salida que puede observar en Cloudwatch es como se muestra:
La función AWS Lambda se activa cuando el archivo se carga en el bucket de S3 y los detalles se registran en Cloudwatch como se muestra a continuación:
Uso de la función Lambda con Amazon DynamoDB
DynamoDB puede activar AWS Lambda cuando los datos se agregan a las tablas, se actualizan o eliminan. En este capítulo, trabajaremos en un ejemplo simple que agregará elementos a la tabla DynamoDB y AWS Lambda que leerá los datos y enviará correo con los datos agregados.
Requisitos
Para utilizar Amazon DB y AWS Lambda, debemos seguir los pasos que se muestran a continuación:
Cree una tabla en DynamoDB con clave principal
Cree un rol que tendrá permiso para trabajar con DynamoDBand AWS Lambda.
Crear función en AWS Lambda
AWS Lambda Trigger para enviar correo
Agregar datos en DynamoDB
Analicemos cada uno de estos pasos en detalle.
Ejemplo
Vamos a trabajar en el siguiente ejemplo que muestra la interacción básica entre DynamoDB y AWS Lambda. Este ejemplo le ayudará a comprender las siguientes operaciones:
Crear una tabla llamada cliente en la tabla Dynamodb y cómo ingresar datos en esa tabla.
Activación de la función AWS Lambda una vez que se ingresan los datos y envío de correo mediante el servicio Amazon SES.
El diagrama de bloques básico que explica el flujo del ejemplo es el que se muestra a continuación:
Crear tabla en DynamoDB con clave principal
Inicie sesión en la consola de AWS. Vaya a Servicios de AWS y seleccione DynamoDB como se muestra a continuación. Seleccione DynamoDB.
DynamoDB muestra las opciones como se muestra a continuación:
Ahora, haga clic en Create tablepara crear la tabla como se muestra. Hemos nombrado la tabla comocustomer con la clave principal para esa tabla como cust_id. Haga clic enCreate para agregar la tabla a dynamodb.
La tabla creada es la que se muestra a continuación:
Podemos agregar elementos a la tabla creada de la siguiente manera:
Hacer clic Items y haga clic en Create item botón como se muestra -
Creación de roles con permisos para trabajar con DynamoDB y AWS Lambda
Para crear un rol, vaya a los servicios de AWS y haga clic en IAM.
Creemos una política que se utilizará solo para la tabla de DynamoDB creada anteriormente:
Ahora, elija un Service. Observe que el servicio que hemos seleccionado esDynamoDB. porActions nos hemos llevado todo Dynamodbacciones, es decir, acceso a la lista, lectura y escritura. porresources, seleccionaremos las acciones del tipo de recurso de tabla. Cuando hace clic en él, puede ver una pantalla de la siguiente manera:
Ahora, seleccione table y Add ARNa él como se muestra. ObtendremosARN detalles de customer table creado como se muestra a continuación -
Entrar arn detalles aquí -
Hacer clic Addpara guardar los cambios. Una vez hechoClick on Review policy. Ingrese el nombre de la política, descripción, etc., como se muestra a continuación:
Haga clic en create policypara salvarlo. Agregue la política al rol que se creará. SeleccioneRole desde el lado izquierdo e ingrese los detalles.
Observe que las políticas agregadas son newpolicyfordynamdb, awslambdafullaccess, cloudwatchfullaccess y amazonsesfullaccess. Agregue el rol y lo usará mientras crea la función AWS Lambda.
Crear función en AWS Lambda
Por lo tanto, hemos creado la función Lambda llamada newlambdafordynamodb como se muestra.
Ahora, agreguemos el disparador DynamodDB al AWS Lambda creado. El tiempo de ejecución que usaremos es Node.js.
Puede encontrar los siguientes detalles en el activador de Dynamodb que se configurarán para AWS Lambda:
Ahora, simplemente haga clic Add para agregar el disparador a AWS Lambda.
Activador de AWS Lambda para enviar correo
AWS Lambda se activará cuando se inserten datos en AWS Lambda. El parámetro de evento tendrá los datos de dynamodb insertados. Esto leerá los datos del evento y enviará un correo electrónico.
Enviando un correo electrónico
Para enviar un correo electrónico, debe seguir los pasos que se indican a continuación:
Paso 1
Vaya al servicio AWS y seleccione SES (servicio de correo electrónico simple). Valide el correo electrónico al que necesitamos enviar un correo electrónico como se muestra:
Paso 2
Haga clic en el botón Verify a New Email Address para agregar la dirección de correo electrónico.
Paso 3
Ingrese una dirección de correo electrónico para verificarla. La dirección de correo electrónico recibirá un correo de activación de Amazon en el que se debe hacer clic. Una vez realizada la activación, se verifica la identificación del correo electrónico y se puede utilizar con los servicios de AWS.
Etapa 4
El código AWS Lambda que lee los datos del evento y envía el correo electrónico se muestra a continuación:
var aws = require('aws-sdk');
var ses = new aws.SES({
region: 'us-east-1'
});
exports.handler = function(event, context, callback) {
console.log(event);
let tabledetails = JSON.parse(JSON.stringify(event.Records[0].dynamodb));
console.log(tabledetails.NewImage.address.S);
let customerid = tabledetails.NewImage.cust_id.S;
let name = tabledetails.NewImage.name.S;
let address = tabledetails.NewImage.address.S;
var eParams = {
Destination: {
ToAddresses: ["[email protected]"]
},
Message: {
Body: {
Text: {
Data: "The data added is as follows:\n CustomerId:"+customerid+"\n Name:"+name+"\nAddress:"+address
}
},
Subject: {
Data: "Data Inserted in Dynamodb table customer"
}
},
Source: "[email protected]"
};
console.log('===SENDING EMAIL===');
var email = ses.sendEmail(eParams, function(err, data) {
if (err) console.log(err);
else {
console.log("===EMAIL SENT===");
console.log("EMAIL CODE END");
console.log('EMAIL: ', email);
context.succeed(event);
callback(null, "email is send");
}
});
}
Ahora, guarde la función Lambda y los datos en la tabla DynamoDB.
Agregar datos en DynamoDB
Utilice la siguiente secuencia para agregar datos en DynamoDB.
Paso 1
Ir a la mesa customer creado en Dynamodb.
Paso 2
Hacer clic Create item.
Paso 3
Hacer clic Save y compruebe la identificación de correo electrónico proporcionada en AWS Lambda para ver si AWS Lambda ha enviado el correo.
Uso de la función Lambda con eventos programados
Se supone que los eventos programados suceden a intervalos regulares según un conjunto de reglas. Los eventos programados se utilizan para ejecutar la función Lambda después de un intervalo que se define en los servicios de observación en la nube. Se utilizan mejor para trabajar en trabajos cron junto con AWS Lambda. Este capítulo explicará con un ejemplo sencillo cómo enviar correo después de cada 5 minutos utilizando eventos programados y AWS Lambda.
Requisitos
Los requisitos para utilizar la función Lambda con eventos programados son los siguientes:
- Verifique la identificación del correo electrónico con AWS SES
- Crear rol para usar AWS SES, Cloudwatch y AWS Lambda
- Crear función Lambda para enviar correo electrónico
- Agregar regla para eventos programados desde AWS CloudWatch
Ejemplo
El ejemplo que vamos a considerar agregará el evento CloudWatch a la función AWS Lambda. Cloudwatch activará AWS Lambda según el patrón de tiempo adjunto. Por ejemplo, en el siguiente ejemplo, hemos utilizado 5 minutos como disparador. Significa que por cada 5 minutos, AWS Lambda se activará y AWS Lambda enviará correo siempre que se active.
El diagrama de bloques básico para el mismo se muestra a continuación:
Verificar el ID de correo electrónico con AWS SES
Inicie sesión en AWS y vaya al servicio AWS SES como se muestra a continuación:
Ahora, haga clic en Simple Email Servicio como se muestra -
Hacer clic Email Addresses en el lado izquierdo como se muestra -
Muestra un botón Verify a New Email Address. Pinchalo.
Entrar Email Addressdesea verificar. Hacer clicVerify This Email Addressbotón. Recibirá correo de AWS en esa identificación de correo electrónico con el asunto del correo electrónico: Amazon Web Services - Solicitud de verificación de dirección de correo electrónico en la región Este de EE. UU. (Norte de Virginia)
Haga clic en el enlace proporcionado en el correo para verificar la dirección de correo electrónico. Una vez verificado, mostrará la identificación de correo electrónico de la siguiente manera:
Crear rol para usar AWS SES, Cloudwatch y AWS Lambda
También puede crear un rol que otorgue permiso para utilizar los servicios. Para ello, vaya a IAM y seleccione Rol. Agregue las políticas necesarias y cree el rol. Observe que el rol creado aquí esevents with lambda.
Crear función Lambda para enviar correo electrónico
Deberá seguir los pasos para crear la función Lambda utilizando el tiempo de ejecución como nodejs.
Ahora, agregue el disparador a Lambda como se muestra:
Agregar detalles a CloudWatch Events Trigger como se muestra a continuación -
Tenga en cuenta que el evento se activará cada 5 minutos según el activador de regla creado.
El código Lambda para enviar un correo electrónico se proporciona a continuación:
var aws = require('aws-sdk');
var ses = new aws.SES({
region: 'us-east-1'
});
exports.handler = function(event, context, callback) {
var eParams = {
Destination: {
ToAddresses: ["[email protected]"]
},
Message: {
Body: {
Text: {
Data: "this mail comes from aws lambda event scheduling"
}
},
Subject: {
Data: "Event scheduling from aws lambda"
}
},
Source: "[email protected]"
};
console.log('===SENDING EMAIL===');
var email = ses.sendEmail(eParams, function(err, data) {
if (err) console.log(err);
else {
console.log("===EMAIL SENT===");
console.log("EMAIL CODE END");
console.log('EMAIL: ', email);
context.succeed(event);
callback(null, "email is send");
}
});
};
Ahora, necesitamos el servicio AWS SES. Puede agregar esto usando el código que se muestra a continuación:
var aws = require('aws-sdk');
var ses = new aws.SES({
region: 'us-east-1'
});
Para enviar correo desde nodejs, hemos creado eParams objeto que tiene detalles como el example mail, to mail id y the body with message como sigue -
var eParams = {
Destination: {
ToAddresses: ["[email protected]"]
},
Message: {
Body: {
Text: {
Data: "this mail comes from aws lambda event scheduling"
}
},
Subject: {
Data: "Event scheduling from aws lambda"
}
},
Source: "[email protected]"
};
El código Lambda para enviar correo electrónico es el siguiente:
var email = ses.sendEmail(eParams, function(err, data) {
if (err) console.log(err);
else {
console.log("===EMAIL SENT===");
console.log("EMAIL CODE END");
console.log('EMAIL: ', email);
context.succeed(event);
callback(null, "email is send");
}
});
Ahora, guardemos esta función Lambda y verifiquemos la identificación del correo electrónico para ver si hay correos. La captura de pantalla que se muestra a continuación muestra que el correo se envía desde AWS Lambda cada 5 minutos.
Uso de la función Lambda con Amazon SNS
Amazon SNS es un servicio que se utiliza para notificaciones push. En este capítulo, explicaremos el funcionamiento de AWS Lambda y Amazon SNS con la ayuda de un ejemplo donde se realizarán las siguientes acciones:
Crear tema en el servicio SNS y usar AWS Lambda Agregar temas a CloudWatch
Envíe un mensaje de texto SNS al número de teléfono proporcionado.
Requisitos
Para crear un tema en el servicio SNS y usar AWS Lambda Agregar temas a CloudWatch, no es necesario que siga los pasos que se indican a continuación:
- Crear tema en SNS
- Crear función para obtener permiso en IAM
- Crear función AWS Lambda
- Publicar en el tema para activar el disparador
- Verifique los detalles del mensaje en el servicio CloudWatch.
Para enviar un mensaje de texto SNS en el número de teléfono proporcionado, debemos hacer lo siguiente:
- Agregue código en AWS Lambda para enviar un mensaje a su teléfono.
Ejemplo
En este ejemplo, crearemos un tema en SNS. Cuando se ingresan detalles en el tema para publicar, se activa AWS Lambda. Los detalles del tema se registran en CloudWatch y AWS Lambda envía un mensaje por teléfono.
Aquí hay un diagrama de bloques básico que explica lo mismo:
Crear tema en SNS
Tendrá que seguir los pasos que se indican a continuación para crear un tema en SNS:
Paso 1
Inicie sesión en la consola de AWS y vaya al servicio SNS en Amazon como se muestra a continuación:
Paso 2
Hacer clic Simple Notification Servicio y Create topic en eso.
Paso 3
Entonces, tienes que hacer clic Create new topic botón como se muestra -
Etapa 4
Introducir el Topic name y Display name y haga clic en Create topic. Debería ver el nombre del tema en la pantalla de la siguiente manera:
Crear rol para permisos en IAM
Para crear un rol que funcione con AWS Lambda y el servicio SNS, debemos iniciar sesión en la consola de AWS. Luego, seleccione IAM de los servicios de Amazon y haga clic en rol en el lado izquierdo como se muestra a continuación.
Observe que hemos agregado políticas para SNS, Lambda y CloudWatch. Agregue el nombre del rol y haga clic en el botón Crear rol para completar el proceso de creación del rol.
Crear función AWS Lambda
En esta sección, comprendamos cómo crear la función AWS Lambda utilizando nodejs como tiempo de ejecución.
Para ello, inicie sesión en la consola de AWS y elija AWS Lambda en los servicios de AWS. Agregue el nombre de la función, los detalles del rol, etc. y cree la función AWS Lambda como se muestra.
Agregar activador de SNS
Para agregar un activador de SNS, ingrese los detalles de configuración de SNS como se muestra:
Luego, seleccione SNS topic y Add el disparador de la función AWS Lambda como se muestra -
Luego, agregue el código lambda de AWS que se indica a continuación:
exports.handler = function(event, context, callback) {
console.log("AWS lambda and SNS trigger ");
console.log(event);
const sns = event.Records[0].Sns.Message;
console.log(sns)
callback(null, sns);
};
En el código anterior, event.Records[0].Sns.Messageda los detalles del mensaje agregado. Hemos agregado registros de la consola para verlos en CloudWatch. Ahora, guarde la función Lambda con la memoria necesaria y la asignación de tiempo.
Publicar en tema para activar el activador
Recuerde que ya hemos creado el tema en SNS en el Paso 1. Ahora publicaremos en el tema y veremos los detalles en CloudWatch que serán activados por AWS Lambda -
Publicar en tema
Primero, seleccione el nombre del tema que desea publicar. Haga clic enPublish to topic botón -
Introducir el Subject y Message detalles como se muestra a continuación -
También puede seleccionar JSON formato de mensaje para enviar JSONestilo. Hacer clicPublish the message botón al final de la pantalla.
Verifique los detalles del mensaje en el servicio CloudWatch
Inicie sesión en la consola AWS y abra el servicio CloudWatch. Haga clic en los registros del lado izquierdo y seleccione los registros para la función AWS Lambda creada. Puede encontrar la siguiente pantalla para los registros con mensajes creados como se muestra arriba:
Agregue código en AWS Lambda para enviar un mensaje a su teléfono
Aquí usará la mensajería de texto SNS para enviar mensajes en el teléfono usando AWS Lambda. Puede utilizar el siguiente código para actualizar el código de AWS Lambda de la siguiente manera:
const aws = require("aws-sdk");
const sns = new aws.SNS({
region:'us-east-1'
});
exports.handler = function(event, context, callback) {
console.log("AWS lambda and SNS trigger ");
console.log(event);
const snsmessage = event.Records[0].Sns.Message;
console.log(snsmessage);
sns.publish({
Message: snsmessage,
PhoneNumber: '+911212121212'
}, function (err, data) {
if (err) {
console.log(err);
callback(err, null);
} else {
console.log(data);
callback(null, data);
}
});
};
Hemos agregado AWS SDK y el servicio SNS para usar para enviar mensajes. El mensaje del evento proveniente de SNS se envía como mensaje de texto al número de teléfono proporcionado.
Observe el siguiente código, por ejemplo:
sns.publish({
Message: snsmessage,
PhoneNumber: '+911212121212'
}, function (err, data) {
if (err) {
console.log(err);
callback(err, null);
} else {
console.log(data);
callback(null, data);
}
});
Ingrese el tema ahora para ver el mensaje en Cloudwatch y el número de teléfono proporcionado anteriormente.
Hacer clic Publish messagepara publicar el mensaje. Verá un mensaje en el número de teléfono que se indica a continuación:
Uso de la función Lambda con CloudTrail
AWS CloudTrailes un servicio disponible con Amazon, que ayuda a registrar todas las actividades realizadas dentro de la consola de AWS. Registra todas las llamadas a la API y almacena el historial, que se puede utilizar más tarde con fines de depuración. Tenga en cuenta que no podemos activar Lambda desde CloudTrail. En cambio, CloudTrail almacena todo el historial en forma de registros en el bucket de S3 y podemos activar AWS Lambda desde S3. Una vez que se procesen los registros, AWS Lambda se activará cada vez que se agreguen registros al bucket de S3.
Requisitos
Antes de comenzar a trabajar con AWS CloudTrail, S3 y AWS Lambda, debe realizar lo siguiente:
- Cree un depósito de S3 para almacenar registros de CloudTrail
- Crear servicio SNS
- Cree una ruta en CloudTrail y asigne el depósito S3 y el servicio SNS
- Cree un rol de IAM con permiso.
- Crear función lambda aws
- Configuración de AWS Lambda
Ejemplo
Consideremos un ejemplo que muestra el funcionamiento de AWS CloudTrail, S3 y AWS Lambda. Aquí, crearemos un depósito en S3 que almacenará todos los registros para cualquier interacción realizada en la consola de AWS. Creemos un tema de SNS y publíquelo. Para esta acción, los registros se ingresarán como un archivo en S3. Se activará AWS lambda, que enviará correo mediante el servicio Amazon SES.
El diagrama de bloques para explicar este proceso es el que se muestra a continuación:
Crear un depósito de S3 para almacenar registros de CloudTrail
Vaya a la consola de AWS y haga clic en el servicio S3. Hacer clicCreate bucket e ingrese el nombre del depósito que desea almacenar los registros de CloudTrail como se muestra:
Observa que aquí hemos creado un bucket de S3 cloudtraillogsaws para almacenar los registros.
Crear servicio SNS
Vaya a la consola de AWS y haga clic en Simple notification Service. Seleccione los temas del lado izquierdo y haga clic en el botón Crear nuevo tema.
Hemos creado un tema llamado displaytrailpublicar un tema. Sus detalles se almacenarán en S3bucket que se creó anteriormente.
Cree una ruta en Cloudtrail y asigne el depósito S3 y el servicio SNS
Vaya a la consola de AWS y haga clic en CloudTrail servicio de las herramientas de gestión como se muestra -
Hacer clic Trails desde el lado izquierdo como se muestra a continuación -
Hacer clic Create Trailbotón. Introducir elTrail name, Apply trail to all regions y elige Yes. Entonces, los registros se aplicarán para toda la región.
por Read/Write events, escoger All. Añade elS3 bucket y SNS topicdetalles como se muestra a continuación. Puede crear uno nuevo aquí o agregar uno existente.
Tenga en cuenta que hay opciones disponibles para encrypt log files, enable log file validation, send sns notification for every log file deliveryetc. He usado los valores predeterminados aquí. Puede permitir el cifrado de archivos y le pedirá una clave de cifrado. Haga clic en el botón Crear ruta una vez que se agreguen los detalles.
Crear función de IAM con permiso
Vaya a la consola de AWS y seleccione IAM. Cree un rol con permiso para S3, Lambda, CloudTrail y SES para enviar correo electrónico. El rol creado es el que se muestra a continuación:
Crear función AWS Lambda
Vaya al servicio de AWS y haga clic en LambdaServicio. Agregue el nombre de la función, seleccione tiempo de ejecución comonodejsy seleccione el rol creado para la función lambda. A continuación se crea la función lambda.
Configuración de AWS Lambda
A continuación, debemos agregar S3 como disparador para AWS lambda creado.
Agregue los detalles del bucket de S3 para agregar el activador y agregue el siguiente código AWS Lambda:
const aws = require("aws-sdk");
const sns = new aws.SNS({
region:'us-east-1'
});
var ses = new aws.SES({
region: 'us-east-1'
});
exports.handler = function(event, context, callback) {
console.log("AWS lambda and SNS trigger ");
console.log(event);
const s3message = "Bucket Name:"+event.Records[0].s3.bucket.name+"\nLog details:"+event.Records[0].s3.object.key;
console.log(s3message);
var eParams = {
Destination: {
ToAddresses: ["[email protected]"]
},
Message: {
Body: {
Text: {
Data:s3message
}
},
Subject: {
Data: "cloudtrail logs"
}
},
Source: "[email protected]"
};
var email = ses.sendEmail(eParams, function(err, data) {
if (err) console.log(err);
else {
console.log("===EMAIL SENT===");
console.log("EMAIL CODE END");
console.log('EMAIL: ', email);
context.succeed(event);
callback(null, "email is send");
}
});
};
Tenga en cuenta que estamos tomando el depósito de S3 y los detalles del registro del evento y enviando correo utilizando el servicio SES como se muestra arriba.
Siempre que se lleve a cabo alguna actividad en la consola de AWS, los registros se enviarán al bucket de S3 y, al mismo tiempo, se activará AWS lambda y el correo se enviará a la identificación de correo electrónico mencionada en el código.
Tenga en cuenta que puede procesar los registros según sus necesidades en AWS Lambda.
Uso de la función Lambda con Amazon Kinesis
AWS KinesisEl servicio se utiliza para capturar / almacenar datos de seguimiento en tiempo real provenientes de clics en sitios web, registros y feeds de redes sociales. Podemos activar AWS Lambda para que realice un procesamiento adicional en estos registros.
Requisitos
Los requisitos básicos para comenzar con Kinesis y AWS Lambda son los siguientes:
- Crear rol con los permisos necesarios
- Crear flujo de datos en Kinesis
- Cree la función AWS Lambda.
- Agregar código a AWS Lambda
- Agregar datos al flujo de datos de Kinesis
Ejemplo
Trabajemos en un ejemplo en el que activaremos AWS Lambda para procesar el flujo de datos de Kinesis y enviar correo con los datos recibidos.
A continuación se muestra un diagrama de bloques simple para explicar el proceso:
Crear rol con los permisos necesarios
Vaya a la consola de AWS y cree un rol.
Crear flujo de datos en Kinesis
Vaya a la consola de AWS y cree un flujo de datos en kinesis.
Hay 4 opciones como se muestra. Trabajaremos en Crear flujo de datos en este ejemplo.
Hacer clic Create data stream. Ingrese el nombre en el nombre del flujo de Kinesis que se indica a continuación.
Ingrese el número de fragmentos para el flujo de datos.
Los detalles de los fragmentos se muestran a continuación:
Ingrese el nombre y haga clic en el Create Kinesis stream botón en la parte inferior.
Tenga en cuenta que la transmisión tarda cierto tiempo en activarse.
Crear función AWS Lambda
Vaya a la consola de AWS y haga clic en Lambda. Cree la función AWS Lambda como se muestra:
Hacer clic Create functionbotón al final de la pantalla. Agregue Kinesis como disparador de AWS Lambda.
Agregue detalles de configuración al desencadenador de Kinesis:
Agregue el disparador y ahora agregue código a AWS Lambda.
Agregar código a AWS Lambda
Para este propósito, usaremos nodejs como tiempo de ejecución. Enviaremos correo una vez que AWS Lambda se active con el flujo de datos de kinesis.
const aws = require("aws-sdk");
var ses = new aws.SES({
region: 'us-east-1'
});
exports.handler = function(event, context, callback) {
let payload = "";
event.Records.forEach(function(record) {
// Kinesis data is base64 encoded so decode here
payload = new Buffer(record.kinesis.data, 'base64').toString('ascii');
console.log('Decoded payload:', payload);
});
var eParams = {
Destination: {
ToAddresses: ["[email protected]"]
},
Message: {
Body: {
Text: {
Data:payload
}
},
Subject: {
Data: "Kinesis data stream"
}
},
Source: "[email protected]"
};
var email = ses.sendEmail(eParams, function(err, data) {
if (err) console.log(err);
else {
console.log("===EMAIL SENT===");
console.log("EMAIL CODE END");
console.log('EMAIL: ', email);
context.succeed(event);
callback(null, "email is send");
}
});
};
El parámetro de evento tiene los datos ingresados en el flujo de datos de kinesis. El código lambda de AWS anterior se activará una vez que se ingresen los datos en el flujo de datos de kinesis.
Agregar datos a Kinesis Data Stream
Aquí usaremos AWS CLI para agregar el flujo de datos de kinesis de datos como se muestra a continuación. Para este propósito, podemos usar el siguiente comando:
aws kinesis put-record --stream-name kinesisdemo --data "hello world" --
partition-key "789675"
Luego, AWS Lambda se activa y se envía el correo.
Uso de la función Lambda con aplicaciones de usuario personalizadas
Podemos utilizar la función lambda de AWS para procesar el uso de eventos generados por la aplicación del usuario de las siguientes dos formas:
- Uso de la consola de AWS
- Uso de AWS CLI
Uso de la consola de AWS
Desde la consola de AWS, trabajaremos con eventos y AWS Lambda. Para ello, vaya a la consola de AWS y cree una función lambda.
A continuación, agreguemos el código para AWS Lambda:
exports.handler = (event, context, callback) => {
// TODO implement
console.log("Hello => "+ event.name);
console.log("Address =>"+ event.addr);
callback(null, 'Hello '+event.name +" and address is "+ event.addr);
};
Tenga en cuenta que en el código anterior, estamos imprimiendo el nombre y la dirección mediante evento.
Los detalles del evento se proporcionarán utilizando el evento de prueba creado de la siguiente manera:
Ahora, guarde el evento y pruébelo.
La salida de registro correspondiente se muestra aquí:
Uso de AWS CLI
Podemos invocar la función anterior utilizando AWS CLI de la siguiente manera:
aws lambda invoke --function-name "lambdauserevent" --log-type Tail --
payload file://C:\clioutput\input.txt C:\clioutput\outputfile.txt
Los detalles del evento se dan a la carga útil y la salida se almacena en C:\clioutput\outputfile.txt. como sigue -
input.txt
{"name":"Roy Singh", "addr":"Mumbai"}
Al invocar Lambda mediante AWS CLI, puede ver que el resultado es el siguiente:
Del mismo modo, en caso de que desee probar AWS Lambda para cualquier otro servicio de AWS, puede hacerlo mediante el evento de prueba en la consola de AWS y la AWS CLI. A continuación se muestra un evento de muestra para el servicio SNS:
{
"Records": [{
"EventVersion": "1.0",
"EventSubscriptionArn": "arnid",
"EventSource": "aws:sns",
"Sns": {
"SignatureVersion": "1",
"Timestamp": "1970-01-01T00:00:00.000Z",
"Signature": "EXAMPLE",
"SigningCertUrl": "EXAMPLE",
"MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
"Message": "Hello from SNS!",
"MessageAttributes": {
"Test": {
"Type": "String",
"Value": "TestString"
},
"TestBinary": {
"Type": "Binary",
"Value": "TestBinary"
}
},
"Type": "Notification",
"UnsubscribeUrl": "EXAMPLE",
"TopicArn": "topicarn",
"Subject": "TestInvoke"
}
}]
}
Agreguemos el evento de muestra que se muestra arriba y probémoslo como se muestra:
En AWS Lambda, el código imprimirá el mensaje SNS como se muestra en el ejemplo que se muestra a continuación:
exports.handler = (event, context, callback) => {
// TODO implement
console.log(event.Records[0].Sns.Message);
callback(null, event.Records[0].Sns.Message);};
Invoquemos lo mismo usando AWS CLI. Guardemos el evento en un archivo y usémoslo para la carga útil usando el comando que se muestra:
aws lambda invoke --function-name "lambdauserevent" --log-type Tail --
payload file://C:\clioutput\sns.txt C:\clioutput\snsoutput.txt
Uso de AWS Lambda @ Edge con CloudFront
Lambda @ Edge es una adición al servicio de cómputo AWS Lambda que se utiliza para personalizar el contenido que ofrece cloudfront.
El diagrama de bloques que muestra el funcionamiento de AWS Lambda con cloudfront de AWS se muestra a continuación:
Hay cuatro formas en las que se puede utilizar AWS Lambda:
Viewer Request − El usuario final realiza la solicitud llamada Solicitud de visor a CloudFront
Origin Request − CloudFront reenvía la solicitud al origen
Origin Response − CloudFront recibe la respuesta del origen
Viewer Response − CloudFront envía la respuesta al espectador
Podemos usar Lambda @ Edge para los siguientes propósitos:
Cambiar los encabezados a pedido y tiempo de respuesta.
Agregue detalles de cookies a los encabezados. Realice pruebas AB en función de la solicitud y la respuesta.
Redirija la URL a otro sitio, según los detalles del encabezado.
Podemos buscar el agente de usuario de los encabezados y averiguar los detalles del navegador, sistema operativo, etc.
Requisitos
Para comenzar a trabajar en CloudFront y Lambda @ Edge, necesitamos lo siguiente:
Cree un depósito de almacenamiento S3 con detalles de archivo
Cree un rol que permitirá el permiso para trabajar con CloudFront y Lambda @ Edge
Cree una distribución de CloudFront
Crear función lambda
Agregar detalles de la función lambda a cloudfront
Verifique la URL de Cloudfront en el navegador
Trabajaremos en un ejemplo con CloudFront y Lambda @ Egde, donde alojaremos la página y cambiaremos la respuesta cuando se detecte como escritorio y dispositivos.
Crear depósito de almacenamiento de S3 con detalles de archivo
Inicie sesión en la consola de AWS, cree un bucket en S3 y agregue el . html archivo que desea mostrar.
Haga clic en S3 y Create bucket como se muestra a continuación -
Ahora, haga clic en Create bucket y agregue los detalles del cubo como se muestra a continuación:
Haga clic en Create y cargue el .html en él.
Crear rol
Vaya a la consola de AWS y haga clic en IAM.
Ahora, haga clic en Roles -> Create role botón como se muestra -
Elija el permiso para S3, Lambda y Cloudfront. Es una buena práctica crear la política dando permiso solo a la función requerida, el almacenamiento, usando los detalles del ARN.
En el ejemplo que se analiza a continuación, mostramos el Full Accesspermiso. Políticas para el nombre del rolrole for cloudfrontse agrega como se muestra arriba. Haga clic en Crear rol.
Toda la política requerida para lambda @ edge y cloudfront se muestra arriba. Hay un paso adicional que debe realizarse aquí, ya que en caso de Cloudfront, la URL estará disponible en toda la región y necesita una relación de confianza entre los servicios que estamos utilizando.
Ahora, para el rol creado, haga clic en Trust relationships pestaña como se muestra -
Haga clic en Edit Trust Relationship como se muestra a continuación -
Muestra un documento de política. Necesitamos agregar los otros servicios en elPrincipal -> Serviceque estamos planeando utilizar. El documento final de la política de relación de confianza se muestra a continuación:
Hacer clic Update Trust Policy para guardar los cambios.
Crear distribución de CloudFront
Vaya al servicio CloudFront como se muestra a continuación:
Haga clic en el servicio CloudFront y haga clic en Create Distribution -
Configuración de origen, configuración de comportamiento y configuración de distribución
Echemos un vistazo a estos ajustes uno por uno:
Origin Settings
Varios parámetros de la configuración de origen se explican a continuación:
Origin Domain Name −Este es el nombre del bucket de S3 donde hemos almacenado los archivos html. También podemos almacenar imágenes, si las hay, en el depósito de S3 creando carpetas de nuestra elección.
Origin Path −Aquí debe ingresar el nombre de la carpeta donde se almacenan los archivos. Actualmente, no tenemos esta carpeta, por lo que la dejaremos en blanco por ahora.
Origin ID −Se completa cuando se selecciona el nombre de dominio de origen. Puede cambiar la identificación según su elección.
Restrict Bucket Access − En este, elegiremos la opción yes. Aquí necesitamos seguridad para el depósito S3 para que nadie tenga acceso al depósito S3. Para esta opción hay algunas opciones más pobladas comoOrigin Access Identity, Comment and Grant Read Permission on Bucket.
Origin Access Identity −Hemos utilizado crear una nueva opción de identidad. También puede elegir la identidad existente. Esto crea una nueva identidad que utiliza CloudFront para leer los detalles del depósito S3.
Grand Read Permission on Bucket − Para esto, elija la opción Yes.
Origin Custom Headers − Mantendremos los encabezados en blanco aquí, ya que no necesitamos los detalles en este momento.
A continuación, analicemos y completemos el Behaviour Settings para la distribución de Cloudront -
Ahora, seleccione el protocolo: https o http, y la opción de almacenamiento en caché. Tenga en cuenta que el almacenamiento en caché predeterminado es 86400 o 24 horas. Puede cambiar este valor según el requisito.
Hacer clic Object Caching(opción de personalización) para cambiar el almacenamiento en caché. Puedes usarsmooth streamingen caso de que haya algún video en su página. Aquí, mantenemos disponible la opción predeterminada. Una vez que se crea la función lambda, se agregarán sus detalles.
Los detalles de la configuración de distribución se muestran a continuación:
A continuación se explican varios parámetros de la configuración de distribución:
Price class −Tiene detalles como el origen del tráfico de usuarios. Tenga en cuenta que aquí hemos seleccionado el predeterminado:Use All Edge Locations.
AWS WAF Web ACL −Esto es para la selección de firewall de aplicaciones web. Aquí, tiene opción comoNone. Primero, necesitamos crear el firewall en AWS. Proporciona seguridad al sitio.
Alternate Domain Names − Aquí puede especificar el nombre de dominio si lo tiene.
SSL Certificate −Este tiene todos los detalles para ser seleccionado para el certificado SSL. Conservaremos los predeterminados.
Default Root Object −Aquí especificaremos el nombre del archivo que hemos subido en S3. Para esto, necesitamos que el contenido del .html se muestre por defecto.
Por lo demás, mantendremos la configuración predeterminada.
Hacer clic Create Distribution botón para agregar la distribución.
Tenga en cuenta que la distribución tardará algún tiempo en mostrar el estado como implementado.
Crear función AWS Lambda
Vaya a la consola de AWS y cree la función Lambda.
En el código de AWS Lambda, tomaremos los encabezados de solicitud y verificaremos el agente de usuario. Si el agente de usuario es de escritorio, cambiaremos la respuesta para mostrar el mensaje como“DESKTOP : Welcome to AWS Lambda with Cloudfront!” y si el dispositivo será“MOBILE DEVICES : Hello from Lambda@Edge!”
El código AWS Lambda correspondiente se muestra a continuación:
let content = `
<\!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Simple Lambda@Edge Static Content Response</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h1>MOBILE DEVICES : Hello from Lambda@Edge!</h1>
</body>
</html>
`;
let content1 = `
<\!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Simple Lambda@Edge Static Content Response</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h1>DESKTOP : Welcome to AWS Lambda with Cloudfront!</h1>
</body>
</html>
`;
exports.handler = (event, context, callback) => {
let request = event.Records[0].cf.request;
let finalrequest = JSON.stringify(request);
let headers = request.headers;
let useragent = JSON.stringify(headers["user-agent"][0].value);
let str = "";
if(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i.test(useragent)) {
str = content;
} else {
str = content1;
}
const response = {
status: '200',
statusDescription: 'OK',
body: str+useragent,
};
callback(null, response);
};
Ahora, guarde la función Lambda. Tenga en cuenta que debemos publicar la función Lambda para que se pueda usar con todas las regiones. Para publicar, debemos hacer lo siguiente:
En el menú desplegable Acciones, seleccione Publish new version como se muestra a continuación -
Si es usted, haga clic en Publish new version, muestra la siguiente pantalla -
Ahora, ingrese la descripción de la versión y haga clic en Publish. El ARN mostrará la versión de la función AWS Lambda creada como se muestra a continuación:
Agregue el disparador de CloudFront a la nueva versión creada como se muestra a continuación:
Ahora, agregue los detalles de configuración para CloudFront. El evento CloudFront tiene la opción deViewer request, Origin request, Origin responsey Viewer response.
A continuación, elija la distribución de CloudFront creada anteriormente. Desdeevents, seleccionaremos Viewer request. Según la solicitud del espectador, se decidirá el escritorio / dispositivo del agente de usuario y se cambiará la respuesta. A continuación, agregue los detalles del disparador.
Una vez que se agrega el disparador, debemos esperar a que se implemente la distribución de CloudFront.
Una vez que el estado cambia a Deployed, podemos probar la URL de CloudFront y verificar el nombre de dominio en el navegador.
La pantalla en el navegador de escritorio es como se muestra a continuación. Aquí hemos impreso el agente de usuario del evento de solicitud de espectador.
Esta es la pantalla en el dispositivo móvil.
Por lo tanto, en el ejemplo anterior, hemos utilizado Lambda @ Edge para cambiar la respuesta en el escritorio y el dispositivo móvil.
Monitoreo y resolución de problemas con Cloudwatch
Amazon CloudWatch supervisa las funciones creadas en AWS Lambda. Ayuda a registrar todas las solicitudes realizadas a la función Lambda cuando se activa.
Tenga en cuenta que el siguiente código se carga en AWS Lambda con el nombre de función como lambda and cloudwatch.
exports.handler = (event, context, callback) => {
// TODO implement
console.log("Lambda monitoring using amazon cloudwatch");
callback(null, 'Hello from Lambda');
};
Cuando la función se prueba o se activa, debería ver una entrada en Cloudwatch. Para ello, vaya a los servicios de AWS y haga clic en CloudWatch.
Seleccione los registros del lado izquierdo.
Cuando haces clic Logs, tiene el Log Groupsde la función AWS Lambda creada en su cuenta. Seleccione cualquier función AWS Lambda y verifique los detalles. Aquí, nos referimos a la función Lambda con nombre:lambdaandcloudwatch. Los registros agregados a la función Lambda se muestran aquí como se muestra a continuación:
Ahora, agreguemos el disparador S3 a la función Lambda y veamos los detalles de los registros en CloudWatch como se muestra a continuación:
Actualicemos el código de AWS Lambda para mostrar el archivo cargado y el nombre del depósito como se muestra en el código que se proporciona a continuación:
exports.handler = (event, context, callback) => {
// TODO implement
console.log("Lambda monitoring using amazon cloudwatch");
const bucket = event.Records[0].s3.bucket.name;
const filename = event.Records[0].s3.object.key;
const message = `File is uploaded in - ${bucket} -> ${filename}`;
console.log(message);
callback(null, 'Hello from Lambda');
};
Ahora, agregue el archivo en s3storetestlambdaEventbucket como se muestra -
Cuando se carga el archivo, las funciones de AWS Lambda se activan y los mensajes de registro de la consola del código Lambda se muestran en CloudWatch como se muestra a continuación:
Si hay algún error, CloudWatch proporciona los detalles del error como se muestra a continuación:
Tenga en cuenta que nos hemos referido al nombre del depósito de forma incorrecta en el código AWS Lambda como se muestra:
exports.handler = (event, context, callback) => {
// TODO implement
console.log("Lambda monitoring using amazon cloudwatch");
const bucket = event.Records[0].bucket.name;
const filename = event.Records[0].s3.object.key;
const message = `File is uploaded in - ${bucket} -> ${filename}`;
console.log(message);
callback(null, 'Hello from Lambda');
};
La referencia del nombre del depósito del evento es incorrecta. Por lo tanto, deberíamos ver un error que se muestra en CloudWatch como se muestra a continuación:
Métricas de CloudWatch
Los detalles de la ejecución de la función Lambda se pueden ver en las métricas. Hacer clicMetrics mostrado en el lado izquierdo.
Los detalles del gráfico para la función lambda lambdaandcloudwatch son como se muestra a continuación -
Proporciona detalles como la duración durante la cual se ejecuta la función Lambda, la cantidad de veces que se invoca y los errores de la función Lambda.
AWS Lambda: ejemplo adicional
Hasta ahora, hemos visto funcionar AWS Lambda con los servicios de AWS. Basándonos en ese conocimiento, creemos un formulario de registro de usuario simple y publiquemos los datos utilizando la puerta de enlace API en AWS Lambda. AWS Lambda obtendrá los datos del evento o del activador de la puerta de enlace de la API y agregará esos detalles a la tabla de DynamoDB.
Ejemplo
Consideremos un ejemplo y realicemos las siguientes funcionalidades en él:
Crear tabla de DynamoDB
Crear formulario para registro de usuario
Cree AWS Lambda y una puerta de enlace de API para enviar mensajes al teléfono mediante el servicio AWS SNS
Cree AWS Lambda y API gateway para POST datos de formularios e insértelos en la tabla de DynamoDb
Cree AWS Lambda y API gateway para leer datos de la tabla Dynamodb
Trabajo final del formulario de registro de usuario
Crear tabla de DynamoDB
Los datos ingresados se almacenarán en la tabla DynamodDB. Usaremos la puerta de enlace API para compartir los datos ingresados con AWS Lambda y luego AWS Lambda agregará los detalles en DynamoDB.
Puede utilizar los siguientes detalles para crear la tabla DynamodDB en la consola de AWS. Primero, vaya a AWS Service y haga clic enDynamoDB. Hacer clicTable para crear la tabla como se muestra a continuación -
Puede usar el ARN para crear una política para que DynamoDB se use con AWS Lambda.
Vaya a IAM y seleccione Policies. Hacer clicCreate policy, elija el servicio como DynamodDB como se muestra a continuación -
Hacer clic All DynamoDBacciones como se muestra arriba. Elija el recurso e ingrese el ARN para la tabla como se muestra a continuación:
Ahora, haga clic en Add Como se muestra abajo.
Si hace clic en Review policy al final de la pantalla, puede ver la siguiente ventana:
Ingrese el nombre de la política y haga clic en Create policybotón al final de la página. Ahora, necesitamos crear un rol para usar con Lambda. Necesitamos permisos para DynamoDB, APIGateway y Lambda.
Vaya a los servicios de AWS y seleccione IAM. Seleccione Roles en el lado izquierdo y agregue los roles requeridos.
Ingrese el nombre del rol y haga clic en Create role. The role created is roleforlambdaexample.
Create Form for User Registration
Here is the display of the user registration form to enter and to read the data from the dynamodb table.
Create AWS Lambda and API Gateway to Send OTP Message to Phone using SNS service
If you see the user registration form, there is a button validate phone. User is suppose to enter phone number and click on validate phone button to validate the phone number.
For this purpose −
When a user clicks this button, the API gateway post method which contains the phone details is called and internally AWS Lambda is triggered.
Then, AWS Lambda sendsOTP to the phone number entered using AWS SNS service.
The user receives the OTP and has to enter thisOTP number.
The textbox to enter OTP will appear when the phone number is entered and validate phone button is clicked.
The OTP received from AWS Lambda and the OTP entered by the user has to match, to allow the user to submit the user registration form.
A simple block diagram that explains the working of phone validation is shown here −
The AWS Lambda function created is as shown here −
The corresponding AWS Lambda code is as given below −
const aws = require("aws-sdk");
const sns = new aws.SNS({
region:'us-east-1'
});
exports.handler = function(event, context, callback) {
let phoneno = event.mphone;
let otp = Math.floor(100000 + Math.random() * 900000);
let snsmessage = "Your otp is : "+otp;
sns.publish({
Message: snsmessage,
PhoneNumber: "+91"+phoneno
}, function (err, data) {
if (err) {
console.log(err);
callback(err, null);
} else {
console.log(data);
callback(null, otp);
}
});
};
Note that we are using SNS service to send the OTP code. This code is used to validate the mobile number entered by the user in the user registration form. The API gateway created for above phone validation is as follows −
The Lambda function given is phonevalidationexample. We are taking the mobile phone details here to be used inside AWS Lambda. Then, AWS Lambda will send the OTP code to the given mobile number.
Create AWS Lambda and API Gateway to POST Form Data and Insert in DynamoDB Table
For user registration form, all the fields are mandatory. There is anAJAX call made wherein the data entered in the form is posted to the API Gateway URL.
A simple block diagram which explains the working of the submit button is shown here −
Once the form is filled, the submit button will call the API gateway which will trigger AWS Lambda. AWS Lambda will get the details of the form from event or theAPI Gateway and the data will be inserted in the DynamodDB table.
Let us understand the creation of API Gateway and AWS Lambda.
First, go to AWS services and click Lambda. The Lambda function created is as shown here −
Now, to create an API gateway, go to AWS service and select API Gateway. Click on Create API button shown below.
Enter the API name and click on Create API button to add the API.
Now, an API is created called as registeruser. Select the API and click Actions dropdown to create Resource.
Click Create Resource. Now, let us add the POST method. For this, click on resources created on left side and from Actions dropdown select create method. This will display dropdown as shown below −
Select the POST method and add the Lambda function that we created above.
Click Save button to add the method. To send the form details to Lambda function lambdaexample we need to add the Integration Request as shown below −
To post the form details, you will have to click Integration Request. It will display below details.
Click Body Mapping Templates to add the form fields to be posted.
Next, click Add mapping template and enter the content type. Here, we have added application/json as the content type. Click it and here you need to enter the field in json format as shown below −
Now, click the Save button and deploy the API as shown below −
Here is the API created for POST which will use inside our .html file. Please note we need to Enable CORS for the resource created. Will use the api gateway url to make ajax call so the CORS has to enabled.
Select the Methods on which you want to enable the CORS. Click on Enable CORS and replace existing CORS headers.
It displays the confirmation screen as follows −
Click Yes, replace existing values to enable CORS.
The AWS Lambda code forPOST API Gateway is as shown here −
const aws = require("aws-sdk");
const docClient = new aws.DynamoDB.DocumentClient({
region:'us-east-1'
});
exports.handler = function(event, context, callback) {
console.log(event);
console.log("Entering Data");
var data = {
TableName : "registeruser",
Item : {
first_name:event.fname,
last_name:event.lname,
emailid:event.emailid,
mobile_no : event.mphone,
otp:event.otp,
username:event.uname,
password:event.passwd,
confirm_password:event.cpasswd
}
}
docClient.put(data, function(err, value) {
if (err) {
console.log("Error");
callback(err, null);
} else {
console.log("data added successfully");
callback(null, value);
}
});
}
The event parameter in AWS Lambda handler will have all the details which are added earlier in POST integration request. The details from event are added to the DynamodDB table as shown in the code.
Now, we need to get the service details from AWS-SDK as shown below −
const aws = require("aws-sdk");
const docClient = new aws.DynamoDB.DocumentClient({
region:'us-east-1'
});
var data = {
TableName : "registeruser",
Item : {
first_name:event.fname,
last_name:event.lname,
emailid:event.emailid,
mobile_no : event.mphone,
otp:event.otp,
username:event.uname,
password:event.passwd,
confirm_password:event.cpasswd
}
}
docClient.put(data, function(err, value) {
if (err) {
console.log("Error");
callback(err, null);
} else {
console.log("data added successfully");
callback(null, value);
}
});
Create AWS Lambda and API Gateway to Read Data from DynamodDB Table
Now, we will create AWS Lambda function to read data from DynamoDB table. We will trigger APIGateway to the AWS Lambda function which will send data to the html form.
The AWS Lambda function created is as shown below −
The corresponding AWS Lambda code is as follows −
const aws = require("aws-sdk");
const docClient = new aws.DynamoDB.DocumentClient({
region:'us-east-1'
});
exports.handler = function(event, context, callback) {
var readdata = {
TableName : "registeruser",
Limit : 10
}
docClient.scan(readdata, function(err, data) {
if (err) {
console.log("Error");
callback(err, null);
} else {
console.log("Data is " + data);
callback(null, data);
}
});
}
Here the data is read from the DynamoDB table and given to the callback. Now, we will create APIGateway and add AWS Lambda function as the trigger.
We will add get method to the API created earlier.
Lambda function added is lambdareaddataexample. Click Save to save the method and deploy the api.
Final Working of the User Registration Form
The final display of the form is as shown below −
Now, enter the details as shown above. Note that the submit button is disabled. It will be enabled only when all the details are entered as shown −
Now, enter the mobile number and click validate phone button. It will display the alert message saying “OTP is send to the mobile, please enter the OTP to continue”. OTP sent to the mobile number is as follows −
Enter the OTP and remaining details and submit the form.
The data in DynamoDB registeruser table after submit is as shown here −
The code details are as given below −
Example1.html
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript" src="formdet.js"></script>
<style>
input[type=text], input[type=password],button {
width: 100%;
padding: 5px 5px;
margin: 5px 0;
box-sizing: border-box;
}
#maincontainer {
width: 80%;
margin: auto;
padding: 10px;
}
div#userregistration {
width: 60%;
float: left;
}
div#userdisplay {
margin-left: 60%;
}
</style>
</head>
<body>
<div id="maincontainer">
<div id="userregistration">
<h1>User Registration Form</h1>
<table border="0">
<tr>
<td><b>First Name<span style="color:red;">*</span> : </b></td>
<td><input type="text" value="" name="fname" id="fname" /></td>
<td id="tdfname" style="display:none;"><span style="color:red;">Enter First Name</span></td>
</tr>
<tr>
<td><b>Last Name<span style="color:red;">*</span> : </b></td>
<td><input type="text" value="" name="lname" id="lname" /></td>
<td id="tdlname" style="display:none;"><span style="color:red;">Enter Last Name</span></td>
</tr>
<tr>
<td><b>Email Id<span style="color:red;">*</span> : </b></td>
<td><input type="text" value="" name="emailid" id="emailid" /></td>
<td id="tdemailid" style="display:none;"><span style="color:red;">Enter Email</span></td>
</tr>
<tr>
<td><b>Mobile No<span style="color:red;">*</span> : </b></td>
<td><input type="text" name="mphone" id="mphone"/></td>
<td id="tdmphone" style="display:none;"><span style="color:red;">Enter Mobile Number</span></td>
</tr>
<tr>
<td></td>
<td><button id="validatephone">validate phone</button></td>
<td></td>
</tr>
<tr id="otpdiv" style="display:none;">
<td><b>Enter OTP<span style="color:red;">*</span>:</b></td>
<td><input type="text" value="" name="otp" id="otp" /></td>
<td id="tdotp" style="display:none;"><span style="color:red;">Enter OTP</span></td>
</tr>
<tr>
<td><b>Username<span style="color:red;">*</span>: </b></td>
<td><input type="text" value="" name="uname" id="uname"/></td>
<td id="tduname" style="display:none;"><span style="color:red;">Enter Username</span></td>
</tr>
<tr><td><b>Password<span style="color:red;">*</span> :</b></td>
<td><input type="password" value="" name="passwd" id="passwd"/></td>
<td id="tdpasswd" style="display:none;"><span style="color:red;">Enter Password</span></td>
</tr>
<tr><td><b>Confirm Password<span style="color:red;">*</span> :</b></td>
<td><input type="password" value="" name="cpasswd" id="cpasswd"/></td>
<td id="tdcpasswd" style="display:none;"><span style="color:red;">Enter Confirm Password</span></td>
</tr>
<tr>
<td></td>
<td><button name="submit" id="submit" style="display:;" disabled="true">Submit</button></td>
<td></td>
</tr>
</table>
</div>
<div id="userdisplay">
<h1>User Display</h1>
<table id="displaydetails" style="display:block;width:80%;padding:5px;margin:5px; border: 1px solid black;">
<tr>
<td></td>
<td>FirstName</td>
<td>LastName</td>
<td>Mobile No</td>
<td>EmailID</td>
</tr>
</table>
</div>
</div>
</body>
</html>
formdet.js
function validateform() {
var sError="";
if ($("#fname").val() === "") { $("#tdfname").css("display","");
sError++;
}
if ($("#lname").val() === "") { $("#tdlname").css("display","");
sError++;
}
if ($("#emailid").val() === "") { $("#tdemailid").css("display","");
sError++;
}
if ($("#mphone").val() === "") { $("#tdmphone").css("display","");
sError++;
}
if ($("#otp").val() === "") { $("#tdotp").css("display","");
sError++;
}
if ($("#uname").val() === "") { $("#tduname").css("display","");
sError++;
}
if ($("#passwd").val() === "") { $("#tdpasswd").css("display","");
sError++;
}
if ($("#cpasswd").val() === "") { $("#tdcpasswd").css("display","");
sError++;
}
if (sError === "") {
return true;
} else {
return false;
}
}
$("#fname").change(function() { if ($("#fname").val() !== "") {
$("#tdfname").css("display","none"); } else { $("#tdfname").css("display","");
}
});
$("#lname").change(function() { if ($("#lname").val() !== "") {
$("#tdlname").css("display","none"); } else { $("#tdlname").css("display","");
}
});
$("#emailid").change(function() { if ($("#emailid").val() !== "") {
$("#tdemailid").css("display","none"); } else { $("#tdemailid").css("display","");
}
});
$("#mphone").change(function() { if ($("#mphone").val() !== "") {
$("#tdmphone").css("display","none"); } else { $("#tdmphone").css("display","");
}
});
$("#otp").change(function() { if ($("#otp").val() !== "") {
$("#tdotp").css("display","none"); } else { $("#tdotp").css("display","");
}
});
$("#uname").change(function() { if ($("#uname").val() !== "") {
$("#tduname").css("display","none"); } else { $("#tduname").css("display","");
}
});
$("#passwd").change(function() { if ($("#passwd").val() !== "") {
$("#tdpasswd").css("display","none"); } else { $("#tdpasswd").css("display","");
}
});
$("#cpasswd").change(function() { if ($("#cpasswd").val() !== "") {
$("#tdcpasswd").css("display","none"); } else { $("#tdcpasswd").css("display","");
}
});
var posturl = "https://4rvwimysc1.execute-api.us-east-1.amazonaws.com/prod/adduser";
var phonevalidationurl = "https://wnvt01y6nc.execute-api.us-east-1.amazonaws.com/prod/validate";
var otpsend = "";
function getdata() {
var a = 0;
$.ajax({ type:'GET', url:posturl, success: function(data) { $("#displaydetails").html('');
$("#displaydetails").css("display", ""); console.log(data); $("#displaydetails").append('<tr style="padding:5px;margin:5px;background-color:gray;"><td>Name</td><td>Mobile No</td><td>EmailID</td></tr>');
data.Items.forEach(function(registeruser) {
var clr = (a%2 === 0) ? "#eee": "white";
a++;
$("#displaydetails").append('<tr style="padding:5px;margin:5px;background-color:'+clr+'"><td>'+registeruser.first_name+'-'+registeruser.last_name+'</td><td>'+registeruser.mobile_no+'</td><td>'+registeruser.emailid+'</td></tr>'); }); }, error: function(err) { console.log(err); } }); } $(document).ready(function() {
$("#otp").on("change", function() { var otpentered = $("#otp").val();
if (otpsend == otpentered) {
document.getElementById("submit").disabled = false;
} else {
alert("OTP is not valid.Please enter the valid one or validate phone again to continue!");
document.getElementById("submit").disabled = true;
}
});
$("#validatephone").on("click", function() { $.ajax({
type:'POST',
url:phonevalidationurl,
data:JSON.stringify({
"mphone":$("#mphone").val() }), success: function(data) { $("#otpdiv").css("display", "");
alert("OTP is send to the mobile, please enter to continue");
console.log(data);
otpsend = data;
},
error : function(err) {
$("#otpdiv").css("display", "none"); alert("Invalid mobile no."); } }); }); $("#submit").on("click", function() {
if (validateform()) {
$.ajax({ type:'POST', url:posturl, data:JSON.stringify({ "fname": $("#fname").val(),
"lname": $("#lname").val(), "emailid":$("#emailid").val(),
"mphone":$("#mphone").val(), "otp":$("#otp").val(),
"uname":$("#uname").val(), "passwd":$("#passwd").val(),
"cpasswd":$("#cpasswd").val()
}),
success: function(data) {
alert("Data added successfully");
console.log(data);
getdata();
}
});
}
});
getdata();
});
Till now, we have done AJAX call to the API created and posted the data as shown above.
The AJAX call to add the data to the table is as follows −
var posturl = "https://4rvwimysc1.execute-api.us-east-1.amazonaws.com/prod/adduser";
$(document).ready(function() {
$("#submit").on("click", function() { if (validateform()) { $.ajax({
type:'POST',
url:posturl,
data:JSON.stringify({
"fname": $("#fname").val(), "lname": $("#lname").val(),
"emailid":$("#emailid").val(), "mphone":$("#mphone").val(),
"otp":$("#otp").val(), "uname":$("#uname").val(),
"passwd":$("#passwd").val(), "cpasswd":$("#cpasswd").val()
}),
success: function(data) {
alert("Data added successfully");
console.log(data);
getdata();
}
});
}
});
});
Note that to read the data, a function is called, whose code is given below −
function getdata() {
var a = 0;
$.ajax({ type:'GET', url:posturl, success: function(data) { $("#displaydetails").html('');
$("#displaydetails").css("display", ""); console.log(data); $("#displaydetails").append('<tr style="padding:5px;margin:5px;background-color:gray;"><td>Name</td><td>Mobile No</td><td>EmailID</td></tr>');
data.Items.forEach(function(registeruser) {
var clr = (a%2 === 0) ? "#eee": "white";
a++;
$("#displaydetails").append('<tr style="padding:5px;margin:5px;background-color:'+clr+'"><td>'+registeruser.first_name+'-'+registeruser.last_name+'</td><td>'+registeruser.mobile_no+'</td><td>'+registeruser.emailid+'</td></tr>');
});
},
error: function(err) {
console.log(err);
}
});
}
When you click mobile number validate button, the following code is called and sends the mobile number −
var phonevalidationurl = "https://wnvt01y6nc.execute-api.us-east-1.amazonaws.com/prod/validate";
var otpsend = "";
$("#validatephone").on("click", function() {
$.ajax({ type:'POST', url:phonevalidationurl, data:JSON.stringify({ "mphone":$("#mphone").val()
}),
success: function(data) {
$("#otpdiv").css("display", ""); alert("OTP is send to the mobile, please enter the OTP to continue"); console.log(data); otpsend = data; }, error : function(err) { $("#otpdiv").css("display", "none");
alert("Invalid mobile no.");
}
});
});
// Validate otp
$("#otp").on("change", function() { var otpentered = $("#otp").val();
if (otpsend == otpentered) {
document.getElementById("submit").disabled = false;
} else {
alert("OTP is not valid.Please enter the valid one or validate phone again to continue!");
document.getElementById("submit").disabled = true;
}
}