LocalStack — Testando serviços AWS
Originalmente criado pela Atlassian, porém agora desenvolvido e mantido de forma independente, o LocalStack permite que serviços da AWS sejam emulados diretamente no seu computador. Para aqueles que querem aprender e testar os serviços da AWS, isto é perfeito para praticar sem medo de vir aquele valor surpresa na fatura do cartão. Para aqueles que já utilizam AWS em seus projetos, podem utilizar esta ferramenta para melhorar a qualidade de sua aplicação, visto que é possível utilizar nos testes automatizados.
Serviços compatíveis
No momento que escrevo este post, os seguintes serviços são emulados pelo LocalStack, abaixo a lista com cada serviço e a porta no qual ele roda:
- API Gateway: http://localhost:4567
- Kinesis: http://localhost:4568
- DynamoDB: http://localhost:4569
- DynamoDB Streams: http://localhost:4570
- Elasticsearch: http://localhost:4571
- S3: http://localhost:4572
- Firehose: http://localhost:4573
- Lambda: http://localhost:4574
- SNS: http://localhost:4575
- SQS: http://localhost:4576
- Redshift: http://localhost:4577
- ES (Elasticsearch Service): http://localhost:4578
- SES: http://localhost:4579
- Route53: http://localhost:4580
- CloudFormation: http://localhost:4581
- CloudWatch: http://localhost:4582
- SSM: http://localhost:4583
Observação: Não mostramos neste post, porém é possível configurar cada serviço e porta independentemente.
Como eu uso?
Para demonstrar como funciona, o tutorial esta dividido em três etapas:
- Instalação do serviço
- Inicialização do serviço
- Exemplo de uso
Observação: Nas duas primeiras etapas, será abordado os problemas que ocorreram comigo e o que eu fiz para solucionar.
1 — Instalação do serviço
Antes de instalar, tenha certeza que possui os seguintes requisitos:
- Python(ambos 2.x e 3.x)
- pip
- npm
- java/javac (Java 9)
- Mvn
Após confirmado, execute os seguintes comandos:
1 - Crie e ative um virtual enviroment com Python3.5:
2 - Com o virtual enviroment habilitado, execute o comando pip para instalar o serviço:
Possíveis problemas
Durante a minha instalação do serviço, ocorreram alguns problemas, abaixo vou descrever cada um deles e demonstrar como avancei.
Primeiramente, caso ocorra qualquer problema durante instalação do serviço, revise as versões dos requisitos, demonstrado na Figura 1. Durante a elaboração deste tutorial, eu instalei o LocalStack em dois computadores diferentes, ao tentar instalar no segundo, ocorreu um erro que só foi solucionado ao atualizar a versão do pip para a mesma do computador anterior.
Caso ocorra erro de permissão, como o demonstrado na Figura 2. Tenha certeza que foi habilitado o seu VirtualEnv com Python 3.5.
Caso ocorra um erro referenciando a falta do arquivo Python.h, como demonstrado na Figura 3. Rode o seguinte comando:
2 — Iniciando serviço
Após instalado, inicie o serviços com o comando:
Possíveis problemas
A inicialização do serviço deve demorar dependendo da velocidade da sua conexão, pois serão baixados diversos pacotes para cada serviço. Caso ocorra algum erro, como o ilustrado na Figura 4, pare a execução (Ctrl + C) e inicie novamente em modo Debug, com o comando abaixo:
Uma vez executado o comando, o erro deve ocorrer novamente, porém dessa vez é possível identificar o problema, conforme é ilustrado na Figura 5. No meu caso, o arquivo DynamoDBLocal.jar estava corrompido. Para resolver, eu exclui os pacotes baixados para forçar uma nova tentativa:
Exemplo de uso
Agora com o LocalStack instalado e rodando, vamos testar ele com um exemplo simples, se quiser pode acompanhar pelo repositório no GitHub.
No exemplo, utilizei a SDK de Python oficial da Amazon(boto3) para:
- Criar uma fila no SQS
- Criar uma tabela no DynamoDB
- Enviar mensagens para fila SQS
- Ler as mensagens da fila SQS
- Gravar os dados no DynamoDB
- Ler os dados do DynamoDB
No arquivo main.py é possível verificar cada um dos passos:
O código para consumir os serviços emulados é exatamente o mesmo para utilizar os da própria AWS. A unica diferença é o endpoint_url. Isto é possível notar no arquivo sqs_wrapper.py, lá é apontado para o endpoint do SQS do LocalStack (http://localhost:4576/).
Observação: No início do post é listado todos os serviços e suas respectivas portas default.
Caso você tenha clonado o repositório do GitHub e quer ver o resultado, rode o comando abaixo:
Após rodado, será criado uma tabela DynamoDB e uma fila SQS no seu LocalStack. É possível visualizar tais recursos em um Dashboard. Para isto abra outra aba no terminal e execute o seguinte comando:
Após executado, você pode acessar a url http://localhost:8080 no seu browser.
Conforme é possível observar na Figura 6, o Dashboard apresenta uma visão geral dos serviços criados no LocalStack. Note que esta selecionado a fila “teste” do SQS e o painel à direita apresenta informações importantes, como por exemplo o ARN(Amazon Resource Name). O ARN é o identificador de cada recurso criado, é útil para os casos de um serviço que se relaciona com outros ( como por exemplo um tópico SNS e uma fila SQS).
E o que mais?
O LocalStack abre um leque de opções de uso. Ficou mais fácil e barato desenvolver e testar suas aplicações, agora não precisa mais criar recursos na Amazon somente para testar funcionalidades ainda em desenvolvimento. Ele também auxilia nos testes automatizados, visto que é possível utilizar como um mocking framework. Por fim, o LocalStack também auxilia aqueles que querem estudar AWS e ficar livre do receio de vir aquela conta surpresa no final do mês.
Uma coisa importante para se notar é que o LocalStack não persiste os dados. Assim que o serviço para de rodar, os recursos criados são perdidos. Atualmente, o LocalStack tem somente versão Free, porém já temos um spoiler ao acessar o site oficial e notar que está previsto uma versão “Pro Edition”. Dentre as diversas diferenças entre as versões, a “Pro Edition” possui como um dos diferenciais a persistência de dados.
É interessante, aparentemente a proposta deles é você poder ter uma nuvem privada. Fiquei curioso para estudar os possíveis casos de uso quando esta nova versão sair.
Se quiser trocar uma ideia ou entrar em contato comigo, pode me achar no Twitter (@e_ferreirasouza) ou Linkedin.
Grande abraço e até a próxima!