Skip to content

Commit b80b1ec

Browse files
authored
feat: v2.5.0 - Adição do Datadog Logs e Datadog APM no container da app / Deploy dinamico com o CodeDeploy
1 parent 8a0a0da commit b80b1ec

File tree

1 file changed

+66
-43
lines changed

1 file changed

+66
-43
lines changed

README.md

Lines changed: 66 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,46 @@
11
# ecs-fargate-kotlin-canary-datadog
22

3-
## 🏷️ v2.0.0 - Integração da aplicação Kotlin com API Numbers (http://numbersapi.com/)
3+
## 🏷️ v2.5.0 - Adição do Datadog Logs e Datadog APM no container da aplicação.
44

5-
Este projeto provisiona uma infraestrutura completa para realizar deployments com estratégia *blue/green* em serviços ECS Fargate, utilizando AWS CodeDeploy. Agora, dividido em módulos, é possível criar apenas os componentes que desejar, como apenas o CodeDeploy ou apenas o Application Load Balancer.
5+
Este projeto provisiona uma infraestrutura em Terraform pronta para realizar deployments com estratégia *blue/green* em serviços ECS Fargate, utilizando o AWS CodeDeploy. Agora, dividido em módulos, é possível criar apenas os componentes desejados, como apenas o CodeDeploy ou apenas o Application Load Balancer. Nesta nova versão, também é possível utilizar o Datadog para envio automático de logs e traces da aplicação, bastando definir a variável `enable_datadog = true` e ter um Secret do Secret Manager com os valores da API KEY.
66

7-
A pasta `/app` contém uma aplicação básica em `Kotlin` com SPRING para testar o rollout e rollback do Canary. A aplicação obtem dois números aleatórios, soma o número e consulta informações de uma trivia através da API Numbers, uma API pública que permite consultas sem credenciais, também configurando um payload de log para uso durante a instrumentação do Datadog.
7+
A pasta /app contém uma aplicação básica em Kotlin com SPRING para testar o rollout e rollback do Canary. A aplicação obtém dois números aleatórios, soma o número e consulta informações de uma trivia através da [API Numbers](http://numbersapi.com/). Os logs agora incluem payloads estruturados.
88

9+
---
10+
### 🌀 Dependências
11+
```mermaid
12+
flowchart TD
13+
subgraph Entrypoint
14+
ALB[Application Load Balancer]
15+
end
16+
17+
subgraph ECS Cluster
18+
ECS[ECS Fargate]
19+
Service[ECS Service]
20+
ECS --> Service
21+
Service -->|Logs e APM| Datadog[(Datadog)]
22+
end
23+
24+
subgraph CodeDeploy Stack
25+
CodeDeploy[AWS CodeDeploy]
26+
S3["S3: AppSpec e revisões"]
27+
CodeDeploy --> S3
28+
end
29+
30+
ALB --> TGBlue[Target Group Blue]
31+
ALB --> TGGreen[Target Group Green]
32+
33+
Service --> TGBlue
34+
Service --> TGGreen
35+
36+
TGBlue --> CodeDeploy
37+
TGGreen --> CodeDeploy
38+
```
39+
40+
> [!TIP]
41+
> Também é possível utilizar o `terraform graph` para mapear as dependências explícitas da infraestrutura! [graph](graphviz.png)
942
43+
---
1044
### 📃 Payload da saída de log
1145
```json
1246
{
@@ -34,21 +68,23 @@ A pasta `/app` contém uma aplicação básica em `Kotlin` com SPRING para testa
3468

3569
```
3670
./app
37-
└──scripts
38-
├── local_pull_ecr.sh
39-
└── local_gradle_build.sh
71+
└── scripts
72+
├── local_pull_ecr.sh
73+
└── local_gradle_build.sh
74+
4075
./infra
4176
├── application-load-balancer
4277
│ ├── application_load_balancer.tf
4378
│ ├── listener.tf
4479
│ ├── outputs.tf
4580
│ ├── target_group.tf
4681
│ └── variables.tf
47-
├── codedeploy-scope
82+
83+
├── codedeploy
4884
│ ├── appspec_template
4985
│ │ └── appspec_sample_template.yaml
50-
│ ├── code-deploy_application.tf
51-
│ ├── code-deploy_deployment-group.tf
86+
│ ├── code_deploy_application.tf
87+
│ ├── code_deploy_deployment_group.tf
5288
│ ├── data.tf
5389
│ ├── local_appspec.tf
5490
│ ├── local_deployment_group_force.tf
@@ -58,6 +94,7 @@ A pasta `/app` contém uma aplicação básica em `Kotlin` com SPRING para testa
5894
│ ├── scripts
5995
│ │ └── local_force_deploy.sh
6096
│ └── variables.tf
97+
6198
├── ecs-service
6299
│ ├── data.tf
63100
│ ├── ecs_cluster.tf
@@ -68,58 +105,52 @@ A pasta `/app` contém uma aplicação básica em `Kotlin` com SPRING para testa
68105
│ ├── service_autoscaling_target.tf
69106
│ ├── service_task_definition.tf
70107
│ └── variables.tf
108+
71109
└── example
72110
├── data.tf
73-
├── inventories
74-
│ └── variables.tfvars
75111
├── main.tf
76112
├── outputs.tf
77113
├── providers.tf
78114
└── variables.tf
79115
```
80116
---
81-
## 📜 Scripts auxiliares (`/app/scripts`)
117+
## 📜 Scripts auxiliares (`./scripts`)
82118

83119
- `local_gradle_build.sh`: Compila o projeto com Gradle, gera o JAR, cria a imagem Docker e chama o local_pull_ecr.sh para versionar e enviar a imagem ao ECR.
84120
- `local_pull_ecr.sh`: Autentica no ECR, busca a próxima versão disponível, cria uma nova tag baseada nela e faz o push da imagem Docker para o repositório.
121+
- `local_force_deploy.sh` : Verifica se há um deployment em andamento no AWS CodeDeploy e, se não houver, faz upload do appspec.yaml para o S3 e inicia um novo deployment, removendo o arquivo local após o envio.
85122
---
86123
## 🔧 Componentes Principais
87124

88125
- **ECS Fargate**: Ambiente de execução para os containers.
89126
- **Application Load Balancer (ALB)**: Balanceador com listener único na porta 8080.
90127
- **Target Groups**: Criados dinamicamente para `blue` e `green`.
128+
- **ECS Service**: Com a task_definition, faz o deploy do serviço com as configurações do Datadog.
91129
- **AWS CodeDeploy**: Orquestra a troca de tráfego entre versões.
92130
- **AppSpec**: Template para controlar o comportamento do deploy.
93131
- **Scripts locais**: Sobrescrevem o appspec.yaml, forçam novos deploys de forma automática, buildam o Gradlew e executam o Docker para validação. Também permitem o pull automático para um ECR repository.
94-
95132
---
96-
97133
## 📋 Pré-requisitos
98134

99-
0. Conta AWS válida.
135+
0. Conta AWS ativa.
100136
1. Repositório ECR com imagem da aplicação.
101-
2. Role com acesso ao ECS, CodeDeploy e ECR.
137+
2. Role IAM com acesso ao ECS, CodeDeploy, ECR e Secret Manager.
102138
3. Terraform instalado.
103139
4. Shell bash para execução do Terraform (uso de recursos `local`).
104-
140+
5. Secret do Secret Manager com a API KEY do Datadog para envio do trace e logs.
105141
---
106142

107143
## 📦 Como usar cada módulo
108-
109144
### 0. Altere a região
110-
111145
Por padrão, está `us-east-1` para compatibilidade com a conta free-tier.
112146

113147
### 1. Adicione os módulos desejados
114-
115148
```hcl
116149
terraform {
117-
source = "git::https://github.com/dalfinha/ecs-fargate-kotlin-canary-datadog.git//infra/application-load-balancer?ref=v2.0.0"
150+
source = "git::https://github.com/dalfinha/ecs-fargate-kotlin-canary-datadog.git//infra/application-load-balancer?ref=v3.0.0"
118151
}
119152
```
120-
121-
Preencha o `variables.tfvars` com dados da sua conta, ou use `data` para busca dinâmica. Veja o diretório `example` para exemplos.
122-
153+
Preencha o `variables.tfvars` com dados da sua conta, ou use `data` para busca dinâmica. Veja o diretório `infra/example` para exemplo de como inserir as informações dinamicamente.
123154
### 2. Inicialize e aplique
124155

125156
```bash
@@ -132,38 +163,30 @@ terraform apply -var-file="variables.tfvars"
132163
Ou:
133164

134165
```bash
135-
terraform apply -var-file="inventories/variables.tfvars"
166+
terraform apply -var-file="variables.tfvars"
136167
```
137168

138169
---
139-
140170
## 📌 Observações
141-
142171
- Só pode haver **um listener por porta** no ALB.
143172
- A troca entre `blue` e `green` é gerenciada pelo **CodeDeploy**.
144173
- O listener padrão aponta inicialmente para o `blue`.
145174
- O `AppSpec` é gerado e excluído localmente após o deploy.
146175
- Um novo deploy ocorre via execução local do Terraform.
147176
- Módulos são independentes, mas exigem dependências previamente criadas. Em situações de reuso, garanta que a infraestrutura seja compatível.
148-
177+
- Para usar o Datadog, é necessário um Secret no **AWS Secrets Manager** contendo a API Key, para que o agente envie traces e logs.
178+
- É imprescindível ter uma **IAM Role** com permissões para **Secrets Manager**, **ECS**, **Auto Scaling** e **CodeDeploy**.
149179
---
150180

151-
## ⌨️ Próximos passos
181+
## ⌨️ Histórico (Tags)
152182

153-
#### ✅ v1.0.0 - Canary Blue/Green Deployment com ECS e CodeDeploy via Terraform
154-
#### ✅ v1.5.0 - Modularização na criação do Load Balancer, ECS Service e CodeDeploy
155-
#### ✅ v2.0.0 - Integração da aplicação Kotlin com API externa -> http://numbersapi.com/
183+
- [x] v1.0.0 - Canary Blue/Green Deployment com ECS e CodeDeploy via Terraform
184+
- [x] v1.5.0 - Modularização na criação do Load Balancer, ECS Service e CodeDeploy
185+
- [x] v2.0.0 - Integração da aplicação Kotlin com API externa -> http://numbersapi.com/
186+
- [x] v2.5.0 - Adição do Datadog APM e Datadog Logs
187+
- [ ] v3.0.0 - Adição do Github Actions para criação da infraestrutura via pipeline
188+
- [ ] vx.x.x - Migração de ECS Fargate para EKS Fargate
156189

157-
### 🏷️ v2.5.0 - Monitoramento com Datadog APM
158-
- [ ] Criar secrets no Terraform
159-
- [ ] Adicionar `DD_API_KEYs` como env var
160-
- [ ] Criar role com políticas do Datadog (ECS)
161-
- [ ] Instrumentação do OpenTelemetry
162-
- [ ] Instrumentar ECS com Datadog
163-
- [ ] Validar ingestão de logs e APM
164-
- [ ] Taguear serviço ECS com Terraform
165190
---
166-
167191
## ❌ Falhas ao executar?
168-
169-
Abra uma **issue**! Correções e contricd buições são bem-vindas.
192+
Abra uma **issue**! Correções e contribuições são bem-vindas.

0 commit comments

Comments
 (0)