|
| 1 | +# Devops da infraestrutura Nosssas |
| 2 | + |
| 3 | +Este projeto utiliza `awscli` e `terraform` para gerenciar infraestrutura como código. A configuração do estado da infraestrutura é persistida em um bucket S3 e o controle de lock é gerenciado por uma tabela no DynamoDB. |
| 4 | + |
| 5 | +## Dependências |
| 6 | + |
| 7 | +Para executar este projeto, você precisará instalar as seguintes ferramentas: |
| 8 | + |
| 9 | +- `awscli`: Ferramenta de linha de comando da AWS para gerenciar e interagir com serviços da AWS. |
| 10 | +- `terraform`: Ferramenta de infraestrutura como código para gerenciar e provisionar recursos em várias plataformas. |
| 11 | + |
| 12 | +### Instalação no MacOS |
| 13 | +aws-cli: |
| 14 | +```bash |
| 15 | +brew install awscli |
| 16 | +``` |
| 17 | + |
| 18 | +terraform: |
| 19 | +```bash |
| 20 | +brew tap hashicorp/tap |
| 21 | +brew install hashicorp/tap/terraform |
| 22 | +brew update |
| 23 | +brew upgrade hashicorp/tap/terraform |
| 24 | +``` |
| 25 | + |
| 26 | +### Instalação no Debian/Ubuntu |
| 27 | +aws-cli: |
| 28 | +```bash |
| 29 | +sudo apt update |
| 30 | +sudo apt install awscli -y |
| 31 | +``` |
| 32 | + |
| 33 | +terraform: |
| 34 | +```bash |
| 35 | +sudo apt update |
| 36 | +sudo apt install -y software-properties-common |
| 37 | +curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg |
| 38 | +echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list |
| 39 | +sudo apt update && sudo apt install terraform |
| 40 | +``` |
| 41 | + |
| 42 | +### Variáveis de ambiente |
| 43 | +É necessário inserir duas chaves no seu env para rodar os comandos terraform. |
| 44 | +```bash |
| 45 | +export AWS_ACCESS_KEY_ID=<inserir chave aqui> |
| 46 | +export AWS_SECRET_ACCESS_KEY=<inserir chave aqui> |
| 47 | +``` |
| 48 | + |
| 49 | +### Chave ssh da AWS |
| 50 | +Para fins de criação e manutenção de instâncias na AWS é necessário incluir a chave pública `ailton-krenak.pem` no seguinte path do seu ambiente de desenvolvimento `˜/.ssh/ailton-krenak.pem`. |
| 51 | + |
| 52 | +## Como executar |
| 53 | + |
| 54 | +### Configurando a infraestrutura com Terraform |
| 55 | + |
| 56 | +O estado do terraform está sendo compartilhado no S3 com gerenciamento de lock em uma tabela no DynamoDB. |
| 57 | + |
| 58 | +Se o bucket configurado `bonde-terraform-up-and-running-state` não existir na lista de buckets da sua conta Amazon (região: us-east-1), você deve executar os seguintes comandos na pasta `instances/boostrap`: |
| 59 | + |
| 60 | +```bash |
| 61 | +terraform init |
| 62 | +terraform plan |
| 63 | +terraform init -auto-approve |
| 64 | +``` |
| 65 | + |
| 66 | +Essa sequência de comandos acima irá criar a infraestrutura não persistente responsável por cuidar do estado da nossa infraestrutura persistente. |
| 67 | + |
| 68 | +### Executando a infraestrutura com esquema de workspaces do terraform |
| 69 | + |
| 70 | +Este projeto utiliza *workspaces* do Terraform para gerenciar múltiplos ambientes (como `dev`, `stage` e `prod`) dentro de uma única configuração de infraestrutura. Cada *workspace* permite isolar o estado e os recursos entre diferentes ambientes. |
| 71 | + |
| 72 | +Dentro da estrutura do nosso código, temos o arquivo `main.tf` onde nós definimos todas as variáveis *default*, como a seguir: |
| 73 | + |
| 74 | +``` |
| 75 | +locals { |
| 76 | + # Tipo de imagem para o servidor legado (APIS e Clientes Bonde) |
| 77 | + ami = "ami-0866a3c8686eaeeba" |
| 78 | +
|
| 79 | + # Nome da chave SSH |
| 80 | + key_name = "custom-host" |
| 81 | +
|
| 82 | + # Caminho para a chave privada SSH |
| 83 | + private_key_path = "~/.ssh/ailton-krenak.pem" |
| 84 | +
|
| 85 | + # Ambiente (dev, staging, production) |
| 86 | + env = terraform.workspace |
| 87 | +
|
| 88 | + # Tipo de instância para o servidor legado (APIS e Clientes Bonde) |
| 89 | + legacy_server_instance_type = terraform.workspace == "stage" ? "t3.small" : "t3.micro" |
| 90 | +
|
| 91 | + # Tipo de instância para o servidor de sites (Bonde Público e CMS) |
| 92 | + sites_server_instance_type = terraform.workspace == "stage" ? "t3.micro" : "t2.micro" |
| 93 | +} |
| 94 | +``` |
| 95 | + |
| 96 | +1. **Criando ou Selecionando um Workspace**: |
| 97 | + - Para criar um novo *workspace*, execute: |
| 98 | + ```bash |
| 99 | + terraform workspace new nome-do-workspace |
| 100 | + ``` |
| 101 | + - Para alternar para um *workspace* existente, execute: |
| 102 | + ```bash |
| 103 | + terraform workspace select nome-do-workspace |
| 104 | + ``` |
| 105 | +
|
| 106 | +2. **Executando a Configuração no Workspace Selecionado**: |
| 107 | + Com o *workspace* adequado selecionado, você pode executar os comandos do Terraform normalmente. O estado será armazenado separadamente para cada *workspace*, mantendo os recursos de cada ambiente isolados. |
| 108 | + |
| 109 | + ```bash |
| 110 | + terraform init |
| 111 | + terraform apply -auto-approve |
| 112 | + ``` |
| 113 | +
|
| 114 | +### Configuração do ambiente |
| 115 | +
|
| 116 | +Você deve configurar as seguintes váriaveis no seu ambiente de execução do terraform. Lembre-se você deve utilizar os mesmos valores de váriaveis que outros ambientes que também executam o terraform, exemplo dev local e github actions. |
| 117 | +
|
| 118 | +``` |
| 119 | +TF_VAR_influxdb_token= |
| 120 | +TF_VAR_ami= |
| 121 | +# legacy envs |
| 122 | +TF_VAR_legacy_elastic_ip_allocation_id= |
| 123 | +TF_VAR_legacy_server_instance_type= |
| 124 | +TF_VAR_legacy_portainer_edge_id= |
| 125 | +TF_VAR_legacy_portainer_edge_key= |
| 126 | +# sites envs |
| 127 | +TF_VAR_sites_elastic_ip_allocation_id= |
| 128 | +TF_VAR_sites_server_instance_type= |
| 129 | +TF_VAR_sites_portainer_edge_id= |
| 130 | +TF_VAR_sites_portainer_edge_key= |
| 131 | +``` |
| 132 | +
|
| 133 | +NOTE: As váriaveis com suffix `_elastic_ip_allocation_id` não são obrigatórias, caso você não configure os scripts não vão associar um IP Elástico ao seus servidores. |
| 134 | +
|
| 135 | +## Sites |
| 136 | +
|
| 137 | +
|
| 138 | +## TODO |
| 139 | +
|
| 140 | +- [X] Persistir o estado no S3 e lock com DynamoDB |
| 141 | +- [ ] Criar fluxo de trabalho para publicação automatizada no Github |
| 142 | +- [X] Resolver caminho da chave privada |
| 143 | +- [X] Documentar o uso do workspace |
| 144 | +- [X] Documentar o uso da chave privada `custom-host / ailton-krenak` |
| 145 | +- [X] Configuração da awscli e terraform e das variaveis de ambiente que precisam ser configuradas para acessar a conta AWS |
0 commit comments