LocalStack: usando S3, AWS Secret Manager, AWS Parameter Store e Spring Boot com a API Oficial da Marvel

Antes de Começar

Recomendo a leitura do artigo abaixo antes de iniciar:

Introdução

As aplicações e microsserviços precisam usar configurações para a sua execução. Em aplicações desenvolvidas com o Spring Boot, as configurações ficam em arquivos de propriedades e caso tenha a necessidade de alterar essas configurações, devemos efetuar o empacotamento e o deploy da aplicação para que as alterações entre em vigor.

Usando um sistema de configuração externa podemos evitar o problema de efetuar o empacotamento da aplicação.

Para isso, entra em cena o AWS Secrets Manager e o AWS Parameter Store.

Os dois tem como objetivo armazenar chaves, senhas, api keys, url de banco de dados e outras configurações.

A principal diferença entre eles é o custo, o processo de rotação de senhas e de chave que o AWS Secrets Manager possui. O AWS Parameter Store é totalmente gratuito na AWS.

Para maiores informações:

O AWS S3 é um sistema de armazenamento de arquivos para diversos fins.

Para maiores informações:

Nas próximas seções, vamos configurar a nossa aplicação para acessar os serviços da AWS listados anteriormente.

Dependências da Aplicação

No pom.xml da sua aplicação, incluir as seguintes dependências:

Configurando o usuário da AWS

Usando o AWS Cli, execute o seguinte comando:

aws configure --profile localstack

Vamos configura um usuário fake da AWS para acesso ao LocalStack.

Podemos preencher o Access Key e o Secret Access com valores somente para teste:

Importante informar a região us-east-1 pois a biblioteca do Spring Cloud usa essa região como default quando sobrescrevemos a url dos serviços.

Padrão das Configurações

1 — Secrets Manager

As chaves do Secrets Manager para o Spring Cloud segue um padrão de nome conforme abaixo:

  • /secret/application — configuração para todas as aplicações em execução na AWS;
  • /secret/application_production — configuração para todas as aplicações em execução que tenha o Profile production;
  • /secret/application-name— configuração especifica para uma aplicação. O application-name é configurado através da propriedade spring.application.name;
  • /secret/application-name_production — configuração especifica para uma aplicação. O application-name é configurado através da propriedade spring.application.name e Profile production.

Dentro de cada item especificado acima, será incluído um JSON com todas as chaves especificas da configuração da aplicação.

Para maiores detalhes seguir a documentação do Spring Cloud AWS para o Secrets Manager:

2 — Parameter Store

As chaves do Parameter para o Spring Cloud segue um padrão de nome conforme abaixo:

  • /config/application — configuração para todas as aplicações em execução na AWS;
  • /config/application_production — configuração para todas as aplicações em execução que tenha o Profile production;
  • /config/application-name — configuração especifica para uma aplicação. O application-name é configurado através da propriedade spring.application.name;
  • /config/application-name_production — configuração especifica para uma aplicação. O application-name é configurado através da propriedade spring.application.name e Profile production.

Para maiores detalhes seguir a documentação do Spring Cloud AWS para o Parameter Store:

Configurando as Chaves

Antes de iniciar a execução da aplicação, crie as respectivas chaves e o bucket no S3:

Configurando a URL do LocalStack

No arquivo bootstrap.yml, configure a URL do LocalStack para que o Spring Cloud AWS acessa as configurações e disponibilize para a aplicação:

As configurações abaixo serão obtidas automaticamente pelos Secrets Manager ou pelo Parameter Store:

Gravando Arquivos no Bucket S3

Para gravar arquivos no bucket S3, iremos usar a interface ResourceLoader. Essa interface tem como objetivo, obter informações de arquivos do sistema operacional, classpath ou de outras origens.

No nosso caso essa interface irá gravar um arquivo no bucket S3. Quando especificamos o caminho s3://bucket/arquivo o objeto é gravado diretamente no S3:

Conclusão

O Spring Boot juntamente com o Spring Cloud AWS, possui recursos necessários para acessar serviços da AWS sem a necessidade de grandes configurações ou mudança do nosso código fonte, tornando a aplicação agnóstico a ambiente. No nosso exemplo se precisássemos efetuar o deploy, por exemplo na Azure, mudaríamos somente as configurações e o caminho do S3 para o respectivo serviço na Azure.

Repositório do GitHub

O código fonte desse artigo:

--

--

📺+ de 20 anos gerando código fonte em Java, Arquiteto Java, Desenvolvedor Java, Professor Universitário e Colecionador de Videogames

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store