Java + LocalStack: usando o AWS CDK e CloudFormation com a API Oficial da Marvel

Introdução
O AWS CDK é uma forma de criar os recursos da sua infraestrutura na AWS usando código fonte (no nosso caso o Java) ao invés de utilizar o formato YAML
A partir desse código é possivel gerar a Stack para o CloudFormation e criar os recursos diretamente na AWS ou no LocalStack.
Requisitos
- Node.js — https://nodejs.org/en/
- AWS CLI — https://aws.amazon.com/pt/cli/
- JDK 11 — https://adoptium.net/temurin/releases/?version=11
Código Fonte
No nosso exemplo vamos criar os seguintes recursos:
- Configurações no Parameter Store;
- Bucket S3;
- SNS;
- SQS inscrito no SNS;
- AWS Lambda que é acionada a partir de um SQS;
Parameter Store
Bucket S3
SQS
SNS
AWS Lambda
Nesse código, existe a linha 18 que especifica um código fonte para o Lambda. No caso da execução local, o comando busca o arquivo da função em um diretório.
O ideal é sempre buscar esse arquivo através de um Bucket S3 usando o comando Code.fromBucket.
No arquivo YAML gerado do CloudFormation a partir do CDK devemos alterar a criação do AWS Lambda apontando para um Bucket S3:
Instalando o AWS CDK
Para instalar o AWS CDK utilize o comando abaixo:
npm install -g aws-cdk
O LocalStack usa um CDK especifico para funcionar que é instalado a partir do comando abaixo:
npm install -g aws-cdk-local aws-cdk
A documentação do LocalStack mostra com mais detalhes sobre o AWS CDK Local:
Criando uma aplicação
Vamos iniciar com AWS CDK criando um projeto de exemplo com a estrutura básica de uma aplicação.
O comando cdklocal é utilizado para implantar no LocalStack
O comando cdk é utilizado para implantar diretamente na AWS
Nessa aplicação é criado um SNS e um SQS que está inscrito nesse tópico gerado pelo CDK:
cdklocal init sample-app --language=java
Implantando com CDK no LocalStack
Podemos gerar o arquivo do CloudFormation a partir do código fonte em Java usando o parâmetro synth:
cdklocal synth > bff-marvel-cdk_localstack.yml
Arquivo YAML do CloudFormation gerado:
Antes de efetuar o deploy dos nossos recursos, devemos executar o comando do CDK com o parâmetro bootstrap para iniciar o ambiente do CDK dentro do LocalStack.
Isso acontece também quando estamos usando a AWS diretamente:
cdklocal bootstrap
Executamos o comando com o parâmetro deploy para criação dos recursos:
cdklocal deploy
O parâmetro destroy elimina todos os recursos criados:
cdklocal destroy
O CDK sempre irá criar os recursos de acordo com a região configurada dentro do AWS CLI no arquivo .config e .credentials:
[default]
region = us-east-1
[profile localstack]
region = us-east-1
Implantando com CloudFormation no LocalStack
Com o arquivo do CloudFormation gerado pelo comando cdklocal synth, podemos executar a criação dos recursos diretamente no LocalStack.
Para isso, selecione a opção CloudFormation:

Clique em CREATE STACK:

Copie o código do arquivo YAML gerado e especifique um nome para a sua Stack.
No nosso caso, o arquivo gerado deve possuir algumas alterações, principalmente em relação a criação do AWS Lambda:

Confirme a criação:

Será iniciado o processo de criação dos recursos no LocalStack:

Status da criação dos recursos da Stack:

Recursos criados com sucesso:

Podemos também usar o AWS CLI para criar a Stack no CloudFormation:
aws --endpoint http://localhost:4566 --profile localstack cloudformation create-stack --stack-name marvelStack --template-body file://bff-marvel-cdk_localstack.yml
Stack criada com sucesso:
{
"StackId": "arn:aws:cloudformation:us-east-1:000000000000:stack/marvelStack/337fed86"
}
Implantando com CDK na AWS
Utilzaremos os mesmo processo usado no LocalStack. Ao invés de utilizar o comando cdklocal vamos usar o comando cdk:
cdk bootstrap

Gerando os recursos necessários para o funcionamento com CDK na AWS:

Bootstrap feito com sucesso:

Vamos efetuar o deploy dos recursos na AWS:
cdk deploy
Uma Stack foi criada e o processo entra em execução:

Stack executada com sucesso e os recursos foram criados:

O parâmetro destroy elimina todos os recursos criados:
cdk destroy

Github
Código fonte do CDK desse artigo:
Até a próxima!