O blog da AWS
AWS Mobile Services: Desenvolvendo o primeiro aplicativo móvel na AWS
Por Henry Alvarado, AWS Solutions Architect
Componentes comuns no desenvolvimento mobile
O desenvolvimento de aplicativos móveis usualmente requer a utilização de componentes comuns e reutilizáveis que não geram uma diferenciação perceptível pelo usuário. Além de ser um ponto complexo de tratar, envolve muito esforço para serem operados, monitorados, escalados e gerenciados; o que requer recursos adicionais e atrasa a inovação do desenvolvimento do aplicativo móvel.
A seguir, vamos rever alguns desses componentes mais utilizados e como os serviços providos pela AWS podem aumentar a agilidade e inovação ao desenvolver aplicativos móveis.
Gerenciamento de usuários
Os aplicativos móveis, geralmente contam com um componente de gerenciamento de usuários, o que requer o uso de vários serviços de back-end como: banco de dados, servidores de aplicação, balanceadores de carga, entre muitos outros. Tudo isso torna complexo o gerenciamento, especialmente quando existe a necessidade alta de escalabilidade e disponibilidade.
- Amazon Cognito Identity é um serviço gerenciado que permite controlar a autenticação e autorização de usuários, de modo que possam interagir com outros serviços AWS usando identidades de provedores como a Amazon, o Facebook, o Twitter, o Google, um repositório de identidades próprio utilizando o Cognito Identity Pools ou qualquer outro provedor compatível com OpenID. Junto com o Cognito User Pools, é possível manter um diretório de usuários próprio do aplicativo que permite aos usuários fazerem o processo de registro e acesso sem backends complexos para administrar. Além disso, o Amazon Cognito inclui as melhores práticas de segurança e está disponível para ser integrado facilmente usando os SDK disponíveis para as principais plataformas como Android e iOS.
Figura 1 – Fluxo de autenticação
- Amazon Mobile Analytics. Outra necessidade referente aos usuários, é a análise de seu comportamento no aplicativo. O Amazon Mobile Analytics entrega uma ampla visão de negócio através de métricas, que permitem avaliar com mais detalhes como a sua aplicação está sendo recebida pelo publico. Métricas como: Usuários ativos por mês, Novos usuários, Fator de continuidade na utilização do aplicativo, entre muitas outras permitem acompanhar a adoção da sua aplicação. Além dessas caraterísticas, é possível criar métricas personalizadas que capturem uma visão de negócio específica ao seu caso de uso.
Figura 2 – Exemplo de métricas Amazon Mobile Analytics
Dados
A persistência de dados e necessária na maioria de aplicativos. Por isso, Amazon Web Services conta com diversos serviços para diferentes tipos de dados.
- Amazon Cognito Data Sync, permite o uso de um armazenamento de dados na nuvem do tipo chave / valor, associado a um usuário de Amazon Cognito Identity. Além disso, conta com a capacidade de sincronizar esses dados entre diferentes dispositivos para manter de forma consistente informações do usuário como preferências, estados de aplicação, entre outras. Tendo em mente que nos dispositivos móveis, é difícil garantir uma boa conectividade de rede, Cognito Data Sync, também incorpora uma base de dados SQLite local para manter os dados do usuário off-line.
Figura 3 – Armazenamento no Identity Pool na nuvem
- Amazon DynamoDB, é um banco de dados NoSQL gerenciado, capaz de escalar e entregar a performance solicitada de forma consistente. Amazon Dynamo DB, entrega alta disponibilidade e durabilidade dos dados de forma nativa, além de exigir o mínimo gerenciamento. Bancos de dados NoSQL são muito usados nas aplicações móvel pelas suas capacidades de escalabilidade e performance.
- Amazon Kinesis. Diversas aplicações móveis, aproveitam os sensores incluídos no dispositivo para melhorar a experiência do usuário. Isso gera uma grande quantidade de dados pelo dispositivo que precisam ser processados e armazenados usando um back-end. Essa ingestão de dados se torna um grande desafio, quando chegamos a milhões de usuários com múltiplos dispositivos. Para facilitar essa ingestão, a AWS oferece o Amazon Kinesis, um serviço gerenciado que permite capturar, analisar e processar grandes volumes de dados gerados por múltiplas fontes, de forma escalável e sem perda de informação. Este serviço permite a criação de fluxos de processamento real-time de streams de dados.
Figura 4 – Ingestão de dados com o Amazon Kinesis
Mídias
Os desenvolvedores de aplicativos móveis, dão prioridade à diferenciação da experiência do usuário no seu aplicativo. Atingir esse objetivo, geralmente requer a utilização de uma grande quantidade de conteúdos multimídia; o que vale a pena, se o desempenho é mantido a um baixo custo. Essas estratégias requerem um correto balanceamento entre o que é armazenado no dispositivo, que pode ser mostrado rapidamente pelo fato de ficar local, porém os recursos são limitados; e o armazenamento na nuvem, onde temos recursos virtualmente ilimitados, porém temos que nos apoiar numa estratégia de entrega de conteúdo para não afetar a performance.
Figura 5 – Entrega de conteúdo por aplicativo
- Amazon Simple Storage Service (S3). O armazenamento das mídias precisa estar sempre disponível e operar de maneira escalável com baixo. Para esse fim, AWS oferece Amazon S3, que é um serviço de armazenamento de objetos via web onde o usuário é cobrado somente pela utilização de recursos. O serviço foi desenhado para ter alta durabilidade, disponibilidade e escalar a sua capacidade dependendo da demanda de recursos.
- Amazon CloudFront. Como foi comentado anteriormente, armazenar esses recursos num lugar remoto, traz uma necessidade adicional de performance que pode impactar a experiência do usuário. Para acelerar a entrega de conteúdo armazenado na nuvem, AWS oferece um serviço de CDN (Content Delivery Network) chamado Amazon CloudFront. Esse serviço faz uso da rede global de pontos de presença (edges), que armazenam no cache próximos aos visualizadores, cópias dos arquivos com mais solicitações. Semelhante a outros serviços AWS, Amazon Cloudfront é uma oferta self-service, cobrada pelo uso, sem exigência de compromissos de longo prazo ou taxas mínimas de utilização.
Lógica da aplicação
As aplicações móveis frequentemente precisam interagir com serviços externos via internet, ou recursos com maior capacidade de computação que a disponível nos dispositivos. A ampla diversidade de serviços acessados através da internet, enriquecem as funcionalidades que um aplicativo móvel pode oferecer. Por essa razão, é cada vez mais frequente que um aplicativo móvel seja composto de um front-end local e um mix de back-end remoto e local, pelo fato de ter cada dia as redes móveis tornem-se mais evoluídas e confiáveis.
Figura 6 – Backends na AWS
- AWS Lambda. Pensando na lógica do aplicativo, a Amazon Web Services, oferece um serviço gerenciado de computação baseado em eventos chamado AWS Lambda. Este serviço permite que você execute seu código Java, Node.js ou Python somente quando é solicitado, sem a necessidade de gerenciar servidores e pagando apenas pelos recursos usados no momento da execução. AWS Lambda permite usar os recursos de maneira granular e otimizada, mantendo alta disponibilidade e escalabilidade.
- MBaaS. Os desenvolvedores móveis estão usando a Amazon Web Services para criar a lógica por tras das funcionalidades da sua aplicação, usando serviços de computação administrados. Tem surgido um padrão de arquitetura conhecido como Back-end móvel como serviço, ou MBaaS (Mobile Backend as a Service). Como desenvolver usando esse padrão na AWS, e um exemplo dele, está disponível no seguinte link: http://awshub.com.br/resources/mobile-backend-as-a-service-padrao-de-arquitetura/
Mensagens móveis
No desenvolvimento móvel, as comunicações entre o back-end e o usuário podem ser um assunto difícil de ser tratado, devido aos requerimentos e custos das ferramentas tipicamente usadas para notificações via Push ou SMS.
Figura 7 – Endpoints disponíveis no Amazon SNS
- Amazon Simple Notification Service (SNS). Amazon SNS é um serviço gerenciado que permite fácil implementação de um sistema de notificações para a sua aplicação, usando um modelo pub-sub. Integrado com as principais soluções de notificação existentes como o envio de notificações Push para Apple, iOS, Android, Amazon Kindle Fire, Windows Desktop e Windows Phone; também para destinos como filas de Amazon SQS, funções AWS Lambda, endereços email, SMS (agora disponível em mais de 200 países) e endpoints HTTP. Esse serviço facilita o trabalho do desenvolvedor móvel, pois centraliza o gerenciamento em uma única ferramenta de notificações projetada para funcionar de forma escalável, durável e disponível.
Ferramentas para o desenvolvimento móvel na AWS
Nas seções anteriores, foi mostrado como a AWS conta com serviços gerenciados que podem suprir necessidades comumente usadas no back-end de aplicativos móveis. Nesta seção, vamos apresentar as diferentes maneiras de usá-las, e como aproveitar ferramentas que facilitam o desenvolvimento móvel integrado com os serviços da AWS.
Os serviços da AWS podem ser acessados através de uma API REST, que permite integrar facilmente e de maneira programática, um aplicativo com ações aos serviços AWS de forma segura. Porém, o desenvolvimento móvel possui alguns requisitos diferentes como: baixa confiabilidade de rede, necessidade de uma camada de proxy para realizar e controlar as chamadas nas APIs em nome do dispositivo, recursos locais limitados, entre outros. Pensando nisso, a AWS oferece o Mobile SDK, disponível para Android, IOs, Xamarin, Unity e JavaScript; cujo objetivo é facilitar a interação entre o dispositivo e as APIs dos serviços AWS. Alguns benefícios adicionais ao usar o AWS Mobile SDK, são:
- Integração completa e otimizada com as diferentes plataformas disponíveis.
- Gerenciamento automático de intermitências de rede.
- Uso reduzido de recursos no dispositivo (São inclusos somente os recursos necessários do SDK).
- Método único de autenticação para interação com os serviços AWS.
- Inclui uma ampla variedade de códigos de exemplo para facilitar o uso destas ferramentas.
¿Por onde começar?
Já vimos os benefícios de aproveitar serviços gerenciados da AWS para criar facilmente aplicativos móveis. Agora temos que dar o primeiro passo que permita rapidamente ganhar experiência com esses conceitos. Assim, a AWS anunciou no re:Invent 2015, o AWS Mobile HUB.
Esse serviço simplifica o processo de criação, build de código, teste e monitoramento de aplicações móveis, gerando um código Android, iOS Objective-C ou iOS Swift, de um aplicativo completamente funcional, que pode ser testado sem mudanças de código num dispositivo real. Isso quer dizer que através da console do AWS Mobile Hub, é possível escolher os serviços AWS, os quais serão integrados, configurá-los e automaticamente gerar um código inicial como ponto de partida para um aplicativo móvel. Para mostrar como é esse processo, vamos apresentar um passo a passo para a criação de uma aplicação base que use diferentes serviços AWS.
AWS Mobile Hub – Olá Mundo
Neste tutorial, será utilizada a autenticação de usuários via Amazon Cognito, com a funcionalidade “User Sign-In” e o armazenamento de objetos no Amazon S3 dos usuários.
1.Acessamos a console do AWS Mobile Hub: https://console.thinkwithwp.com/mobilehub/
2. Se essa é a sua primeira vez no serviço, temos que conceder permissões ao serviço para ele poder realizar tarefas como criação de roles IAM automaticamente.
3. Selecionar a opção “Yes, grant permissions” o que criará uma role IAM com as permissões necessárias.
4. Escolhemos um nome para o projeto que vai ser criado no serviço e selecionamos “Create project”.
5. No passo seguinte, podemos escolher incluir ou não funcionalidades ligadas a serviços AWS descritos nos segmentos anteriores desse documento. Segundo a nossa intenção de aplicativo, usaremos uma ou várias funcionalidades do menu.
6. Selecionamos “User Sign-In”.
7. Neste passo podemos escolher três tipos de autenticação: Obrigatória, opcional e Não requerida. Neste exemplo será usado Autenticação opcional.
8. Escolhemos o provedor de identidades que vamos usar. Entre as opções disponíveis encontramos Facebook, Google+ e por enquanto uma terceira opção de um provedor de identidades próprio baseado em OpenID. Neste tutorial será usado o Facebook
9. Temos que obter o “Facebook App ID” no site de desenvolvimento do Facebook seguindo as instruções no painel direito da console de AWS Mobile Hub.
10. Uma vez temos o ID, colamos o ID no campo e selecionamos “Save changes”.
11. Uma vez realizados as alterações, vamos ver a mensagem: “Your changes have been saved”. Seguido, selecionamos a opção “Configure more features” para acrescentar mais funcionalidades.
12. De volta no painel principal, adicionamos uma outra caraterística selecionando o botão “User Data Storage”
13. No menu “User Data Storage” selecionamos o botão “Store user data”
14. Selecionamos “Save changes”.
15. Então finalizamos a configuração das funcionalidades desejadas do nosso aplicativo, e podemos selecionar o botão “Build your app” para criar o código da aplicação, o que apresentará o menu que permite escolher a plataforma.
16. Neste tutorial, vamos selecionar o Android. O resultado disso será o passo a passo desde o inicio que temos que seguir para baixar e abrir o código gerado no IDE de preferência.
17. Completado o passo a passo de implantação, teremos o pacote da aplicação baixado e aberto no Android Studio para esse exemplo.
18. Por fim, selecionamos o projeto Android e iniciamos uma execução no “Debug Mode” o que executa o projeto no emulador como uma aplicação 100% funcional, sem necessidade de fazer nenhuma alteração no código.
Resultados
Conseguimos ver que em poucos minutos criamos, abrimos e executamos um aplicativo móvel para Android, com as funcionalidades do back-end selecionadas e configuradas para aproveitar os serviços da AWS: Amazon S3 e Amazon Cognito. O seguinte diagrama, mostra a arquitetura do aplicativo criado:
AWS Mobile Hub criou os seguintes recursos no nosso nome:
- Bucket de Amazon S3 privado com dois diretórios nele: “/public” e “/private”
- Identity pool do Amazon Cognito associado ao controle de identidades do Facebook
- Uma Role de AWS IAM que permite acesso em todo recurso dentro do diretório “/public”.
- Uma Role de AWS IAM que permite acesso em todo recurso dentro do diretório “/private” e “/public”.
Assim, quando um usuário não está autenticado, ele assume a Role IAM com acesso unicamente no diretório “/public”; e sendo um usuário autenticado, ele assume a Role IAM com acesso em ambos diretórios “/public” e “/private”.
Próximos passos
Durante esse tutorial criamos uma aplicação que usa o Amazon Cognito para autenticar e autorizar usuários para que possam acessar diretamente os recursos privados no Amazon S3. Esse exemplo é básico, porém é um fácil e rápido ponto de partida para milhares de aplicações que podem ser criadas usando esta arquitetura, como:
- Aplicação de álbum de fotos para viajantes
- Aplicação de armazenamento de documentos na nuvem de forma segura
- Aplicação financeira para guarda de recibos
- Aplicação de seguros para reporte de colisões de veículos
- Aplicação de governo para reporte de ruas em mal estado
- Aplicação para jornalistas onde entregam as notas para o back-end desde seu dispositivo móvel
- Entre muitas outras.
Agora preparamos rapidamente o código fonte dessa aplicação móvel inicial, é possível focar na melhoria da interação com o usuário, problemas do negócio e diferenciação do aplicativo no mercado.
No próximo post, vamos rever como AWS facilita também a execução de testes da aplicação em dispositivos reais, uma vez a nossa fase de desenvolvimento foi concluída.