Centralizando as Configurações na AWS com Parameter Store e Spring Boot — Part 1
O que vamos abordar?
- Um dos 12 fatores para sua aplicação rodar na nuvem => Configuração Centralizada
- Spring Cloud AWS e AWS Parameter Store como centralizador de Configuração
- AWS Secrets Manager como gerenciador de segredos e atualização das Configurações com a aplicação On-The-Fly.
Configurações
Configurações da Aplicação é algo que veio evoluindo com a necessidade e o passar do tempo. Com o surgimento da Cloud e com a possibilidade de trabalharmos com vários ambientes (desenvolvimento, homologação e produção), podendo ser IAAS, PAAS, SAAS, FAAS, BAAS e foi ficando cada vez mais complexo gerenciar essas configurações, e para adicionar um pouco mais de complexidade temos escalabilidade horizontal, Blue-Green, Canary-Release, metodologia agile…
Pensando nisso um grupo de desenvolvedores criaram os 12 fatores para a sua aplicação rodar na nuvem. E Configurações é um desses 12 fatores.
Spring
Você pode utilizar arquivos de properties para gerenciar essas configurações de aplicação criando uma para cada ambiente, no Spring temos o application.properties ou application.yml que facilita muito nossa vida (nem sempre foi assim).
Em uma arquitetura de Cluster, ao alterar a configuração de um microservice, todas as instâncias devem ser alteradas. Nesse caso se você tem as configurações centralizadas, seria legal se as instâncias fossem atualizadas On-The-Fly? Se você utiliza o ecossistema Spring, uma opção seria o Spring Cloud Config Server.
Nesse post vamos abordar o AWS ParameterStore para centralizar nossas configurações.
Spring Cloud AWS
A Amazon fornece SDK em várias linguagens de programação para se comunicar com sua infraestutura, pensando nisso o Spring Cloud fornece modulos para se integrar com a infraestrutura da AWS de uma maneira muito transparente (Spring é Spring neh hauhauha).
Como utilizaremos o ParameterStore para centralizar nossas properties vamos utilizar o Spring Cloud AWS Parameter Store Config (6 palavras pra uma lib haha).
Vamos criar uma aplicação no Spring Initializr. Caso queira saber mais detalhes em criar uma aplicação Spring acesse esse => Post.
Vamos Adicionar a dependência abaixo no nosso pom.xml.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-aws-parameter-store-config</artifactId>
</dependency>
Se você tem familiaridade com o Ecossistema Spring ou já desenvolveu utilizando o Spring Cloud Config Server, sabe que precisamos no lugar no application.properties utilizar o bootstrap.properties para buscar as configurações em um git ou algum outro repositório. Utilizando Spring Cloud AWS Parameter Store Config é exatamente da mesma maneira.
Então vamos renomear o application.properties, mas vamos renomeá-lo utilizando o formato yaml.
boostrap.yml
Separei o arquivo em dois profiles, o default e o develop. No default estamos utilizando a property aws.paramstore.enabled=false, para desativar o Parameter Store Configuration e rodar a aplicação na nossa máquina.
No bootstrap.yml temos algumas convenções que iremos abordar mais a frente.
Vamos criar um outro arquivo para pegar essas configurações rodando a aplicação local.
application.yml
spring:
application:
name: demo-app-store-config
profiles: default, localcustomer:
name: Jonh
age: 27
Adicionei no application.yml duas properties que iremos injetar em algum ponto da nossa aplicação, o customer.name=Jonh e o customer.age=27.
Vamos criar um Controller e injetar essas properties como atributos da classe e criar uma API REST retornando os valores.
@RestController
@RequestMapping
public class CustomerController { @Value("${customer.name}")
private String name; @Value("${customer.age}")
private String age; @GetMapping
public List<String> get() {
return List.of(name, age);
}}
Vamos iniciar a aplicação e acessar o endpoint http://localhost:8080.
AWS Parameter Store
É um produto da AWS onde podemos armazenar e gerenciar configurações e segredos utilizados pelas nossas aplicações. Os valores podem ser criptofados ou não. É possível recuperar os parametros pela sua API ou utilizando o SDK. Para saber mais acesse https://docs.aws.amazon.com/pt_br/systems-manager/latest/userguide/systems-manager-parameter-store.html
Vamos criar as mesmas properties customer.name e customer.age no Parameter Store no console da AWS em AWS System Manager no menu lateral esquerdo.
Clique em Create Parameter e vamos criar os dois parametros.
Vamos adicionar primeiro o customer.name e preencher o formulário com Name, Description, Type, Data Type e Value.
Lembra quando mencionei que existia uma convenção no bootstrap.yml? No Name o Spring Cloud AWS Parameter Store Config utiliza o prefixo /config/{spring.application.name}_{spring.profiles}/ e o atributo concatenado para buscar esses parametros. Então o Name ficou assim:
/config/demo-app-store-config_develop/customer.name
Por default o /config como prefixo inicial, / o nome da aplicação que definiu no seu bootstrap.yml, _ o profile e / sua property.
Caso você já tem algum parametro criado fora desse padrão você pode substituir esses prefixos utilizando properties no próprio boostrap.yml.
Clique em Create Parameter e basta repetir os passos para o customer.age.
Ao rodar a aplicação no EC2 acessei o Endpoint http://ec2-3-237-83-34.compute-1.amazonaws.com:8084/
Para rodar a aplicação no EC2 criei uma imagem docker e subi no DockerHub https://hub.docker.com/repository/docker/diegolirio/demo-app-store-config
E com o docker-compose.yml subi a aplicação https://github.com/diegolirio/aws/blob/master/devops/docker-compose-demo-paramstore.yml
Podemos utilizar também o AWS Secrets Manager para cadastrar dados sensiveis como senhas. Mas isso fica para um próximo post ;-)
Se esse post agregou algum conhecimento For You, deixe seu aplausinho!
Valeuuuu ;-)
Github:
https://github.com/diegolirio/aws/tree/master/demo-app-store-config
Ref.: