
(IaC) Parte 6: Provisionando um DigitalOcean Droplet com Terraform
Faaalllaaaaaaaa turma! Voltando com tudo porque eu amo Cloud e DigitalOcean eu gosto demaisđ. Sem mais declaraçÔes⊠đ vamos ao que interessa, hoje vamos fazer do zero um provisionamento de um recurso de Droplet no provider da DigitalOcean usando o queridĂssimo Terraform. Mas Amaury, o que Ă© Droplet? nossa, Terraform? Bom, se vocĂȘ estĂĄ perdido nos termos, calma que hoje vocĂȘ vai aprender todos aqui comigo, do zero ao deploy na DigitalOcean.
Relembrando a trilha de IaC
No passado eu jĂĄ tinha escrito 5 artigos sobre Infraestrutura como CĂłdigo (IaC) usando Terraform, Ansible e AWS. Dessa vez, dando continuidade nessa trilha, vou usar a DigitalOcean como provider, eu acho bacana a gente aprender outros tipos de providers de computação em nuvem e particularmente eu gosto muito da DigitalOcean e acredito que depois dessa leitura vocĂȘ tambĂ©m poderĂĄ gostar! E se vocĂȘ perdeu de ler os 5 artigos sobre a trilha de IaC que eu escrevi, corre lĂĄ no Medium, na parte superior direita, tem o campo de busca onde vocĂȘ pode procurar pelos artigos.
Obtenha $100 para experimentar o DigitalOcean
Basta acessar o site: https://try.digitalocean.com/freetrialoffer/

Terraform: Introdução
Lembra no começo quando eu disse que vocĂȘ iria aprender todos os termos comigo? Pois Ă©, vamos começar falando sobre o Terraform. O Terraform Ă© uma ferramenta de infraestrutura como cĂłdigo, ou seja, Ă© a ferramenta ideal para que vocĂȘ possa escrever os requisitos da sua infraestrutura no formato HCL (Hashicorp Configuration Language), Ă© atravĂ©s do Terraform que vocĂȘ faz o provisionamento dos recursos em Cloud, seja mĂĄquinas virtuais, banco de dados, redes, e muito mais!
Vou iniciar essa parte jĂĄ assumindo que vocĂȘ tem instalado o Terraform no seu lab de estudos, pode ser (AWS EC2, Vagrant + VirtualBox) ou outro qualquer de sua preferĂȘncia. Caso vocĂȘ tenha dĂșvidas, basta acessar o site do Terraform, que ele mostra o passo a passo para vocĂȘ efetuar a instalação.
Principais comandos do Terraform
Deixo abaixo alguns dos principais comandos mais utilizados do Terraform. Basicamente vamos usar todos eles aqui no decorrer do nosso lab na DigitalOcean.
Main commands:
init Prepare your working directory for other commands
validate Check whether the configuration is valid
plan Show changes required by the current configuration
apply Create or update infrastructure
destroy Destroy previously-created infrastructure
Configurando o token de acesso da DigitalOcean
Nessa etapa teremos que criar nosso token de acesso na DigitalOcean para que o Terraform possa se comunicar com o provider via API. De forma bem simples, basta vocĂȘ acessar a sua conta da DigitalOcean e seguir os passos abaixo.
- Assim que vocĂȘ acessar sua conta da DigitalOcean, do lado esquerdo vocĂȘ verĂĄ uma opção chamada API. VocĂȘ clica nesse recurso.
- Assim que vocĂȘ clicar deverĂĄ ver uma tela similar Ă essa abaixo:

- VocĂȘ deve clicar no botĂŁo de gerar token e prosseguir com as etapas. No meu caso eu jĂĄ tenho o token criado e nĂŁo preciso passar por essa etapa.
OBS: Vale destacar que esse token vocĂȘ nĂŁo deve compartilhar ele de forma alguma com outras pessoas e nem passar ele via commit para o Github. Para isso, vamos gerar uma variĂĄvel, assim vocĂȘ fica mais seguro sobre isso, e basta rodar esse comando no seu terminal colocando o seu token que estarĂĄ tudo certo:
$ export DO_PAT=âyour_personal_access_tokenâ
Preparando nosso ambiente
Bom, nessa etapa podemos partir direto para a CLI do Terraform e começar a codar usando a linguagem do prĂłprio Terraform (HCL). Normalmente eu uso VS Code para isso, mas vocĂȘ pode escrever usando qualquer editor/IDE da sua preferĂȘncia. Eu gosto de usar o VS Code para Web, essa Ă© uma feature recĂ©m lançada da Microsoft que disponibilizou essa versĂŁo Web do VS Code.
Se vocĂȘ perdeu de ler meu Ășltimo artigo, cola lĂĄ depois para saber mais detalhes do VS Code para Web, eu fiz um overview sobre essa feature.
Codificando o DigitalOcean Droplet com Terraform HCL
Droplet no DigitalOcean nada mais Ă© do que um serviço de mĂĄquina virtual. Abaixo alguns exemplos de serviços disponĂveis na DigitalOcean:
digitalocean_droplet: Droplets (servers)
digitalocean_loadbalancer: Load Balancers
digitalocean_domain: DNS domain entries
digitalocean_record: DNS records
Para mais detalhes, sempre use a documentação oficial do produto.
Boas prĂĄticas do Terraform
Seguindo as boas prĂĄticas do Terraform, vamos separar nossos arquivos .tf
em vĂĄrios arquivos:
versions.tf
backend.tf
droplet.tf
variables.tf
Isso se faz necessĂĄrio para deixarmos nosso cĂłdigo reutilizĂĄvel. Por menor que seja os recursos que vocĂȘ estĂĄ desenvolvendo, aestrutura bĂĄsica de um projeto em Terraform Ă© ter varios arquivos .tf
O primeiro arquivo que eu vou escrever Ă© o arquivo versions.tf
é exatamente aqui nesse arquivo que vou passar as restriçÔes de versÔes que serão exigidas para executar esse projeto com Terraform.
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}
Feito isso, vamos para o segundo arquivo .tf
que agora vai ser o backend.tf
Nesse arquivo eu preciso setar qual Ă© o provider que estamos utilizando.
// Configure the DigitalOcean Provider
provider "digitalocean" {
token = var.do_token
}
Agora podemos partir para o nosso recurso em si, que Ă© o arquivo droplet.tf
Nesse arquivo descrevemos tudo sobre o que precisamos para criar um droplet na DigitalOcean.
// Configure the resource for DigitalOceanresource "digitalocean_droplet" "web" {
image = var.image
name = var.name
region = var.region
size = var.size
}
E por fim, vamos escrever nosso Ășltimo arquivo que Ă© o variables.tf
Aqui nesse arquivo definimos todas as variĂĄveis que pretendemos usar.
variable "region" {
description = "my region"
type = string
default = "nyc1"
}variable "size" {
description = "my size"
type = string
default = "s-1vcpu-1gb"
}variable "name" {
description = "name of my instance"
type = string
default = "web-1"
}variable "image" {description = "my image"
type = string
default = "ubuntu-18-04-x64"
}variable "do_token" {
description = "my token"
type = string
}
Uma boa pråtica para esse cenårio de variåveis é sempre colocar a descrição das variåveis, se é uma variåvel opcional ou obrigatória e qual é o tipo da mesma.
Outro ponto bacana, Ă© incluir o tfstate
dentro do .gitignore
, para vocĂȘ nĂŁo versionar o seu estado dentro do repositĂłrio. Pra isso Ă© sempre bom usar sempre o backend remoto, para armazenar o estado do Terraform em algum lugar separado do cĂłdigo, por segurança ou atĂ© mesmo backup (ex. AWS S3).
Hora de pÎr o Terraform em ação
Criado os arquivos, podemos partir para executar nosso projeto, lembrando o que queremos Ă© provisionar um DigitalOcean Droplet.
Primeiro comando que devemos executar Ă© o comando $ terraform fmt
Esse comando deve formatar corretamente nossos arquivos criados para que esteja dentro do estilo de marcação do HCL.
$ terraform fmt
backend.tf
variables.tf
versions.tf
Feito vamos executar o $ terraform init
$ terraform initInitializing the backend...Initializing provider plugins...
- Reusing previous version of digitalocean/digitalocean from the dependency lock file
- Using previously-installed digitalocean/digitalocean v2.16.0Terraform has been successfully initialized!You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
Agora vamos gerar o plano da nossa infraestrutura que serĂĄ provisionada. Vale lembrar que o seu token criado serĂĄ exigido aqui nesse comando, basta copiar e colar ele aqui que o Terraform prossegue.
$ terraform plan
var.do_token
my tokenEnter a value: Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ createTerraform will perform the following actions:# digitalocean_droplet.web will be created
+ resource "digitalocean_droplet" "web" {
+ backups = false
+ created_at = (known after apply)
+ disk = (known after apply)
+ graceful_shutdown = false
+ id = (known after apply)
+ image = "ubuntu-18-04-x64"
+ ipv4_address = (known after apply)
+ ipv4_address_private = (known after apply)
+ ipv6 = false
+ ipv6_address = (known after apply)
+ locked = (known after apply)
+ memory = (known after apply)
+ monitoring = false
+ name = "web-1"
+ price_hourly = (known after apply)
+ price_monthly = (known after apply)
+ private_networking = (known after apply)
+ region = "nyc1"
+ resize_disk = true
+ size = "s-1vcpu-1gb"
+ status = (known after apply)
+ urn = (known after apply)
+ vcpus = (known after apply)
+ volume_ids = (known after apply)
+ vpc_uuid = (known after apply)
}Plan: 1 to add, 0 to change, 0 to destroy.ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââNote: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now
Perceba que ele fez o plano de tudo que vai ser aplicado na DigitalOcean.
Aplicando as configuraçÔes na DigitalOcean
Nesse momento que conhecemos o plano da nossa infraestrutura, vamos executar o comando $ terraform apply
$ terraform apply --auto-approve
var.do_token
my tokenEnter a value: Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ createTerraform will perform the following actions:# digitalocean_droplet.web will be created
+ resource "digitalocean_droplet" "web" {
+ backups = false
+ created_at = (known after apply)
+ disk = (known after apply)
+ graceful_shutdown = false
+ id = (known after apply)
+ image = "ubuntu-18-04-x64"
+ ipv4_address = (known after apply)
+ ipv4_address_private = (known after apply)
+ ipv6 = false
+ ipv6_address = (known after apply)
+ locked = (known after apply)
+ memory = (known after apply)
+ monitoring = false
+ name = "web-1"
+ price_hourly = (known after apply)
+ price_monthly = (known after apply)
+ private_networking = (known after apply)
+ region = "nyc1"
+ resize_disk = true
+ size = "s-1vcpu-1gb"
+ status = (known after apply)
+ urn = (known after apply)
+ vcpus = (known after apply)
+ volume_ids = (known after apply)
+ vpc_uuid = (known after apply)
}Plan: 1 to add, 0 to change, 0 to destroy.
digitalocean_droplet.web: Creating...
digitalocean_droplet.web: Still creating... [10s elapsed]
digitalocean_droplet.web: Still creating... [20s elapsed]
digitalocean_droplet.web: Still creating... [30s elapsed]
digitalocean_droplet.web: Still creating... [40s elapsed]
digitalocean_droplet.web: Still creating... [50s elapsed]
digitalocean_droplet.web: Still creating... [1m0s elapsed]
digitalocean_droplet.web: Still creating... [1m10s elapsed]
digitalocean_droplet.web: Creation complete after 1m11s [id=273462873]Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Veja acima que temos o Droplet criado com sucesso na DigitalOcean usando o Terraform, de forma rĂĄpida e simples.
Faça o clone do projeto no Github
TambĂ©m deixarei os arquivos disponĂveis no Github para que vocĂȘs possam testar e se tiver alguma sugestĂŁo de melhoria, cria um PR que a gente discute junto depois! đ
FinalizandoâŠ
Para hoje seria isso pessoal, espero que tenham gostado da leitura e que tambĂ©m tenham praticado do seu lado. NĂŁo deixe de comentar se tiver dĂșvida, se gostou ou nĂŁo. Valew demais galera. Tmj!