Conceitos básicos de cloud computing, 2.1. Um pouco sobre Infrastructure-as-Code (IaC)
Tags: cloudcomputing, infrastructureascode, beginners
Published: 2023-10-29 11:05:25

Já vimos que a virtualização "desacoplou" a infra de computação, armazenamento e redes dos recursos de hardware. Por isso, antes de falar sobre escalabilidade é bom termos uma noção de _Infrastructure-as-Code_ (IaC), um _approach_ que nos permite tratar (provisionar e gerenciar) a infraestrutura como um sistema de software.

####:diamond_shape_with_a_dot_inside:O que é IaC?

É uma maneira de construir e gerenciar infraestrutura dinâmica e imutável. Além disso, como é código, nela podem ser adotas práticas de engenharia de software, sendo parte dos processos mais importantes na cultura DevOps, como o CI/CD.

Tudo bem, é uma infra como código, mas _qual_ código? 

As ferramentas de IaC usam linguagens declarativas de um nível mais alto, mais legíveis para humanos. Elas podem ser linguagens de serialização de dados como JSON e YAML ou Linguagens Específicas de Domínio (_Domain Specific Languages_, DSL) como o HCL da Hashicorp e o Bicep da Microsoft. Para mais informações sobre DSLs [clique aqui](https://www.jetbrains.com/pt-br/mps/concepts/domain-specific-languages/).

####:diamond_shape_with_a_dot_inside:O que a IaC tenta resolver?

Entre outros, os principais problemas que a IaC visa resolver são:

- :snowflake:**Drift de configuração** - dois ou mais ambientes que deveriam ser idênticos (como desenvolvimento, teste e produção) se tornam inconsistentes entre si, causando vulnerabilidades, uso ineficiente de recursos e menor resiliência. Isso pode levar a um segundo problema:

- :snowflake:**Snowflake servers** - com o tempo os servidores inconsistentes se tornam tão diferentes que não sabemos mais exatamente como funcionam. São difíceis de reproduzir e caso precisem sofrer alguma mudança os efeitos são imprevisíveis.

Assim, Kief Morris em _Infrastructure as Code: Managing Servers in the Cloud_ destaca alguns princípios da IaC:

:snowflake:**Reprodutibilidade** - deve ser possível reconstruir qualquer elemento de uma infraestrutura sem esforço (a versão do software, o hostname etc. devem estar nos scripts e ferramentas) e de forma segura

:snowflake:**Consistência** - dois elementos da infra que fornecem o mesmo serviço devem ser quase idênticos, só mudando aquilo que os faz únicos (como o IP, p. ex.)

:snowflake:**Repetibilidade** - qualquer ação na infra deve ser repetível

:snowflake:**Descartabilidade** - uma frase de Bill Baker resume esse princípio: 

> Trate seus servidores como gado, não como pets

Explico: devemos pressupor que qualquer elemento da infra pode e será destruído ou substituído a qualquer momento, seja deliberadamente ou por falha do hardware.

Isso exige que toda mudança de impacto deva ser feita **por meio de scripts automatizados que criam e configuram os servidores**.

:snowflake:**Continuidade do Serviço** - nosso serviço deve permanecer disponível mesmo quando há falha em algum elemento na infra. Nas palavras de Morris: 
> Rodar um serviço continuamente disponível sobre uma infraestrutura descartável

:snowflake:**Sistemas auto-testáveis** - assim como no desenvolvimento de software, qualquer mudança no código deve ser acompanhada por testes automatizados



:snowflake:**Idempotência** - uma dada task, script ou operação deve _sempre_ gerar o mesmo resultado, independente do estado em que o ambiente se encontra

E o princípio mais importante:

:snowflake:**Versionamento** - além de ser facilmente compartilhável, o código da infra versionado proporciona:

- :zap:Rastreabilidade - sabemos o _que_ foi feito, por _quem_ e o contexto 




- :zap:Rollback - quando alguma mudança causa falha é possível saber como tudo estava antes




- :zap:Correlação - quando há versionamento e tudo está relacionado por tags (ou versões) é mais fácil rastrear e resolver problemas




- :zap:Visibilidade - todo o time é avisado quando uma alteração é commitada




- :zap:Transparência - arquivo versionados (scripts, configuração, definições) tendem a ser mais legíveis para humanos




- :zap:"Acionabilidade" - os sistemas de controle de versão permitem a existência de _gatilhos_, essenciais para o processo de CI/CD



Esses princípios junto a scripts facilitam a automação de processos e a escalabilidade de serviços. 

Mas, então, o que é automação?

Automação não é só usar scripts em ferramentas para facilitar um tarefa manual, isso é o processo de _tool building_. Automação é eliminar a necessidade do trabalho manual de tal forma que o próprio script execute sua tarefa _automaticamente_ (lembra dos gatilho do último princípio de IaC?) sem precisar de uma pessoa.

Agora sim, com esses conceitos em mente, ficará mais fácil entender a capacidade de escala e redundância da nuvem.