Menu

Expand
Calificar esta página:

Recibir y responder mensajes SMS y MMS en Python con Amazon Lambda

Hoy llegaremos a "Hello, World!" en una aplicación móvil de Twilio sin servidor con Amazon API Gateway, Amazon Lambda y Python. Al final de esta guía, tendrás el conocimiento base de tu próxima aplicación móvil de Twilio que cambiará el mundo. Al final de este párrafo, tendrás una promesa: no tendrás que utilizar ni un solo VPS.

¿Suena emocionante? Indudablemente. ¡Empecemos!

Incoming SMS Diagram

Ah, y si aún no lo has hecho, ingresa o crea una cuenta de AWS e ingresa y crea una cuenta de Twilio. No te preocupes, estaremos aquí cuando estés listo.

Requisitos del tutorial

Twilio puede enviar una solicitud HTTP a tu aplicación web cuando se produzcan determinados eventos, como un mensaje de texto entrante a uno de tus números de teléfono de Twilio. Estas solicitudes se denominan webhooks o devoluciones de llamada de estado. Para obtener más información, consulta nuestra guía de Introducción a los webhooks de Twilio. Encuentra otras páginas sobre webhooks, como una guía de seguridad y preguntas frecuentes en la sección Webhooks de los documentos.

¿Qué es un webhook?

Los webhooks son devoluciones de llamadas HTTP definidas por el usuario. Por lo general, son activados por algún evento, como recibir un mensaje SMS o una llamada telefónica entrante. Cuando se produce ese evento, Twilio realiza una solicitud HTTP (en general una POST o GET) a la URL configurada para el webhook.

Para gestionar un webhook, solo necesitas crear una pequeña aplicación web que pueda aceptar las solicitudes HTTP. Casi todos los lenguajes de programación en el lado del servidor ofrecen un marco para que lo hagas. Algunos ejemplos de lenguajes son ASP.NET MVC para C#, Servlets y Spark para Java, Express para Node.js, Django y Flask para Python, y Rails y Sinatra para Ruby. PHP tiene su propio marco integrado de app web, aunque marcos como Laravel, Symfony y Yii también son populares.

Sea cual sea el marco y lenguaje que elijas, los webhooks funcionan de igual manera para cada aplicación móvil de Twilio. Realizarán una solicitud HTTP a un URI que proporciones a Twilio. Tu aplicación móvil realiza la lógica que consideres necesaria, ya sea leer o escribir desde una base de datos, integrar otra API o realizar algún proceso de computación, y luego responde a Twilio con una respuesta TwiML con las instrucciones que deseas que Twilio lleve a cabo.

Uso de Amazon Lambda con Twilio y Amazon API Gateway

Si bien la parte que se mostrará al mundo pertenecerá a API Gateway, es conceptualmente más sencillo comenzar con el código en Lambda. Debido a que esto puede parecerte contradictorio, prepárate para algunas referencias a futuro en esta sección. Todo esto se aclarará cuando expongamos todo al mundo desde API Gateway.

Crear una función de Amazon Lambda

  • A partir de la región de Amazon que escojas, crea una función de Lambda nueva desde tu consola de Lambda mediante el modelo "microservice-http-endpoint-python".

Asegúrate de que la consola se encuentre establecida en tu región preferida. Esto es importante porque las funciones de Lambda solo se encuentran disponibles en el contexto de la región seleccionada. La mayoría de las personas eligen una región que está geográficamente cerca de donde viven.

create_lambda_function.png

El modelo "microservice-http-endpoint-python" nos lleva a la posición inicial con nuestra lambda_function configurada con la firma de la función adecuada para tomar la entrada de API Gateway (en su momento).

  • Asignar un nombre a la función replyMessages
  • Selecciona el rol de ejecución de permisos básicos de Lambda (o utiliza un rol existente que ya esté configurado en la consola de AWS IAM)
  • Elimina el activador “API Gateway” al hacer clic en el botón Remove (Eliminar). Agregaremos nuestro propio activador cuando terminemos con el código.
  • Haz clic en el botón Create function (Crear función) para crear la función. Editaremos el código en el siguiente paso.

configure_lambda_function.png

  • En el editor de código, reemplaza el código de la plantilla por las siguientes líneas de código.

Ingresa este código completamente en el editor en línea:

Loading Code Sample...
        
        
        Responding with "Hello, World!" on Amazon Lambda with Python 2.7 in 6 lines of code.

        Responding to SMS or MMS Messages in Lambda

        Responding with "Hello, World!" on Amazon Lambda with Python 2.7 in 6 lines of code.

        Toda nuestra aplicación "Hello, World!" cabe en 6 líneas de código. Simplemente: importaremos la función print de Python 3, imprimir todos los encabezados y parámetros HTTP que hemos recibido y luego devolver TwiML.

        Acceso a los encabezados de solicitudes y a los parámetros del cuerpo

        Todos los parámetros HTTP POST publicados y cualquier encabezado que elijamos incluir estarán dentro del diccionario event.

        Aunque parezca magia en este punto, hay un proceso de dos pasos en API Gateway a fin de preparar event para nuestro uso. API Gateway espera la entrada JSON, por lo que usaremos una asignación de cuerpo y dividiremos los caracteres ampersand (&) a fin de preparar el diccionario para Python. (Esto se incluye en la siguiente sección).

        print("Received event: " + str(event))

        Esta línea tiene algo más de magia y esto es que la impresión se redirige automáticamente hacia Amazon Cloudwatch. Cuando nuestro rol y nuestras políticas se hayan configurado correctamente, las invocaciones de esta función y cualquier salida se encontrarán en CloudWatch.

        Generación manual de TwiML con Lambda y Python

        TwiML, el Markup Language XML de Twilio, es increíblemente potente y te permite dar instrucciones a Twilio con facilidad sobre cómo gestionar las acciones entrantes. Hoy solo utilizamos un pequeño subconjunto de TwiML para responder a un mensaje con un mensaje propio.

        return '<?xml version=\"1.0\" encoding=\"UTF-8\"?>'\
               '<Response><Message><Body>Hello world! -Lambda</Body></Message></Response>'

        Con esta cadena, en primer lugar informamos a Twilio que estamos respondiendo con XML codificado en UTF-8. Luego, configuramos una etiqueta Message anidada dentro de una etiqueta Response y la etiqueta Message informa a Twilio que nos gustaría responder con el contenido de la etiqueta <Body> (en este caso, por SMS).

        Respuesta con contenido multimedia (mensajes MMS)

        TwiML posee la flexibilidad de devolver contenido multimedia en tus respuestas a los mensajes entrantes. Agrega un sustantivo <Media> dentro de <Message> y llenarás tus mensajes con archivos png en un instante (sí, también es posible con otros formatos de imagen).

        ¿Tu imagen vale 1000 palabras pero necesitas 5000? No hay problema. Twilio permite hasta 10 elementos multimedia por respuesta.

        Configuaración básica de Lambda

        En Basic settings (Configuración básica), puedes establecer la memoria (MB) al mínimo de 128 MB. Personalmente, hemos utilizado un tiempo de espera de 10 segundos sin ningún problema.

        Durante la producción, te recomendamos revisar estos límites y que veas cómo cambia el precio de Lambda en función de tus selecciones.

        • Pulsa el botón Save (Guardar) para guardar los cambios realizados.

        Probar nuestra función de Lambda

        En este punto, siéntete libre de “Probar” la función con el botón azul en la parte superior; independientemente de la entrada, deberías ver este resultado (incluidas las comillas dobles):

        "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Response><Message>Hello world! -Lambda</Message></Response>"

        Configuración de Amazon API Gateway

        Ahora, tu función de lambda cuenta con recursos asignados, políticas y roles definidos, y responde maravillosamente. Nuestro siguiente paso es encontrar una manera de dejar que el mundo se comunique con ella. Aquí es donde Amazon API Gateway entra en juego. Utilizaremos la integración de API Gateway/Lambda para establecer una ruta desde Twilio hasta la función de Lambda que acabamos de definir.

        • En la consola de AWS API Gateway y en tu selección de región (no es necesario que coincida con la región de la función de Lambda), selecciona el botón Create API (Crear API).
        • Selecciona la opción REST API (API REST).

        (Si no posees ninguna API en la región actual, haz clic en el botón Build [Crear] en la opción REST API [API REST]).

        • Introduce el nombre de la API y una descripción. Nombramos nuestra API “twilio_simple_responses” con una descripción de “Respond to incoming Twilio messages” (Responder mensajes entrantes de Twilio) y un tipo de punto final “Regional”.
        • Pulsa el botón Create API (Crear API).

        create-api-gateway.png

        Crear y configurar los recursos

        Ahora que ya hemos creado nuestra nueva API REST twilio_simple_responses, podemos crear y configurarla para que funcione correctamente con la función replyMessages de Lambda que creamos en la sección anterior.

        • En el menú desplegable “Actions” (Acciones), te recomendamos seleccionar Create Resource (Crear recurso)

        Create New Resource API Gateway

        • Asigna un nombre a tu recurso como “Message Responder” (Contestador de mensajes) y utiliza la ruta del recurso /message. A continuación, pulsa el botón Create Resource (Crear recurso).

        Create Resource in API Gateway

        • En el menú desplegable, selecciona Create Method (Crear método), luego POST y pulsa la marca de verificación (✓) para guardar.
        • En la pantalla de configuración, selecciona la integración de “Lambda Function” (Función de Lambda) sin integración de Proxy y selecciona la región junto con el nombre de tu función de Lambda (utilizamos replyMessages).Recuerda que el campo “Lambda Function” (Función de Lambda) buscará de forma automática a medida que escribas, por lo que es probable que solo necesites ingresar unos pocos caracteres a fin de encontrar tu función:

        configure-api-post-method.png

        Después de guardar, haz clic en “Okay” (Aceptar) en la ventana emergente de concesión de permisos y estarás listo para integrar Lambda.

        Realizaremos la configuración paso a paso para integrar correctamente nuestra función con API Gateway. Ten en cuenta que tenemos que realizar diversos cambios de configuración en la consola de API Gateway debido a que este se ha diseñado para la entrada y salida de JSON. Tenemos que trabajar en torno a eso para que Twilio, que publica un formulario y espera XML, entienda nuestra respuesta.

        Integración de nuestra solicitud con nuestra función de Lambda

        Aunque ahora nuestra función es básica, la mayoría de las aplicaciones necesitarán lógica basada en mensajes entrantes. Debemos asignar un tipo de contenido de application/x-www-form-urlencoded a JSON para que funcione correctamente con API Gateway y Lambda.

        • Haz clic en Integration Request (Solicitud de integración) y, a continuación, expande Body Mapping Techniques (Técnicas de asignación de cuerpo).
        • Haz clic en Add mapping template (Agregar plantilla de asignación) e inserta application/x-www-form-urlencoded (sin comillas).
        • Asegúrate de pulsar la marca de verificación (✓) para guardar. Aparecerá una ventana emergente en la que se te solicitará que protejas esta asignación; confirma que deseas protegerla.

        API Gateway cambiará tu “Request Body Passthrough” (Solicitar el paso del cuerpo) a “When there are no templates defined (recommended)” (Cuando no hay plantillas definidas [recomendado]), si no lo hace o cancelas la solicitud, muévela ahora.

        • Ingresa este código en el editor que aparecerá en la casilla Content-Type (Tipo de contenido):
        #set($httpPost = $input.path('$').split("&"))
        {
        #foreach( $kvPair in $httpPost )
         #set($kvTokenised = $kvPair.split("="))
         #if( $kvTokenised.size() > 1 )
           "$kvTokenised[0]" : "$kvTokenised[1]"#if( $foreach.hasNext ),#end
         #else
           "$kvTokenised[0]" : ""#if( $foreach.hasNext ),#end
         #end
        #end
        }

        Este código, que sugirió Avi Lewin en los Foros para desarrolladores de AWS, divide nuestros parámetros HTTP en pares clave/valor de JSON.

        • Por último, vuelve a “Method Execution” (Ejecución del método) mediante el enlace en la parte superior del marco. (Es posible que tengas que desplazarte hacia arriba).

        Integración de nuestra respuesta de Lambda con API Gateway

        Debemos realizar ajustes en la salida de nuestra función de Lambda. En una API tradicional te recomendamos utilizar los códigos de estado HTTP forma adecuada, en general se recomienda responder con 200 y a veces 401 a la solicitud de Twilio. Además, API Gateway se configura para responder con un “Content-Type” (Tipo de contenido) de application/json, mientras que Twilio espera application/xml. Ahora solucionemos eso para el caso de 200.

        • Haz clic en el enlace de Integration Response (Respuesta de integración).
        • Expande la respuesta 200 y, a continuación, expande Body Mapping Templates (Plantillas de asignación de cuerpo).
        • Si hay una entrada “application/json”, elimínala ahora.
        • Selecciona Add mapping template (Agregar plantilla de asignación) y agrega application/xml.
        • En el cuadro de texto, ingresa esta asignación:
        $input.path('$')

        Básicamente, solo repetimos el valor que devuelve la función de Lambda. Esto también se ocupará de las comillas dobles (") en la cadena de devolución.

        configure-api-integration-response.png

        • Guarda la asignación y vuelve a la página de Method Execution (Ejecución del método) con el enlace que se encuentra en la parte superior de la pantalla.

        Configuración de la respuesta de API Gateway

        A continuación, actualizaremos la respuesta que nuestra API twilio_Simple_Responses envía a Twilio. En lugar de JSON (el predeterminado), queremos enviar XML.

        • Haz clic en el enlace Method Response (Respuesta al método).
        • En Response Body (Cuerpo de la respuesta) para 200, si se ha definido application/json, elimínalo ahora.
        • A continuación, agrega application/xml con un modelo “Empty” (Vacío).
        • No olvides hacer clic en la marca de verificación (✓) para guardar los cambios.

        configure-api-method-response.png

        • Vuelva a la página de Method Execution (Ejecución del método) con el enlace que se encuentra en la parte superior de la pantalla.

        Implementación de la API y elección de una etapa

        Ya casi terminamos. Lo último que vamos a hacer con nuestra API Gateway es implementarla.

        • En el menú Actions (Acciones), selecciona Deploy API (Implementar API):

        Deploy an API in API Gateway

        A continuación, se te consultará en qué etapa deseas implementarla. Si aún no has creado una, puedes crear una etapa nueva desde el menú.

        • Asigna el nombre “prod” a tu etapa:

        Create a New Stage in API Gateway

        • Expande la etapa “prod” que aparece (o dirígete a Stages [Etapas] en la barra lateral) y haz clic en “POST” en “/” y “/message”.
        • En la parte superior, verás Invoke URL (Invocar URL).
        • Copia esa URL.

        Invoke URL in API Gateway

        Con un portapapeles completo, ya tenemos dos tercios del camino para lograr una aplicación móvil de Twilio sin servidor. Sigamos adelante.

        Configurar la URL del webhook

        En lo que respecta a Twilio, debemos decirle a Twilio donde realizar una solicitud cuando recibas un SMS en tu número de teléfono de Twilio.

        • En la consola de Twilio, ve a la sección Numbers (Números) en la barra lateral (#).
        • Selecciona el número que deseas enrutar a nuestra función de Lambda nueva.
        • En Messaging (Mensajería) y en A Message Comes In (Llega un mensaje), selecciona la opción Webhook y pega la URL de API Gateway en el cuadro de texto (destacado a continuación). Asegúrate de que HTTP POST se encuentre seleccionado.

        Configure SMS Webhook

        Respaldar la URL del webhook

        También observarás el cuadro “Primary Handler Fails” (Fallos del administrador principal). Durante la producción, es posible que quieras tener un segundo administrador para los mensajes entrantes. Twilio conmutará de forma automática al administrador secundario si no puede llegar al primario en 15 segundos o si se presenta otro problema. Consulta nuestra Guía de disponibilidad y fiabilidad para obtener más detalles.

        Proteger los webhooks

        Twilio es compatible con la autenticación HTTP básica y codificada. La autenticación te permite proteger tus URL de TwiML en tu servidor web con contraseña para que solo tú y Twilio puedan acceder a ellos.

        Obtén más información sobre la autenticación HTTP y la validación de solicitudes entrantes aquí. También puedes consultar nuestra guía completa para asegurar tu app de Python con Amazon Lambda.

        Enviar un mensaje de texto al número de Twilio

        Y con esto, ¡hemos completado la configuración! Ahora Twilio vigila los mensajes entrantes, API Gateway espera las solicitudes de Twilio y la lógica de Python en Lambda espera a API Gateway. Intenta enviar un mensaje de texto a tu número de Twilio para corroborar que el mundo aún quiere saludarte.

        ¿Qué sigue? Generación de un Delta grande con Twilio y Lambda

        Te sugerimos que a continuación consultes nuestra guía sobre la validación de solicitudes de Twilio entrantes con Python en Lambda. En ese artículo exploraremos algunas características más avanzadas de Lambda, tales como cargar nuestra biblioteca auxiliar de Python y definir variables de entorno, junto con la demostración de algunas comprobaciones simples de números de teléfono y la validación de solicitudes de Twilio.

        Si estás listo para seguir adelante, los complementos a menudo simplificarán tus próximos pasos. Los complementos hacen que la plataforma de Twilio sea aún más potente al permitirte integrar algunas herramientas y servicios increíbles de nuestros socios en tu aplicación móvil.

        Independientemente de lo que crees, estamos aquí para ayudarte y celebrar cuando lo implementes. Avísanos cuando realices la implementación con un mensaje en Twitter.

        Paul Kamp Kevin Segovia Daniel Erazo
        Calificar esta página:

        ¿Necesitas ayuda?

        Todos la necesitamos a veces; la programación es difícil. Obtén ayuda ahora de nuestro equipo de soporte, o recurre a la sabiduría de la multitud visitando Stack Overflow Collective de Twilio o navegando por la etiqueta de Twilio en Stack Overflow.

        Loading Code Sample...
              
              
              

              Gracias por tus comentarios.

              Selecciona los motivos de tus comentarios. La información adicional que nos brindas nos ayuda a mejorar nuestra documentación:

              Enviando tus comentarios…
              🎉 Gracias por tus comentarios.
              Se produjo un error. Inténtalo de nuevo.

              Gracias por tus comentarios.

              thanks-feedback-gif