Blog de Amazon Web Services (AWS)

AWS Mobile Services: Desarrollando aplicaciones móviles en AWS


Por Henry Alvarado, AWS Solutions Architect

Introducción

El desarrollo de aplicaciones móviles se encuentra actualmente en alto crecimiento, transformando las industrias y la forma en que los usuarios consumen sus servicios. El beneficio de movilidad que trae un Smartphone o una Tablet a un usuario para poder interactuar con los sistemas de sus proveedores de servicios, es un concepto muy poderoso que ha llegado para transformar la operación de todo tipo de empresas y aumentar la competitividad. Podemos ver ejemplos de estas nuevas tendencias en la forma que hoy usamos servicio de transporte urbano, servicios bancarios, consumo de multimedia, servicios de seguridad, domótica, automatización, entre muchos otros.

Todas estas tendencias han creado nuevos retos para los equipos de desarrollo móvil donde la agilidad, innovación, economía y experiencia de usuario se han convertido en componentes clave para el éxito de un negocio. Pensando en esto, Amazon Web Services ha dedicado esfuerzos en crear productos que permitan a equipos de desarrollo móvil innovar de forma más rápida, evitando que deban preocuparse por mantener y operar servicios de back-end. Además de esto, AWS cuenta con herramientas que facilitan el desarrollo de aplicaciones móviles como nuestros SDK para diferentes plataformas, ayudando al desarrollador a interactuar con los servicios AWS de forma segura.

Componentes comunes

El desarrollo de aplicaciones móviles usualmente requiere el uso de componentes comunes y reutilizables que no generan una diferenciación perceptible por los usuarios. Además de ser un punto complejo de tratar, involucra muchos esfuerzos para ser operados, monitoreados, escalados y administrados; lo que requiere recursos adicionales y retrasa la innovación del desarrollo del aplicativo móvil.

A continuación vamos a recorrer algunos de estos componentes más requeridos, y cómo Amazon Web Services cuenta con servicios que pueden facilitar la agilidad e innovación al desarrollar aplicaciones móviles.

Administración de usuarios

Las aplicaciones móviles generalmente cuentan con un componente de administración de usuarios, lo que requiere el uso de varios servicios de back-end como base de datos, servidores de aplicación, balanceadores, entre otros. Todo esto hace que se torne complejo de mantener y más aún cuando existen necesidades altas de escalabilidad y disponibilidad.

  • Amazon Cognito Identity es un servicio administrado que permite controlar la autenticación y autorización de usuarios únicos, de tal forma que puedan interactuar con otros servicios AWS usando identidades de proveedores como Amazon, Facebook, Twitter, Google o cualquier otro proveedor compatible con OpenID. Como una característica adicional, usando Cognito User Pools, es posible tener un directorio de usuarios propio de la aplicación que les permita realizar registro y acceso sin complejos backends para administrar. Además de esto, Amazon Cognito implementa las mejores prácticas de seguridad y está disponible para ser integrado fácilmente a través de los SDK para cada plataforma.

Picture01

Figura 1 – Flujo de autenticación

  • Otra necesidad común en relación a los usuarios, es el análisis de su comportamiento dentro de la aplicación. Amazon Mobile Analytics entrega una amplia visión de negocio a través de métricas, que permiten tener una perspectiva clara de cómo está siendo adoptada su aplicación y la receptividad de sus clientes. Además de esto, es posible fácilmente crear métricas personalizadas que mostrarán análisis de negocio acordes con su caso de uso.

Picture02

Figura 2 – Ejemplo de métricas Amazon Mobile Analytics

Datos

La persistencia de datos es requerida en la mayoría de aplicaciones, es por esto que Amazon Web Services cuenta con diversos servicios para diferentes tipos de datos.

Amazon Cognito Data Sync, permite el uso de un almacenamiento de datos en la nube de tipo llave / valor, asociado con un usuario de Amazon Cognito Identity. Además cuenta con la capacidad de sincronizar estos datos entre diferentes dispositivos para mantener informaciones del usuario como preferencias, estados de aplicación, entre otros. Teniendo en cuenta que en los dispositivos móviles es difícil garantizar una buena conectividad de red, Cognito Data Sync implementa también una base de datos SQLite local para mantener los datos del usuario Offline.

Picture03

Figura 3 – Almacenamiento en el Identity Store en la nube

  • Amazon Dynamo DB, es una base de datos NoSQL administrada, capaz de escalar y entregar el performance requerido de forma consistente. Amazon Dynamo DB entrega alta disponibilidad y durabilidad de los datos de forma nativa, además de requerir mínima administración. Bases de datos NoSQL son muy usadas en el mundo móvil gracias a sus capacidades de escalabilidad y performance.
  • Múltiples aplicaciones móviles, sacan provecho de tener una diversa cantidad de sensores disponibles en un dispositivo portable, para enriquecer la experiencia del usuario. Esto implica que se genere una gran cantidad de datos por dispositivo, que deben ser procesados y almacenados por un back-end, lo que se convierte en un gran reto de mantener cuando se escala a miles de usuarios con múltiples dispositivos. Para esto, AWS ofrece Amazon Kinesis, que es un servicio administrado que permite capturar, analizar y procesar grandes cantidades de datos provenientes de múltiples fuentes, de forma escalable y durable. Este servicio permite la creación de flujos de procesamiento en tiempo real de streams de datos.

Picture04

Figura 4 – Ingestión de datos con Amazon Kinesis

Medios

Los creadores de aplicaciones móviles, dan prioridad a la diferenciación de la experiencia de usuario en su aplicación. Lograr este objetivo, generalmente requiere gran cantidad de contenidos multimedia; lo que es fructífero, si se mantiene el performance a bajo costo. Estas estrategias requieren un correcto balance entre lo que es almacenado en el dispositivo, que puede ser desplegado rápidamente por estar de forma local, pero donde los recursos son limitados; y el almacenamiento en nube donde tenemos recursos virtualmente ilimitados, pero debemos apoyarnos en una estrategia de entrega de contenido para no sacrificar performance.

Picture05

Figura 5 – Entrega de contenido por el aplicativo

  • El almacenamiento de los medios requiere ser siempre on-line, de bajo costo y escalable. Para este fin, AWS ofrece Amazon Simple Storage Service (S3), que es un servicio de almacenamiento de objetos vía web donde el usuario es cobrado solamente por la utilización de recursos. El servicio fue diseñado para tener alta durabilidad, disponibilidad y escalar su capacidad de acuerdo con la demanda de recursos.
  • Como lo comentamos anteriormente, almacenar estos recursos en un lugar remoto, trae un requerimiento adicional de performance que puede impactar la experiencia del usuario. Para acelerar la entrega de contenido almacenado en la nube, AWS ofrece un servicio de CDN (Content Delivery Network) llamado Amazon CloudFront. Este servicio hace uso de una red global de puntos de presencia, que almacenan en caché copias de los archivos recentemente solicitados, quedando más cerca de los visualizadores. Al igual que otros servicios de AWS, Amazon CloudFront es una oferta de auto servicio, cobrada por el uso, sin exigencia de compromisos a largo plazo o tasas mínimas de uso.

Lógica de aplicación

Las aplicaciones móviles frecuentemente requieren interactuar con servicios externos vía Internet o capacidades de cómputo mayores a las disponibles localmente en los dispositivos. La amplia diversidad de servicios disponibles a través de Internet enriquece de gran forma las funcionalidades que una aplicación móvil puede ofrecer. Por esta razón y dada la evolución de las redes móviles y los dispositivos conectados a ellas, es cada vez más frecuente que una aplicación móvil esté compuesta de un front-end local y un back-end remoto.

Picture06

Figura 6 – Backends en AWS

  • Amazon Web Services, ofrece un servicio administrado de cómputo basado en eventos, llamado AWS Lambda. Este servicio permite que usted ejecute su código Java, Node.js o Python, únicamente cuando lo requiere, sin necesidad de administrar servidores y pagando solamente por los recursos usados al momento de ser ejecutado. AWS Lambda permite un uso muy granular y optimizado de los recursos, manteniendo alta disponibilidad y escalabilidad.
  • Los desarrolladores móviles están usando Amazon Web Services para desplegar la lógica tras las funcionalidades de su aplicación, usando servicios administrados de cómputo. Surgió así, un patrón de arquitectura conocido como Back-end móvil como servicio, o MBaaS por sus siglas en Inglés. Un ejemplo de cómo podemos implementarlo en AWS, está disponible en este post de nuestro blog en español: http://aws.typepad.com/espanol/2016/02/mobile-backend-as-a-service-patr%C3%B3n-de-arquitectura.html

Mensajería móvil

En el desarrollo móvil, las comunicaciones entre el back-end y el usuario pueden llegar a ser un reto difícil de tratar, dados los requerimientos y costos de herramientas usadas para notificaciones vía Push o SMS.

Picture07

Figura 7 – Endpoints disponibles en Amazon SNS

  • AWS ofrece Amazon Simple Notification Service (SNS), un servicio administrado que permite fácil implementación de un sistema de notificaciones para su aplicación, usando un modelo pub-sub. Integrado con las principales soluciones de notificaciones existentes: envío de notificaciones push para Apple iOS, Android, Amazon Kindle Fire, Windows Desktop y Windows Phone; también para destinos como filas de Amazon SQS, funciones AWS Lambda, direcciones de email, SMS (ahora disponible en más de 200 países) y endpoints HTTP. Este servicio facilita al desarrollador móvil la administración de una única herramienta de notificaciones de forma escalable, durable y disponible.

Herramientas de desarrollo móvil AWS

En la sección anterior, vimos cómo AWS cuenta con servicios administrados, que pueden suplir necesidades de funcionalidades comúnmente usadas en el back-end de aplicaciones móviles. En esta sección, vamos a ver las diferentes formas de usarlas y cómo existen herramientas que facilitan el desarrollo móvil integrando con servicios de AWS.

Los servicios AWS cuentan con una API REST que permite integrar fácilmente y de forma programática, una aplicación con acciones de servicios AWS de forma segura. Sin embargo, el desarrollo móvil tiene algunos retos diferentes como: baja confiabilidad de red, necesidad de una capa de proxy para realizar y controlar las llamadas a APIs en nombre del dispositivo móvil, recursos locales limitados, entre otros. Pensando en esto, AWS ofrece el Mobile SDK, disponible para Android, IOs, Xamarin, Unity y JavaScript; cuyo objetivo es facilitar la interacción directa entre el dispositivo y las APIs de los servicios AWS. Algunos beneficios adicionales que se obtienen al usar el AWS Mobile SDK son:

  • Integración completa y optimizada con las diferentes plataformas disponibles.
  • Manejo automático de intermitencias de red.
  • Uso reducido de recursos en el dispositivo (Se incluyen únicamente los recursos necesarios del SDK).
  • Método de autenticación único para interacción con los servicios AWS.
  • Incluye una amplia variedad de códigos ejemplo para facilitar el uso de estas herramientas.

¿Por dónde empezar?

Ahora, que vimos los beneficios de aprovechar servicios administrados de AWS, para fácilmente construir aplicaciones móviles, debemos dar un primer paso que nos permita rápidamente ganar experiencia práctica y poder minimizar la curva de aprendizaje. Así, Amazon Web Services anunció durante el Re:Invent 2015, AWS Mobile Hub.

Este servicio simplifica el proceso de creación, build, test y monitoreo de aplicaciones móviles, generando un código Android, iOS Objective-C o iOS Swift, como una aplicación completamente funcional que puede ser probada sin cambios en un dispositivo real. Esto quiere decir que a través de la consola de AWS Mobile Hub, simplemente se seleccionan los servicios AWS a integrar, se configuran y automáticamente es generado el código base 100% funcional, como punto de partida para una aplicación móvil. Para ilustrar este proceso a continuación vamos a ver un paso a paso para crear una aplicación base que use diferentes servicios AWS.

AWS Mobile Hub – Hola Mundo

1.Ingresamos a la consola de AWS Mobile Hub: https://console.thinkwithwp.com/mobilehub/

2. Si es la primera vez que ingresamos, debemos conceder permisos al servicio para que pueda realizar tareas como creación de roles IAM en nuestro nombre.Picture08

3.  Seleccionamos la opción “Yes, grant permissions” lo que creará un rol IAM con los permisos necesarios.

4. Ahora, escogemos un nombre para el proyecto que vamos a crear y seleccionamos “Create project”.Picture09

5. En el siguiente paso, contamos con un set de funcionalidades a los servicios AWS descritos en secciones anteriores, que podemos agregar o no, según sea nuestro objetivo en la aplicación. Para efectos de este tutorial, usaremos la autenticación de usuarios vía Cognito con la funcionalidad “User Sign-In” y el almacenamiento de objetos en Amazon S3 usando la funcionalidad “User Data Storage”.

6. Seleccionamos entonces “User Sign-In”.

Picture10

7. Ahora podremos escoger tres tipos de autenticación: Obligatoria, opcional y no requerida. En este caso usaremos autenticación opcional.

Picture11

8. Debemos escoger el proveedor de identidades que vamos a usar. Entre las opciones tenemos Facebook, Google+ y por el momento una tercera opción de un proveedor de identidades propio basado en OpenID. Seleccionaremos Facebook para este ejemplo.

9. A continuación debemos obtener el “Facebook App ID” en el sitio de desarrolladores de Facebook, siguiendo las instrucciones mostradas en el panel derecho de la consola.

10. Una vez contamos con el Facebook App ID, lo copiamos al campo correspondiente seleccionando “Save changes”.

Picture12

11. Realizados los cambios, veremos el mensaje: “Your changes have been saved”. A continuación seleccionamos la opción “Configure more features” para agregar más funcionalidades.

12. De vuelta al panel principal, agregaremos una característica más seleccionando el botón “User Data Storage”.

Picture13

13. En el menú “User Data Storage” seleccionamos el botón “Store user data”.

Picture15

14. Seleccionamos “Save changes”.

Picture15

15. Ahora que hemos terminado de configurar las funcionalidades base de nuestra aplicación, podemos seleccionar el botón “Build your app” para crear el código de la misma, lo que nos llevará a un menú para escoger la plataforma.

Picture16

16. En este caso, seleccionaremos Android. El resultado de esto será el paso a paso desde ceros que debemos seguir para descargar y desplegar el código generado en el IDE de preferencia.

Picture17

17. Una vez completados el paso a paso de despliegue tendremos el paquete de la aplicación descargado y desplegado en Android Studio para este ejemplo.

Picture18

18. Por último seleccionamos el proyecto Android y lo ejecutamos en “Debug Mode” lo que ejecuta el proyecto en el emulador como una aplicación 100% funcional sin necesidad de hacer ningún cambio en el código.

Picture19

Resultados

Como pudimos ver, en pocos minutos creamos, desplegamos y ejecutamos una aplicación móvil para Android, con las funcionalidades de back-end seleccionadas y configuradas usando dos servicios AWS: Amazon S3 y Amazon Cognito. El siguiente diagrama muestra la arquitectura de la aplicación creada:

Picture20

AWS Mobile Hub creó por nosotros los siguientes recursos:

  • Bucket de Amazon S3 privado con dos directorios en él: “/public” y “/private”
  • Identity pool de Amazon Cognito asociado al control de identidades de Facebook
  • Un Role de AWS IAM que permite acceso a todo recurso dentro del directorio “/public”.
  • Un Role de AWS IAM que permite acceso a todo recurso dentro del directorio “/private” y “/public”.

De esta forma, cuando un usuario no está autenticado, asume el Role IAM con acceso únicamente al directorio “/public”; y al ser un usuario autenticado, asume el Role IAM con acceso ambos directorios “/public” y “/private”.

Próximos pasos

Durante este tutorial creamos una aplicación que usa Amazon Cognito para autenticar y autorizar usuarios de tal forma que puedan acceder directamente a recursos privados en Amazon S3. Este ejemplo es básico, pero es un fácil y rápido punto de partida para miles de aplicaciones que pueden basarse en esta arquitectura, como:

  • Aplicación de álbum de fotos para viajeros
  • Aplicación de oficina para almacenamiento de documentos seguros en la nube
  • Aplicación financiera para escaneo de recibos
  • Aplicación de seguros para reporte de colisiones de auto
  • Aplicación de gobierno para reporte de vías en mal estado
  • Aplicación para medios donde los reporteros entregan al backoffice notas multimedia desde su dispositivo móvil
  • Y muchas otras

Ahora que contamos con el código fuente de esta aplicación móvil base es posible enfocarse en la interacción con el usuario, caso de negocio y la diferenciación de la aplicación móvil en el mercado.

En el próximo post contaremos cómo AWS facilita también las ejecuciones de pruebas de la aplicación en dispositivos reales, una vez terminemos el desarrollo.