Terraform/Google Cloud

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