Tutorial: Configurando aplicação Spring Boot para publicar mensagens em tópico do AWS SNS

Arquitetura com AWS ECS, IAM Role, e tópico do AWS SNS

O que é AWS SNS:

A utilização de tópicos do AWS SNS pode ser uma estratégia muito interessante no desenvolvimento de sistemas com microsserviços. Este tutorial trata da configuração de uma aplicação Spring Boot para a utilização desse tipo de serviço, utilizando o AWS SDK.

Propriedades de configuração do Spring Boot:

Tendo construído o projeto da aplicação Spring Boot, abra o arquivo application.properties para a criação de duas variáveis que serão utilizadas para a configuração mais adiante. São elas:

  • Região da Amazon Web Services;
  • ARN do tópico SNS.

A primeira variável será responsável por configurar o cliente do SNS da aplicação Spring Boot, sobre qual é a região em que está em execução.

A segunda variável é o Amazon Resource Name, ou apenas ARN, que é o endereço que representa o tópico que foi criado no AWS SNS.

Veja como deve ficar essas duas variáveis no arquivo application.properties:

Os nomes dessas variáveis podem ser definidas como o desenvolvedor desejar, porém o formato com "." facilita a criação das variáveis de ambiente a serem passadas para a tarefa que será executada no serviço do AWS ECS.

Para construir a infraestrutura do tópico SNS, bem como configurar as permissões de acesso a ele e configurar a aplicação através de variáveis de ambiente, consulte este tutorial.

Configurando o cliente do AWS SNS:

Para criar o cliente do SNS na aplicação Spring Boot, é necessário adicionar a biblioteca do AWS SDK no arquivo build.gradle, como no trecho a seguir:

Com as variáveis do arquivo application.properties e a bibliteca adicionada no arquivo build.gradle, é possível criar a classe de configuração para o cliente do SDK e a representação do tópico do SNS.

Para isso, crie um arquivo chamado SnsConfig.java, como no trecho a seguir:

Perceba que a classe SnsConfig está anotada com @Configuration. Essa é a forma de indicar ao Spring Boot que essa se trata de uma classe de configuração, e que deve ser executada durante o processo de inicialização da aplicação.

Veja que os dois atributos da classe estão anotados com @Value. Esses dois atributos receberão os valores das variáveis criadas no arquivo application.properties, como mostrado anteriormente.

Os valores desses dois atributos serão definidos pelas variáveis de ambiente da tarefa em execução no serviço do AWS ECS, ou seja, eles serão contextuais à região em que a aplicação estiver de fato em execução.

Essa estratégia de variáveis de ambiente permite que a configuração da aplicação Spring Boot fique independente do ambiente ou região da Amazon Web Services que ela é executada.

Ainda dentro dessa classe, construa o método que irá criar e expor o cliente do AWS SNS através de um bean do Spring Boot, como no trecho a seguir:

O cliente do AWS SNS, retornado por esse método, será utilizado no publicador de eventos, que será criado mais adiante nesse tutorial.

Veja que o atributo awsRegion é utilizado para configurar o cliente do AWS SNS com a região em que a aplicação está em execução.

Representando o tópico do AWS SNS:

O último método a ser construído nessa classe é o que irá criar a representação do tópico do AWS SNS, como pode ser visto no trecho a seguir:

Note que o atributo productEventstopic é utilizado para passar o ARN desse tópico, recebido como parâmetro no arquivo application.properties.

Perceba também que o bean criado nesse método possui um nome, que é productEventsTopic. Essa é uma estratégia útil quando se tem mais de um tópico na mesma aplicação. Com esse nome, será possível especificar claramente qual tópico deve ser utilizado para publicar alguma mensagem, como será visto mais adiante.

Criando o publicador de mensagens no tópico:

Tendo tudo configurado no projeto do Spring Boot, crie o arquivo ProductPublisher.java, que conterá o serviço para publicar de fato as mensagens no AWS SNS:

A classe ProductPublisher é anotada com @Service, indicando ao Spring Boot que ela deve ser tratada como um service, capaz de ser injetado em outros componentes, como controllers.

Veja que o cliente do SNS e o tópico, criados na classe de configuração SnsConfig, são injetados no construtor de ProductPublisher. Repare também que o nome que representa o tópico a ser utilizado aqui é passado como parâmetro da anotação @Qualifier, indicando o tópico específico.

Esse dois atributos do construtor já foram construídos e configurados em SnsConfig, e podem ser reutilizados em qualquer parte do projeto.

Publicando de mensagens no tópico SNS:

Por fim, crie um novo método na classe ProductPublisher, para de fato publicar mensagens no tópico SNS, utilizando o cliente que foi injetado nessa classe:

Repare que o método publish do cliente SNS é utilizado para publicar mensagens. Esse método recebe como parâmetro o tópico em si e a mensagem a ser publicada.

A resposta desse método é um objeto do tipo PublishResult, que contém a identificação única da mensagem que foi publicada no tópico do SNS. Esse número é importante para se fazer um rastreamento das mensagens, nas várias partes do sistema em que ela passar.

Se você gostou desse conteúdo, siga-me no LinkedIn, para receber notificações de outros tutoriais como esse!

Referência:

Esse artigo foi baseado nos conceitos ministrados nesse curso online: Criando microsserviços em Java com AWS ECS e Fargate

Quem sou eu:

  • Trabalhei diariamente com as tecnologias apresentadas nesse blog por quase 4 anos, atuando como desenvolvedor de soluções hospedadas na Amazon Web Services;
  • Tenho lecionado disciplinas de cloud computing, principalmente AWS, em curso de pós-graduação há quase 10 anos;
  • Tenho livros publicados sobre o assunto;
  • Faço parte da comunidade global AWS Community Builder 2020/2021, criada pela própria AWS.