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

Compartilhe este post:

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:

 

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!

Compartilhe este post: