Tutorial: Criando tópico do AWS SNS e configurando permissões

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 criação de um tópico no AWS SNS, utilizando o AWS CDK, bem como a passagem de parâmetros para uma aplicação, em execução no AWS ECS, e a atribuição da permissão de publicar mensagens nele.

Para criar uma aplicação com o Spring Boot e publicar mensagens em um tópico do AWS SNS, consulte este tutorial.

Criação do tópico do AWS SNS:

Dentro do projeto de criação de infraestrutura utilizando o AWS CDK, pode-se criar uma classe para abrigar a construção da stack responsável pelo deployment do tópico SNS, que seria semelhante ao trecho a seguir:

Repare que há um atributo de classe do tipo SnsTopic. Nele será criado de fato o tópico e exposto através de um getter, que também já está criado nessa classe.

Tanto o atribuo e o getter serão utilizados para passar o tópico aqui criado para uma outra stack, como será visto mais adiante.

A organização das stacks em um projeto com o CDK depende de cada caso. Aqui o tópico SNS está sendo criado em sua própria stack apenas para efeitos didáticos.

Dentro do construtor dessa classe, crie então o tópico do AWS SNS no atributo mencionado anteriormente:

Veja como a criação do tópico SNS é simples. Nesse exemplo, apenas o nome do tópico é passado como atributo a ele.

Criação da stack do serviço no AWS ECS:

Imagine agora que esse tópico será utilizado em uma aplicação Spring Boot, baseada em um container Docker, em execução no AWS ECS. Esse serviço poderia ter sua própria stack, como visto no trecho a seguir:

Novamente, o tópico poderia ser criado dentro dessa mesma stack, mas separá-los aqui traz benefícios didáditos, como a organização das stacks, como será visto mais adiante.

Repare que o construtor dessa classe recebe o tópico que foi criado na primeira stack. Esse parâmetro será utilizado logo a seguir.

Passagem das variáveis de ambiente à tarefa do ECS:

Antes da criação de fato do serviço e da tarefa do ECS, é necessário criar um Map com os valores das variáveis de ambiente a serem passadas à essa tarefa:

Veja que a segunda variável, de nome AWS_SNS_TOPIC_PRODUCT_EVENTS_ARN, recebe o Amazon Resource Name, ou apenas ARN, que é o endereço que representa o tópico que foi criado no AWS SNS. Esse valor é necessário para que a aplicação possa publicar mensagens nesse tópico específico.

Criação do serviço no AWS ECS:

O serviço e a tarefa do AWS ECS podem ser criados usando o construct fornecido pelo AWS CDK, como no exemplo a seguir:

Veja que o Map com as variáveis de ambiente são passadas ao atributo environment. Com isso, a definição da tarefa irá receber o ARN do tópico SNS, fazendo com que essa informação seja passada para dentro da aplicação Spring Boot no momento de sua execução.

Atribuição da permissão de publicar mensagens:

A tarefa do ECS, criada na sessão anterior para a execução da aplicação no serviço no cluster, assume um papel criado no AWS IAM, ou Identity and Access Management.

Nesse papel do IAM é que são definidas quais as permissões que de fato a aplicação tem para acessar recursos, bem como quais são as operações permitidas nesses recursos.

Graças ao AWS CDK, muitas dessas permissões podem ser definidas por métodos construídos com propósitos específicos, como é o caso da permissão para publicar mensagens em um tópico do AWS SNS, como pode ser visto no trecho a seguir:

Veja que aqui, o método grantPublish, recebe como parâmetro o papel do IAM com as permissões de execução da definição da tarefa, que pertence ao serviço criado no ECS. Esse método cria uma nova entrada nesse papel do IAM, dando a permissão de publicar mensagens no tópico do SNS, especificado pelo seu ARN.

Quando a aplicação definida pela tarefa entrar execução, terá essa permissão para acessar esse tópico, através de seu ARN, que já está sendo passado como variável de ambiente para ela, como mencionado anteriormente.

Organização das stacks no projeto CDK:

Para finalizar, as stacks que criam o tópico do SNS, bem como o serviço do ECS, podem ser organizadas na classe principal do projeto do AWS CDK, como mostra o trecho a seguir:

Perceba que, como a stack do serviço deve receber o tópico do SNS como parâmetro, ela então deve ficar depois da criação da stack do SNS.

Da mesma forma, a dependência entre as duas stacks podem ser explicitamente definida pelo método addDependency.

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 AWS;
  • 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.