Escrito por Antonio Azambuja, Trainee Developer, em 24/03/2020
14 minutos minutos de leitura
Terraform e a IaC (Infrastructure as Code)
Infraestrutura em cloud básica com Terraform
Já ouviu falar em IaC (Infrastructure as Code)? Sendo considerado quase um sinônimo para DevOps, é um processo de gerenciamento de projetos que visa documentar – via código – toda criação, alteração e destruição de qualquer infraestrutura, seja ela em Cloud Providers, On-Premises etc.
Por que adotar o IaC?
Pensando na infraestrutura como código, o IaC permite que você adote práticas poderosas usadas por desenvolvedores de software. Elas incluem controle de versão, code-review, testes automatizados, lançamento de releases por tags e entrega contínua, por exemplo.
Ferramentas:
- IaC: Terraform
- Cloud Provider: Amazon Web Services
Deploy de Instância EC2 Simples
Vamos botar a mão na massa? Nessa seção, iremos realizar um simples deploy na AWS. Para isso, deixo aqui um exemplo disponível em meu Github com uma simples instância EC2 e Security Group, que libera nosso acesso SSH.
Iniciando o workspace do Terraform: para dar início ao exemplo, vamos começar com o workspace do Terraform. É nele que devem estar todos os arquivos referente à sua infraestrutura.
terraform init
Variáveis:
Visualizando os arquivos .tf disponíveis, nota-se que boa parte da parametrização dos arquivos é composta por variáveis, que podem ser customizadas na hora da execução do Terraform.
Você pode declarar essas variáveis de duas formas: a primeira é declarar uma variável de ambiente com o prefixo TF_VAR_your_var. Assim, se o sufixo de sua variável estiver declarado em seu arquivo variable.tf, com o bloco a seguir, ele será reconhecido na execução.
variable "instance_type" {}
A segunda forma é declarar, explicitamente, na linha de comando do Terraform, da seguinte forma:
-var=var-name=var-value
Vamos deployar?
Vamos realizar o deploy da EC2 com Security Group na AWS! Para isso, utilizamos o segundo método de declaração de variáveis em linha de comando, a fim de dinamizar a execução do Terraform. Abaixo, segue a descrição da parametrização utilizada:
- AWS_REGION: Região na qual a sua infraestrutura se localizará. Segue, aqui, uma lista com as regiões disponíveis na AWS.
- AWS_ACCESS_KEY: ID de chave de acesso.
- AWS_SECRET_KEY: Chave de acesso secreta (link).
- KEY_NAME: As keys pairs são chaves criptografadas usadas para criptografar informações de login. Para criá-las, verifique esse link.
- INSTANCE_TYPE: Tipo de instância EC2 que será criada. Segue, aqui, uma lista com os tipos disponíveis na AWS.
- AMI_ID: AMI (Amazon Machine Image) é a imagem que será usada para criação da instância. Você pode tanto usar uma AMI predefinida quanto criar suas próprias! Para esse exemplo, vamos usar a AMI Linux 2 da AWS de ID: ami-02ccb28830b645a41.
- IP: IP público do seu host local para liberar acesso para sua instância.
Para visualizar os recursos que serão criados, você pode utilizar o comando abaixo, com a parametrização correta:
terraform plan -var=aws_region=your-region -var=instance_type=your-instance-type -var=key_name=your-key-pair-name -var=ami_id=ami-02ccb28830b645a41 -var=ip=$(dig +short myip.opendns.com @resolver1.opendns.com)
OBS: Você pode utilizar o comando -auto-approve para visualizar, instantaneamente, o planejamento.
Você poderá ver a seguinte saída:
An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # aws_instance.example will be created + resource "aws_instance" "example" { + ami = "ami-02ccb28830b645a41" + arn = (known after apply) + associate_public_ip_address = (known after apply) + availability_zone = (known after apply) + cpu_core_count = (known after apply) + cpu_threads_per_core = (known after apply) + get_password_data = false + host_id = (known after apply) + id = (known after apply) + instance_state = (known after apply) + instance_type = "t2.micro" + ipv6_address_count = (known after apply) + ipv6_addresses = (known after apply) + key_name = "tema20-calc" + network_interface_id = (known after apply) + password_data = (known after apply) + placement_group = (known after apply) + primary_network_interface_id = (known after apply) + private_dns = (known after apply) + private_ip = (known after apply) + public_dns = (known after apply) + public_ip = (known after apply) + security_groups = (known after apply) + source_dest_check = true + subnet_id = (known after apply) + tags = { + "Name" = "example" } + tenancy = (known after apply) + volume_tags = (known after apply) + vpc_security_group_ids = (known after apply) + ebs_block_device { + delete_on_termination = (known after apply) + device_name = (known after apply) + encrypted = (known after apply) + iops = (known after apply) + kms_key_id = (known after apply) + snapshot_id = (known after apply) + volume_id = (known after apply) + volume_size = (known after apply) + volume_type = (known after apply) } + ephemeral_block_device { + device_name = (known after apply) + no_device = (known after apply) + virtual_name = (known after apply) } + network_interface { + delete_on_termination = (known after apply) + device_index = (known after apply) + network_interface_id = (known after apply) } + root_block_device { + delete_on_termination = (known after apply) + encrypted = (known after apply) + iops = (known after apply) + kms_key_id = (known after apply) + volume_id = (known after apply) + volume_size = (known after apply) + volume_type = (known after apply) } } Plan: 1 to add, 0 to change, 0 to destroy.
Assim que visualizarmos o planejamento, vamos aplicar nossa Infra-as-Code.
terraform apply -var=aws_region=your-region -var=instance_type=your-instance-type -var=key_name=your-key-pair-name -var=ami_id=ami-02ccb28830b645a41
OBS: Você pode utilizar o comando -auto-approve para aplicar instantaneamente a infraestrutura.
Certo! Você pode acompanhar a criação em seu terminal:
aws_instance.example: Creating... aws_instance.example: Still creating... [10s elapsed] aws_instance.example: Still creating... [20s elapsed] aws_instance.example: Still creating... [30s elapsed] aws_instance.example: Creation complete after 31s [id=i-0d9af7d69985010c6] Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Pronto! Você acaba de fazer uma instância EC2 com Security Group na AWS. Mas, antes de encerrar, vou detalhar como fazemos conexão SSH com nossa máquina no Cloud Provider AWS.
Usando o key pair criada anteriormente, vamos realizar a conexão de forma segura e criptografada.
Partindo do princípio que você já tem a key pair em seu host local e a mesma foi usada para criar a EC2, vamos utilizá-la para realizar a conexão.
Abra seu terminal: vamos torná-la somente de leitura e apenas para o proprietário do arquivo.
chmod 400 your-key-pair.pem
Agora, novamente no seu terminal, execute o seguinte comando:
ssh -i your-key-pair.pem ec2-user@public-ip-instance
Certo! Você está dentro de sua instância EC2 na AWS!!
[ec2-user@ip-private-ip ~]$ echo "Hello World Hello World [ec2-user@ip-private-ip ~]$
Clean up
Agora que criamos o nosso exemplo, uma boa ideia é remover os nossos recursos da AWS. Podemos utilizar a própria solução do Terraform para resolver isso.
terraform destroy
Dessa forma, o Terraform utiliza o arquivo terraform.tfstate criado com a descrição dos recursos disponíveis para destruí-los.
Para mais exemplos como esse, acesse meu Github.
Caso tenha alguma dúvida ou algo a contribuir, deixe um comentário.
Até a próxima!