Deploy automático para AWS Solutions — Serverless Image Handler

João Golias
Outsmart Digital
Published in
5 min readOct 18, 2020

AWS Solutions é um conjunto de referências de implementações técnicas feito por arquitetos e parceiros da AWS, com o objetivo de ajudar clientes a resolver os problemas mais comums encontrados ao redor do mundo. Eles são muito fáceis de usar e configurar através do console da AWS, sendo muito usados pelo mundo inteiro. Contudo, encontrar uma forma de automatizar o processo de deploy não é um trabalho fácil. Esse artigo traz um exemplo disso para um dos serivços da AWS Solutions: Serverless Image Handler.

AWS Serverless Image Handler

Aplicações recentes que desejem crescem o número de seus usuários continuamente devem encontrar um problema difícil: variedade de tecnologia pelo mundo. Cada usuário tem um ambiente específico no qual o nosso código vai rodar: seu dispositivo (celular, computador, etc), sua internet, seu conhecimento tecnológico. Tudo isso é tão presente que enfrentamos problemas de performance em diversas situações. Uma delas é quando lidamos com qualidade de imagens.

Uma funcionalidade que requeira mostrar várias imagens de uma vez deve tomar tempos diferentes de execução, dependendo da situação do usuário. Uma estratégica muito comum para evitar isso é mudar a qualidade das imagens para alguns ambientes. Costumávamos ter que criar toda infraestrutura e código para isso por nós mesmos, até que AWS Solutions trouxe o Serverless Image Handler. Basicamente, ele consiste de uma função da AWS Lambda (com logging, distribuição, policies e mais) que utiliza Sharp para processar as imagens. Ele também deploya um ambiente de demonstração para mostrar como tudo isso funciona. Abaixo, há um diagrama completo com todos os serviços.

Diagrama do AWS Serverless Solution Handler

AWS já escreveu um artigo com o passo a passo sobre o deploy dessa solução através do console da AWS. Para entender essa documentação, vamos falar sobre CloudFormation.

CloudFormation

CloudFormation é um serviço que nos permite gerenciar toda a stack de infraestrutura na AWS e em outros provedores. Nós podemos usar arquivos JSON ou YML desde que sigamos a sua própria sintaxe. Esse tipo de arquivo é bem difícil de ser compreendido devido a sua verbosidade. Por isso, seria muito trabalhoso tentar transformar o diagrama anterior diretamente em um arquivo aceito pelo CloudFormation.

Bem, então, vamos dar mais uma chance para o console da AWS. Se você seguir os passos do artigo da AWS, você vai ser direcionado para uma página do CloudFormation com alguns valores pré-configurados. Isso acontece porque AWS já forneceu um arquivo de template JSON/YML com a sintaxe aceita pelo CloudFormation, que pode ser encontrado nesse link. Também coloquei-o em um gist (que é muito longo para ser colocado diretamente nesse artigo). Como você pode ver, seria impossível criá-lo do zero.

Existem várias formas de automatizar o deploy se tivermos um arquivo JSON/YML que o CloudFormation aceita. Descrevo dois abaixo.

AWS CLI

AWS possui um conjunto de comandos que nos permite comunicar com os seus serviços através do terminal. Para criar uma stack, nós devemos usar aws cloudformation, fornecendo um nome e um path (ou URL) do arquivo com o template descrevendo todos os serivços a serem criados, como mostrado abaixo:

Atente-se a dois detalhes:

  1. Você deve ter a aws-cli instalada e configurada (usando aws configure). Mais informações sobre a sua configuração podem ser encontradas aqui.
  2. Nós devemos utilizar a opção capabilities com o valor CAPABILITY_NAMED_IAM. Isso é necessário porque o template do CloudFormation que estamos usando precisa criar recursos que afetam permissões na conta da AWS. Se você deseja aprender mais sobre o create-stack, pode acessar esse link.

Serverless Framework

Serverless é um método de prover serviços de infraestrutura "à demanda". Ao utilizá-lo, o provedor de serviços Cloud se torna responsável por gerenciar o nosso servidor. Como exemplo, a AWS Lambda deve ser o serviço mais famoso da AWS que utiliza esse método. Ela nada mais é do que uma função (escrita em Node, Java, Python ou outras) que pode ser ligada a outros serviços da AWS (AWS API Gateway, AWS S3, AWS Cloud Watch e muito mais), permitindo-nos a construir aplicações complexas.

Um projeto que segue a Arquitetura Serverless pode utilizar o Serverless Framework para automatizar seus deploys e outros processos. A configuração desse framework é realmente fácil: você só precisa ter a serverless cli instalada e criar um arquivo serverless.yml. Nesse arquivo, você pode descrever:

  1. Todas as funções de lambda que devem ser deployadas;
  2. Variáveis de ambiente essenciais;
  3. Serviços que a sua aplicação necessita; e muito mais

Para criar novos serviços, você só precisa criar uma seção de recursos no seu arquivo serverless.yml, e utilizar a sintaxe de templates da CloudFormation (para arquivos YML) para descrever os serviços. Um exemplo disso é mostrado abaixo, mas ele cria uma tabela do DynamoDB (banco de dados não relacional da AWS) em vez do Serverless Image Handler (somente porque seria muito longo para colocar diretamente nesse artigo). Se você quer utilizar essa abordagem, você pode encontrar a sintaxe YML completa para o Serverless Image Handler na página de designer do CloudFormation or nesse link do gist.

Lembre que você deve fornecer as credenciais da AWS antes de usar o comando sls deploy para criar todos os serviços. Dê uma olhada nesse link se precisar de ajuda com isso.

Eu gostaria de apresentar mais uma (e última) forma de deployar o AWS Serverless Image Handler: Terraform

Terraform

Terraform é uma ferramenta de construir, gerenciar e versionar a infraestrutura de nossas aplicações de uma forma segura e eficiente. Ela provê uma API robusta para vários provedores de serviços Cloud, como a AWS. As sintaxes dessas APIs são muito mais simples do que a sintaxe de template do CloudFormation, contudo Terraform ainda não lançou uma sintaxe específica para o AWS Solutions até agora (10/2020),

Então, por ora, devemos criar, com o Terraform, uma stack do CloudFormation que contenha o mesmo template que usamos antes. Veja abaixo um exemplo:

A propriedade template_body usa a sintaxe heredoc. Isso faz com que tenhamos que fazer uma pequena mudança no template do CloudFormation, porque ele utiliza uma sintaxe que o heredoc também, quando descreve os seus outputs. Essa sintaxe é "$variable" que permite referências para variáveis do Terraform dentro de uma string. Veja abaixo:

Um erro de "variável não encontrada" pode ocorrer quando você tentar aplicar as mudanças do seu Terraform. Para evitar isso, basta adicionar $ no início da string, porque heredoc irá interpretá-lo como um simples caractere '$'. Um gist completo com essas correções pode ser encontrado aqui.

Conclusão

Esse artigo tenta explicar como deployar o serviço AWS Solutions — Serverless Image Handler de três formas: AWS CLI, Serverless Framework e Terraform. Contudo, eles podem ser usados para qualquer serviço da AWS Solutions, desde que tenhamos o template do CloudFormation que descreva todos os serviços necessários.

Se você não usa nenhuma das últimas duas últimas formas, a melhor opção talvez seja o AWS CLI, porque é uma forma oficial e deve ser mais fácil de achar suporte para ele. Entretanto, se o seu projeto já usa o Serverless Framework ou o Terraform, seria melhor não configurar uma forma diferente somente para deployar um serviço da AWS Solutions.

Read this article in English here

--

--