Este projeto permite criar a infraestrutura mínima na AWS para execução de carga de trabalho baseada em uma única instância EC2. A proposta é criar todos os recursos necessários, como VPC, Subnet, Route Tables, EC2, RDS etc, para rodar um projeto em uma instância Ubuntu, 22.04 LTS.
O projeto a ser executado neste exemplo é o Zabbix.
Toda a infraestrutura será criada via Terraform.
Além de criaro EC2 e RDS com Zabbix, neste exemplo temos a automação de inclusão de instâncias como hosts do Zabbix. Isso quer dizer que, quando uma nova instância for criada na mesma região e vpc prevista neste exemplo, ela será incluída no Zabbix recém instalado por meio da Zabbix API utilizada via Python.
Para isso alguns recursos necessarios foram criados como:
- Função Lambda para que é executada ao subir a instância;
- Secret no Secrets Manager para armazenar credenciais e outros dados necessários;
- Security Groups adicionais para o Zabbix Agent;
- Profiles IAM para dar permissão à Lambda;
- Recursos do Terraform para compactar e subir a função Lambda.
Terraform é tecnologia para uso de infraestrutura como código (IaaC), assim como Cloudformation da AWS.
Porém com Terraform é possível definir infraestrutura para outras clouds como GCP e Azure.
Para utilizar é preciso baixar o arquivo do binário compilado para o sistema que você usa. Acesse https://www.terraform.io/downloads
É preciso inicializar o Terraform na raiz deste projeto executando
terraform init
O arquivo de definição do Terraform é o main.tf.
É nele que especificamos como nossa infraestrutura será.
É importante observar que no bloco do provider "aws"
é onde definimos que vamos usar Terraform com AWS.
provider "aws" {
region = "us-east-1"
profile = "oficina-de-projetos"
}
Como Terraform cria toda a infra automaticamente na AWS, é preciso dar permissão para isso por meio de credenciais.
Apenar se ser possível especificar as chaves no próprio provider, esta abordagem não é indicada. Principalmente por este código estar em um repositório git, pois que tiver acesso ao repositório saberá qual são as credenciais.
Uma opção melhor é usar um profile da AWS configurado localmente.
Aqui usamos o profile chamado projeto. Para criar um profile execute o comando abaixo usando o AWS CLI e preencha os parâmetros solicitados.
aws configure --profile projeto
Além da configuração do profile será preciso definir algumas variáveis.
Para evitar expor dados sensíveis no git, como senha do banco de dados, será preciso copiar o arquivo terraform.tfvars.exemplo
para terraform.tfvars
.
No arquivo terraform.tfvars
redefina os valores das variáveis. Perceba que será necessário ter um domínio já no Route53 para que seja fornecido o Zone ID.
Todas as variáveis possíveis para este arquivo podem ser vistas no arquivo variables.tf
. Apenas algumas delas foram utilizadas no exemplo.
O Terraform provê alguns comandos básicos para planejar, aplicar e destroir a infraestrutura.
Ao começar a aplicar a infraestrutura, o Terraform cria o arquivo terraform.tfstate
, que deve ser preservado e não deve ser alterado manualmente.
Por meio deste arquivo o Terraform sabe o estado atual da infraestrutura e é capar de adicionar, alterar ou remover recursos.
Neste repositório não estamos versionando este arquivo por se tratar de um repositório compartilhado e para estudo. Em um repositório real possívelmente você vai querer manter este arquivo preservado no git.
terraform plan
terraform apply
ou, para confirmar automáticamente.
terraform apply --auto-approve
*CUIDADO!*
Após a execução dos comandos abaixo você perderá tudo que foi especificado no seu arquivo Terraform (banco de dados, EC2, EBS etc)..
terraform destroy
ou, para confirmar automáticamente.
terraform destroy --auto-approve
Após executar o terraform apply
, é apresentado no terminal quantos recursos forma adicionados, alterados ou destruídos na sua infra.
No nosso código adicionamos mais algumas informações de saída (outputs) necessárias para acessarmos os recursos criados, como o banco de dados. Observe abaixo.
O acesso à aplicação será pelo endereço apresentado no projeto-dns
, que também pode ser utilizado para acessar a instância.
O endereço host para o banco de dados RDS é apresentado em projeto-rds-addr
.
Ser quiser observar os parâmetros do PHP no servidor acesse o endereço apresentado em server
.
Apply complete! Resources: 23 added, 0 changed, 0 destroyed.
Outputs:
projeto-dns = "ec2-44-201-145-193.compute-1.amazonaws.com"
projeto-id = "i-0c3289412a3104db2"
projeto-ip = "44.201.145.193"
projeto-rds-addr = "projeto-rds.cmfcq1p7msvt.us-east-1.rds.amazonaws.com"
projeto-rds-endpoint = "projeto-rds.cmfcq1p7msvt.us-east-1.rds.amazonaws.com:3306"
server = "http://ec2-44-201-145-193.compute-1.amazonaws.com/info.php"
Neste código nós também criamos recursos do SNS para notificar quando a implantação foi feita com sucesso.
No arquivo de .tfvars você deve especificar o email no qual deseja receber a notificação do final da implantação.
Fique atento para confirmar a inscrição do seu email no tópico SNS. Pouco após você executar o apply você receberá um email com o assunto AWS Notification - Subscription Confirmation e você deve clicar no Confirm subscription.
Após isso você deverá receber um email quando toda a implantação do Zabbix ocorrer. Observe que isso ocorre após o script user data finalizar a instação de tudo não apenas quando o Terraform terminar de subir a infra. Pode demorar um pouco mais do que esta parte.
Este é um projeto para experimentações e estudo do Terraform. Mesmo proporcionando a criação dos recursos mínimos para execução do projeto na AWS, é desaconselhado o uso deste projeto para implantação de cargas de trabalho em ambiente produtivo.