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.
Para executar este projeto, você precisará instalar as seguintes ferramentas:
awscli
: Ferramenta de linha de comando da AWS para gerenciar e interagir com serviços da AWS.terraform
: Ferramenta de infraestrutura como código para gerenciar e provisionar recursos em várias plataformas.
aws-cli:
brew install awscli
terraform:
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
brew update
brew upgrade hashicorp/tap/terraform
aws-cli:
sudo apt update
sudo apt install awscli -y
terraform:
sudo apt update
sudo apt install -y software-properties-common
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
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
sudo apt update && sudo apt install terraform
É necessário inserir duas chaves no seu env para rodar os comandos terraform.
export AWS_ACCESS_KEY_ID=<inserir chave aqui>
export AWS_SECRET_ACCESS_KEY=<inserir chave aqui>
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
.
O estado do terraform está sendo compartilhado no S3 com gerenciamento de lock em uma tabela no DynamoDB.
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
:
terraform init
terraform plan
terraform init -auto-approve
Essa sequência de comandos acima irá criar a infraestrutura não persistente responsável por cuidar do estado da nossa infraestrutura persistente.
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.
Dentro da estrutura do nosso código, temos o arquivo main.tf
onde nós definimos todas as variáveis default, como a seguir:
locals {
# Tipo de imagem para o servidor legado (APIS e Clientes Bonde)
ami = "ami-0866a3c8686eaeeba"
# Nome da chave SSH
key_name = "custom-host"
# Caminho para a chave privada SSH
private_key_path = "~/.ssh/ailton-krenak.pem"
# Ambiente (dev, staging, production)
env = terraform.workspace
# Tipo de instância para o servidor legado (APIS e Clientes Bonde)
legacy_server_instance_type = terraform.workspace == "stage" ? "t3.small" : "t3.micro"
# Tipo de instância para o servidor de sites (Bonde Público e CMS)
sites_server_instance_type = terraform.workspace == "stage" ? "t3.micro" : "t2.micro"
}
-
Criando ou Selecionando um Workspace:
- Para criar um novo workspace, execute:
terraform workspace new nome-do-workspace
- Para alternar para um workspace existente, execute:
terraform workspace select nome-do-workspace
- Para criar um novo workspace, execute:
-
Executando a Configuração no Workspace Selecionado: 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.
terraform init terraform apply -auto-approve
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.
TF_VAR_influxdb_token=
TF_VAR_ami=
# legacy envs
TF_VAR_legacy_elastic_ip_allocation_id=
TF_VAR_legacy_server_instance_type=
TF_VAR_legacy_portainer_edge_id=
TF_VAR_legacy_portainer_edge_key=
# sites envs
TF_VAR_sites_elastic_ip_allocation_id=
TF_VAR_sites_server_instance_type=
TF_VAR_sites_portainer_edge_id=
TF_VAR_sites_portainer_edge_key=
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.
- Persistir o estado no S3 e lock com DynamoDB
- Criar fluxo de trabalho para publicação automatizada no Github
- Resolver caminho da chave privada
- Documentar o uso do workspace
- Documentar o uso da chave privada
custom-host / ailton-krenak
- Configuração da awscli e terraform e das variaveis de ambiente que precisam ser configuradas para acessar a conta AWS