Provisionar e gerenciar uma infraestrutura física ou virtual manualmente por meio da utilização de interfaces gráficas ou scripts customizados pode ser um processo demorado e suscetível a erros [1]. Devido à variedade de interfaces existentes há uma necessidade de aprendizado maior para cada interface utilizada e também uma constante revisão dos scripts utilizados.
Infrastructure as Code (IaC)
Infrastructure as Code (IaC) é o processo de gerenciamento e provisionamento de infraestrutura por meio de softwares e processos automatizados ao invés de processos manuais e manutenção de hardwares [2]. Com o IaC é possível criar arquivos de configuração com as especificações da infraestrutura, tornando o processo mais fácil de manter além de assegurar a implantação do mesmo ambiente todas as vezes.
[3] What is infrastructure as code (IaC)?
Com o crescimento do ambiente cloud, a utilização de containers e o desenvolvimento de micros serviços vem se tornando cada vez mais popular, exigindo um provisionamento da infra para várias aplicações menores em vez de aplicações maiores. Infrastructure as Code está sendo cada vez mais utilizado e tem se tornado a chave para manter a infraestrutura estável e atualizada conforme as diversas mudanças, possibilitando a automatização desse provisionamento [4].
IaC e DevOps
Na implementação das práticas DevOps e esteira de integração contínua/entrega contínua (CI/CD) o IaC facilita o trabalho dos desenvolvedores no provisionamento com a utilização de scripts para subir uma infraestrutura de aplicação totalmente configurada com pouco esforço.
Para obter sucesso na automação do ambiente de uma aplicação os times de desenvolvimento e operações devem estar alinhados para que não haja conflitos na configuração desse ambiente. O IaC possibilita esse alinhamento com a utilização de uma mesma linguagem no processo de deploy da aplicação. Além disso, o código da infraestrutura pode seguir a esteira CI/CD com as mesmas regras de testes e controle de versionamento que uma aplicação [5].
Abordagem Declarativa X Imperativa
Há duas formas de abordagem no Infrastructure as Code: declarativa e imperativa.
Na declarativa é informado qual o resultado final esperado, sendo necessário apenas as informações de recursos e propriedades que a infraestrutura precisa, com isso o IaC irá configurar e entregar conforme o solicitado.
Na abordagem imperativa o processo todo deve ser informado com detalhes, com todos os comandos necessários para a atingir o resultado final e sendo executados na ordem correta.
Quando mudanças são realizadas na abordagem declarativa a ferramenta de IaC utilizada se encarrega de aplicar as mudanças necessárias, enquanto na abordagem imperativa o usuário da ferramenta terá que saber quais os comandos necessários para realizar as mudanças [6].
Ferramentas de IaC
Para realizar o provisionamento e configuração da infraestrutura com IaC ferramentas específicas são necessárias. Algumas das mais utilizadas no mercado atualmente são:
- Ansible;
- Chef;
- Puppet;
- Terraform;
- AWS CloudFormation;
- Azure Resource Manager;
- Google Cloud Deployment Manager.
Caso de exemplo
Como exemplo de uso de IaC, mostrarei a criação de uma instância EC2 na Amazon Web Services (AWS) utilizando o Terraform.
Com o Terraform e AWS CLI instalado e as credenciais da AWS configuradas, basta criar um arquivo com o nome “main.tf” e inserir a configuração desejada:
[7] main.tf configuration file
Conforme a imagem, o arquivo de configuração é separado em blocos. O bloco “terraform {}” contém as configurações do Terraform, como os provedores necessários para a criação da infraestrutura. Nesse exemplo, está sendo utilizado o provedor AWS. O bloco “provider {}” configura o provedor específico, no caso foi definida a região utilizada na AWS, “us-west-2”. O bloco “resource {}” é utilizado para definir os componentes da infraestrutura. No exemplo acima, o AMI (Amazon Machine Image) utilizado tem como sistema operacional o Ubuntu versão 12.04 LTS e o instance_type “t2. micro” define uma instância de baixo custo da AWS.
Após a criação do arquivo de configuração, é necessário realizar a inicialização do diretório com o comando “terraform init” que realizará o download e instalará os provedores definidos na configuração.
Por fim, para criar a infraestrutura basta executar o comando “terraform apply” no console, que irá mostrar o plano de execução com as ações que serão realizadas pelo Terraform.
[8] terraform apply command
Após validar o plano de ação a ser executado, basta digitar “yes” para confirmar e seguir com a execução. Ao finalizar, a instância terá sido criada na AWS.
[9] Plan confirmation and execution
Referências
https://www.terraform.io/use-cases/infrastructure-as-code
https://www.vmware.com/br/topics/glossary/content/infrastructure-as-code.html
https://learn.microsoft.com/en-us/devops/deliver/what-is-infrastructure-as-code
https://www.redhat.com/en/topics/automation/what-is-infrastructure-as-code-iac
https://learn.hashicorp.com/tutorials/terraform/aws-build?in=terraform/aws-get-started
[1] Manual provisioning is slow and cumbersome (Terraform)
[2] What is Infrastructure as Code (IaC)? (Vmware)
[3] What is infrastructure as code (IaC)? (Microsoft)
[4] Why is Infrastructure as Code important? (Vmware)
[5] Why does IaC matter for DevOps? (RedHat)
[6] Declarative vs. imperative approaches to IaC (RedHat)
[7] main.tf configuration file (Hashicorp)
[8] terraform apply command (Hashicorp)
[9] Plan confirmation and execution (Hashicorp)