O Terraform é uma ferramenta para construir, alterar e atualizar a infraestrutura de forma segura e eficiente. Com o Terraform é possível gerenciar instâncias nos principais provedores de Cloud existentes de forma rápida e simples utilizando algumas linhas de código. O funcionamento do Terraform e sua proposta é muito simples, seus arquivos de configuração descrevem os componentes necessários para executar e criar uma instância. O Terraform gera um plano de execução descrevendo o que ele fará para alcançar o estado desejado e, em seguida, executá-o para construir a infra-estrutura descrita. À medida que a configuração muda, o Terraform é capaz de determinar o que mudou e criar planos de execução incrementais que podem ser aplicados. A infraestrutura que o Terraform pode gerenciar inclui tanto componentes de baixo nível, como instâncias computacionais, armazenamento e redes, bem como componentes de alto nível, como entradas DNS, recursos SaaS, etc. A principal características do Terraform é a infraestrutura como código onde com um simples arquivo de configuração conseguimos provisionar desde um simples cluster até um datacenter completo com a facilidade de poder reutilizar esse código para um outro projeto.
PRÉ-REQUISITOS
Uma conta no Google Cloud Plataform (GCP)
ACESSO
Precisaremos de acesso a API do Google Cloud para provisionar nossas instâncias. Para configurar nosso acesso:
# gcloud init && gcloud config auth
Para listar as configurações da nossa conta:
# gcloud config list
[compute]
region = southamerica-east1
zone = southamerica-east1-b
[core]
account = ********************
disable_usage_reporting = True
project = eminent-cache-186621
Your active configuration is: [default]
Como estou utilizando minha conta default vamos precisar atribuir as permissões para o Terraform poder fazer seu trabalho. Minha conta default:
# gcloud iam service-accounts list
NAME EMAIL
Compute Engine default service account 1094254645677-compute@developer.gserviceaccount.com
Agora vamos criar seu arquivo .json com as credenciais de acesso:
# gcloud iam service-accounts keys create google-cloud-terraform-key.json --iam-account=1094254645677-compute@developer.gserviceaccount.com
created key [941ecf26b96333127dc66558c64b04bb4ce78930] of type [json] as [google-cloud-terraform-key.json] for [1094254645677-compute@developer.gserviceaccount.com]
E atribuir a permissão para o nosso projeto:
# gcloud projects add-iam-policy-binding eminent-cache-186621 --member='serviceAccount:1094254645677-compute@developer.gserviceaccount.com' --role='roles/compute.instanceAdmin.v1' --role='roles/editor'
Se preferirmos podemos criar um projeto novo e não utilizar o nosso default:
# gcloud projects create nome_do_projeto
# gcloud iam service-accounts create --display-name=Terraform terraform
Created service account [terraform].
Setamos o projeto que desejamos trabalhar:
# gcloud config set project nome_do_projeto-ID
# gcloud iam service-accounts list
NAME EMAIL
Compute Engine default service account 1094254645677-compute@developer.gserviceaccount.com
Terraform terraform@eminent-cache-186621.iam.gserviceaccount.com
E setamos também a permissão com o gcloud projects add-iam-policy-binding como no exemplo anterior.
Instalando e configurando o Terraform
Agora vamos brincar com o Terraform. Sua instalação é muito simples:
# wget https://releases.hashicorp.com/terraform/0.11.1/terraform_0.11.1_linux_amd64.zip
# unzip terraform_0.11.1_linux_amd64.zip
# mv terraform /usr/local/bin/
And we’re go to go! 🙂 – Agora vamos dizer pra ele como se conectar a API do Google Cloud:
# touch main.tf
E inserimos o seguinte conteúdo:
provider "google" {
credentials = "${file ("/home/tadeu/terraform/google-cloud-terraform-key.json")}"
project = "eminent-cache-186621"
region = "southamerica-east1"
}
Nesse arquivo setamos nossas credencias de acesso, o ID do nosso projeto e a região das instâncias.
Criando uma instância
Agora vamos criar uma instância de teste, vamos fazer isto utilizando um arquivo separado para melhor organização da estrutura:
# touch instances.tf
E inserimos o seguinte conteúdo:
resource "google_compute_instance" "teste-gcloud" {
name = "teste-1"
machine_type = "n1-standard-1"
zone = "southamerica-east1-b"
service_account {
scopes = ["userinfo-email", "compute-ro", "storage-ro"]
}
boot_disk {
device_name = "teste-1"
auto_delete = "true"
initialize_params {
size = 50
image = "debian-9-stretch-v20171213"
}
}
network_interface {
network = "default"
access_config {}
}
}
Com os nossos arquivos main.tf e o instances.tf devidamente configurados executamos os seguintes comandos:
# terraform plan
# terraform apply
O terraform plan nos diz como será feito a criação da instância, e o apply como o próprio nome diz aplica a configuração para a criação da instância. Se tudo ocorreu conforme o esperado já podemos ver nossa instância UP and Running:
# gcloud compute instances list
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS
teste-1 southamerica-east1-b n1-standard-1 10.158.0.7 35.198.54.203 RUNNING
Para mais ajuda com a CLI do Terraform:
# terraform --help
CONCLUSÃO
O Terraform é uma ferramenta incrível que facilita em muito no dia a dia para a administração das instâncias em Cloud. Por possuir suporte a grande maioria dos provedores de nuvem o Terraform se mostra como uma solução para a unificação no gerenciamento dessas máquinas, não importando qual provedor você utiliza na sua infraestrutura. Sua sintaxe simples e de fácil configuração me chamou muito atenção e acredito que hoje o Terraform seja uma ferramenta indispensável para quem quer administrar a sua infra como código e ganhar tempo.
Referências:
https://www.terraform.io
http://alexander.holbreich.org/terraform-google-cloud/
http://blog.adron.me/articles/working-with-google-compute-engine/
https://lincolnloop.com/blog/provision-cluster-google-cloud-terraform/
https://www.youtube.com/watch?v=tE1WZg9ib8k&t=1251s