|
1 | 1 | # ecs-fargate-kotlin-canary-datadog |
2 | 2 |
|
3 | | -## 🏷️ v.1.0.0 - Canary Blue/Green Deployment com ECS e CodeDeploy via Terraform |
| 3 | +## 🏷️ v1.5.0 - Modularização na criação do Load Balancer, ECS Service e CodeDeploy |
4 | 4 |
|
5 | | -Este projeto provisiona uma infraestrutura completa para realizar deployments com estratégia *blue/green* em serviços ECS Fargate, utilizando AWS CodeDeploy. |
| 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. |
6 | 6 |
|
7 | | -A pasta /app contém uma aplicação básica em `Kotlin` (SEM SPRING) para testar o rollout e rollback do Canary. |
| 7 | +A pasta `/app` contém uma aplicação básica em `Kotlin` (SEM SPRING) para testar o rollout e rollback do Canary. |
8 | 8 |
|
9 | 9 | --- |
| 10 | + |
10 | 11 | ## 📂 Estrutura de Pastas |
11 | 12 |
|
12 | 13 | ``` |
13 | | -. |
14 | | -├── infra/ |
15 | | -│ ├── codedeploy/ |
16 | | -│ │ └── appspec_sample_template.yaml # Exemplo de AppSpec para CodeDeploy |
17 | | -│ │ |
18 | | -│ ├── inventories/ |
19 | | -│ │ └── variables.tfvars # Variáveis de entrada (valores) |
20 | | -│ │ |
21 | | -│ ├── application_load_balancer.tf # Recurso ALB |
22 | | -│ ├── code-deploy_application.tf # CodeDeploy App |
23 | | -│ ├── code-deploy_deployment-group.tf # CodeDeploy Deployment Group |
24 | | -│ ├── data.tf # Data sources (VPC, subnets, etc.) |
25 | | -│ ├── ecs_cluster.tf # ECS Cluster |
26 | | -│ ├── ecs_service.tf # Serviço ECS com suporte a blue/green |
27 | | -│ ├── force-deploy.sh # Script para forçar deploy automático |
28 | | -│ ├── listener.tf # ALB Listener (porta 80) |
29 | | -│ ├── local_appspec.tf # AppSpec gerado dinamicamente |
30 | | -│ ├── local_deployment_group_force.tf # Lógica para forçar novo deploy |
31 | | -│ ├── locals.tf # Definições locais reutilizáveis |
32 | | -│ ├── log_group.tf # CloudWatch Log Group |
33 | | -│ ├── outputs.tf # Outputs do projeto |
34 | | -│ ├── providers.tf # Providers e backends |
35 | | -│ ├── s3_revision_object.tf # Upload do AppSpec para S3 |
36 | | -│ ├── service_autoscaling_target.tf # Configuração de auto scaling |
37 | | -│ ├── service_task_definition.tf # Task Definition do ECS |
38 | | -│ └── target_group.tf # Target Groups blue e green |
| 14 | +./infra |
| 15 | +├── application-load-balancer |
| 16 | +│ ├── application_load_balancer.tf |
| 17 | +│ ├── listener.tf |
| 18 | +│ ├── outputs.tf |
| 19 | +│ ├── target_group.tf |
| 20 | +│ └── variables.tf |
| 21 | +├── codedeploy-scope |
| 22 | +│ ├── appspec_template |
| 23 | +│ │ └── appspec_sample_template.yaml |
| 24 | +│ ├── code-deploy_application.tf |
| 25 | +│ ├── code-deploy_deployment-group.tf |
| 26 | +│ ├── data.tf |
| 27 | +│ ├── local_appspec.tf |
| 28 | +│ ├── local_deployment_group_force.tf |
| 29 | +│ ├── locals.tf |
| 30 | +│ ├── outputs.tf |
| 31 | +│ ├── s3_revision_object.tf |
| 32 | +│ ├── scripts |
| 33 | +│ │ └── force-deploy.sh |
| 34 | +│ └── variables.tf |
| 35 | +├── ecs-service |
| 36 | +│ ├── data.tf |
| 37 | +│ ├── ecs_cluster.tf |
| 38 | +│ ├── ecs_service.tf |
| 39 | +│ ├── locals.tf |
| 40 | +│ ├── log_group.tf |
| 41 | +│ ├── outputs.tf |
| 42 | +│ ├── service_autoscaling_target.tf |
| 43 | +│ ├── service_task_definition.tf |
| 44 | +│ └── variables.tf |
| 45 | +└── example |
| 46 | + ├── data.tf |
| 47 | + ├── inventories |
| 48 | + │ └── variables.tfvars |
| 49 | + ├── main.tf |
| 50 | + ├── outputs.tf |
| 51 | + ├── providers.tf |
| 52 | + └── variables.tf |
39 | 53 | ``` |
40 | 54 |
|
41 | 55 | --- |
| 56 | + |
42 | 57 | ## 🔧 Componentes Principais |
43 | 58 |
|
44 | 59 | - **ECS Fargate**: Ambiente de execução para os containers. |
45 | | -- **Application Load Balancer (ALB)**: Balanceador com listener único na porta 80. |
| 60 | +- **Application Load Balancer (ALB)**: Balanceador com listener único na porta 8080. |
46 | 61 | - **Target Groups**: Criados dinamicamente para `blue` e `green`. |
47 | 62 | - **AWS CodeDeploy**: Orquestra a troca de tráfego entre versões. |
48 | 63 | - **AppSpec**: Template para controlar o comportamento do deploy. |
49 | | -- **Scripts locais**: Sobrescrevendo o arquivo appspec.yaml do CodeDeploy e forçando novos deploys diretamente no terminal. |
| 64 | +- **Scripts locais**: Sobrescrevem o appspec.yaml e forçam novos deploys de forma automática. |
| 65 | + |
50 | 66 | --- |
51 | | -## 📋 Pré requisitos |
52 | | -0. Possuir um conta AWS. |
53 | | -1. Ter um repositório ECR com uma imagem dockerizada de aplicação. |
54 | | -2. Ter role com acessos para o com ECS, CodeDeploy e ECR. |
55 | | -3. Possuir o binário do Terraform instalado em sua máquina. |
56 | | -4. Executar o Terraform um shell bash. (Para o funcionamento dos resource local) |
| 67 | + |
| 68 | +## 📋 Pré-requisitos |
| 69 | + |
| 70 | +0. Conta AWS válida. |
| 71 | +1. Repositório ECR com imagem da aplicação. |
| 72 | +2. Role com acesso ao ECS, CodeDeploy e ECR. |
| 73 | +3. Terraform instalado. |
| 74 | +4. Shell bash para execução do Terraform (uso de recursos `local`). |
| 75 | + |
57 | 76 | --- |
58 | 77 |
|
59 | | -## 📦 Como usar |
| 78 | +## 📦 Como usar cada módulo |
60 | 79 |
|
61 | 80 | ### 0. Altere a região |
62 | | -Nativamente, está adicionada a region `us-east-1` devido a orquestração na conta free-tier. |
63 | 81 |
|
64 | | -### 1. Configure variáveis |
65 | | -Preencha `variables.tfvars` com os valores da sua conta AWS, nomes de cluster, etc. |
| 82 | +Por padrão, está `us-east-1` para compatibilidade com a conta free-tier. |
| 83 | + |
| 84 | +### 1. Adicione os módulos desejados |
| 85 | + |
| 86 | +```hcl |
| 87 | +terraform { |
| 88 | + source = "git::https://github.com/dalfinha/ecs-fargate-kotlin-canary-datadog.git//infra/application-load-balancer?ref=develop" |
| 89 | +} |
| 90 | +``` |
| 91 | + |
| 92 | +Preencha o `variables.tfvars` com dados da sua conta, ou use `data` para busca dinâmica. Veja o diretório `example` para exemplos. |
| 93 | + |
| 94 | +### 2. Inicialize e aplique |
66 | 95 |
|
67 | | -### 2. Inicialize, valide as configurações e aplique |
68 | 96 | ```bash |
69 | | -cd ./infra |
70 | 97 | terraform init |
71 | 98 | terraform validate |
72 | 99 | terraform plan |
73 | 100 | terraform apply -var-file="variables.tfvars" |
74 | 101 | ``` |
| 102 | + |
| 103 | +Ou: |
| 104 | + |
| 105 | +```bash |
| 106 | +terraform apply -var-file="inventories/variables.tfvars" |
| 107 | +``` |
| 108 | + |
75 | 109 | --- |
76 | 110 |
|
77 | 111 | ## 📌 Observações |
78 | 112 |
|
79 | | -- Só é possível ter **um listener por porta** no ALB. A inteligência de alternar entre `blue` e `green` é do **CodeDeploy**. |
| 113 | +- Só pode haver **um listener por porta** no ALB. |
| 114 | +- A troca entre `blue` e `green` é gerenciada pelo **CodeDeploy**. |
80 | 115 | - O listener padrão aponta inicialmente para o `blue`. |
81 | | -- O `AppSpec` é gerado localmente via `.yaml` e excluído LOCAL após um novo deployment ser realizado via terminal. |
82 | | -- Um novo deploy é na execução do terraform local. Caso a aplicação já tenha um deployment em execução, o comando para execução de um novo deploy é ignorado. |
| 116 | +- O `AppSpec` é gerado e excluído localmente após o deploy. |
| 117 | +- Um novo deploy ocorre via execução local do Terraform. |
| 118 | +- Módulos são independentes, mas exigem dependências previamente criadas. Em situações de reuso, garanta que a infraestrutura seja compatível, |
| 119 | + |
83 | 120 | --- |
84 | 121 |
|
85 | 122 | ## ⌨️ Próximos passos |
86 | 123 |
|
87 | | -### 🏷️v1.5.0 - Integração da aplicação Kotlin com API externa |
| 124 | +### ✅ v1.0.0 |
| 125 | +Canary Blue/Green Deployment com ECS e CodeDeploy via Terraform |
88 | 126 |
|
89 | | -- [ ] Remoção dos logs da aplicação de soma aleatória. |
90 | | -- [ ] Diminuir o intervalo entre as somas aleatórias. |
91 | | -- [ ] Incluir a API Numbers ([http://numbersapi.com/](http://numbersapi.com/#42)). |
92 | | -- [ ] Formatar log da API Numbers na aplicação. |
| 127 | +### ✅ v1.5.0 |
| 128 | +Modularização na criação do Load Balancer, ECS Service e CodeDeploy |
93 | 129 |
|
94 | | -### 🏷️v2.0.0 - Monitoramento com Datadog APM |
| 130 | +### 🏷️ v2.0.0 |
| 131 | +Integração da aplicação Kotlin com API externa |
| 132 | + |
| 133 | +- [ ] Remoção dos logs da aplicação de soma aleatória |
| 134 | +- [ ] Diminuir intervalo entre somas aleatórias |
| 135 | +- [ ] Incluir API Numbers ([http://numbersapi.com/](http://numbersapi.com/#42)) |
| 136 | +- [ ] Formatar log da API Numbers |
| 137 | + |
| 138 | +### 🏷️ v2.5.0 |
| 139 | +Monitoramento com Datadog APM |
| 140 | + |
| 141 | +- [ ] Criar role com políticas do Datadog (ECS) |
| 142 | +- [ ] Instrumentar ECS com Datadog |
| 143 | +- [ ] Adicionar `DD_API_KEY` como env var |
| 144 | +- [ ] Criar secrets no Terraform |
| 145 | +- [ ] Validar ingestão de logs e APM |
| 146 | +- [ ] Taguear serviço ECS com Terraform |
95 | 147 |
|
96 | | -- [ ] Criar role com políticas do Datadog (ECS) |
97 | | -- [ ] Instrumentar o Datadog no ECS |
98 | | -- [ ] Incluir `DD_API_KEY` como env var na task definition |
99 | | -- [ ] Criar secrets para o Datadog |
100 | | -- [ ] Validar ingestão de logs e APM |
101 | | -- [ ] Taguear serviço ECS com Terraform |
102 | 148 | --- |
103 | | -## ❌ Falhas ao executar? |
104 | | -Abra uma issue! Assim que possível aplicamos a correção. Contribuições são bem vindas! |
| 149 | + |
| 150 | +## ❌ Falhas ao executar? |
| 151 | + |
| 152 | +Abra uma **issue**! Correções e contribuições são bem-vindas. |
0 commit comments