Está indeciso entre AWS CloudFormation e Terraform? Este artigo foi criado para auxiliar você a fazer a melhor escolha.
A computação em nuvem transformou o cenário do DevOps. Longe de ser apenas uma tendência, ela se estabeleceu como um pilar na forma como desenvolvemos e mantemos nossas aplicações. Embora existam inúmeras vantagens em adotar a nuvem para empresas de todos os portes, uma das dificuldades iniciais reside no provisionamento manual da infraestrutura.
Tradicionalmente, o usuário precisava acessar os consoles dos provedores de nuvem e configurar cada elemento individualmente. Essa abordagem pode funcionar em cenários mais simples, mas imagine a complexidade quando várias pessoas realizam alterações de configuração diretamente no console. O resultado é uma infraestrutura intrincada e de difícil manutenção, sem uma forma eficiente de colaboração ou rastreamento das mudanças. Felizmente, existe uma solução: a Infraestrutura como Código.
Infraestrutura como Código (IaC) é um conceito fundamental na computação em nuvem. Trata-se de gerenciar a infraestrutura de TI por meio de código. Em vez de interagir manualmente com os consoles, a IaC permite definir arquivos de configuração que provisionam a sua infraestrutura na nuvem. Isso oferece benefícios como consistência, agilidade na manutenção e minimização de erros humanos.
Utilizando IaC com Amazon Web Services
A AWS se destaca como o principal serviço de computação em nuvem, com uma participação de mercado duas vezes maior que seu concorrente mais próximo. A plataforma oferece mais de 200 serviços, atendendo a uma vasta gama de necessidades e cenários de uso.
Ao adotar a IaC na AWS, a decisão geralmente se resume a duas ferramentas: o AWS CloudFormation e a ferramenta de código aberto Terraform. Escolher entre elas pode ser desafiador devido à variedade de recursos oferecidos. Neste artigo, exploraremos as diferenças entre o AWS CloudFormation e o Terraform para auxiliar você a determinar qual ferramenta melhor atende aos seus requisitos.
Terraform vs. AWS CloudFormation: As Distinções
Modularidade
Em grandes organizações, a modularidade é um fator crucial na escolha da ferramenta de IaC.
CloudFormation
O CloudFormation não oferece suporte nativo a módulos. Em vez disso, ele utiliza um recurso chamado *pilhas aninhadas* para alcançar a modularidade.
Por exemplo, é possível definir uma configuração padrão para o provisionamento de um bucket S3. Você pode criar um template padrão do CloudFormation que cria buckets S3. Assim, quando um usuário precisar criar um bucket S3, ele poderá usar esse template como uma pilha aninhada para criar um bucket S3 padronizado.
Outra opção é o AWS Service Catalog, um serviço que ajuda na modularidade do AWS CloudFormation. O Service Catalog é projetado para organizações que desejam controlar o escopo dos serviços AWS, a fim de atender aos requisitos de conformidade, segurança, custo ou desempenho. Curiosamente, o AWS Service Catalog utiliza templates do CloudFormation em sua estrutura.
Para ilustrar, imagine que você deseja padronizar o uso de buckets S3 em sua organização para evitar problemas com dados sensíveis. Você pode criar um template de pilha aninhada, que pode ser usado em outras pilhas do CloudFormation. Ou, se preferir um controle mais granular, pode utilizar o AWS Service Catalog. Com o Service Catalog, os usuários podem usar o template padrão através do console, especificando alguns parâmetros. Isso permite controlar como a infraestrutura é provisionada em suas contas AWS e prevenir cenários indesejados.
Terraform
O Terraform oferece suporte nativo para módulos. É possível criar configurações padrão, de maneira similar ao CloudFormation, e usá-las em outras configurações do Terraform.
Por ser uma ferramenta de código aberto, você pode encontrar e usar módulos pré-construídos no Terraform Registry. Além disso, você pode criar seus próprios módulos e hospedá-los em um registro privado.
Pessoalmente, eu priorizaria o Terraform em vez do CloudFormation se a modularidade fosse um fator crítico.
Usar pilhas aninhadas no CloudFormation pode ser mais complexo do que usar módulos no Terraform. A principal dificuldade reside na transferência de dados de um template CFN para a pilha aninhada.
Não existe um local central para o compartilhamento de templates do CloudFormation. O AWS Service Catalog oferece uma forma de aplicar regras para a criação de infraestrutura via Console. No entanto, ainda é necessário realizar tarefas manuais no console para especificar os parâmetros da sua infraestrutura.
O Terraform, por outro lado, possui um método bem definido para criação, manutenção e compartilhamento de módulos. É fácil visualizar os requisitos dos módulos no Terraform Module Registry e utilizá-los em seus arquivos do Terraform.
Controle e Governança da Infraestrutura
Se você deseja limitar quais recursos sua equipe pode criar em suas contas AWS, tanto o CloudFormation quanto o Terraform oferecem as ferramentas para isso.
O CloudFormation, por si só, não oferece controle sobre o uso dos templates. No entanto, é possível utilizar políticas do AWS IAM para permitir que os usuários de sua conta AWS utilizem apenas templates padrão do CloudFormation para criar recursos. No exemplo do bucket S3, você pode restringir todas as permissões de “S3 Create” e permitir que os usuários criem buckets S3 apenas a partir do AWS Service Catalog ou de pilhas aninhadas.
O Terraform permite controlar quais recursos seus usuários podem criar usando uma ferramenta de política como código chamada Sentinel. O Sentinel possibilita a imposição de políticas refinadas e baseadas em lógica para permitir ou negar ações do usuário por meio do Terraform. Por exemplo, você pode negar todos os recursos que criam buckets S3 e permitir que os usuários criem buckets S3 somente a partir de um módulo padrão.
Gerenciamento de Estado
Tanto o AWS CloudFormation quanto o Terraform precisam acompanhar os recursos que estão sendo gerenciados.
O Terraform armazena o estado da sua infraestrutura em um arquivo de estado. Por padrão, esse arquivo é armazenado localmente, mas você pode armazená-lo em back-ends remotos, como o S3, permitindo que vários usuários realizem alterações na mesma infraestrutura.
O CloudFormation não mantém um arquivo de estado visível. Ele gerencia todo o processo de verificação de estado em segundo plano, sendo um serviço totalmente gerenciado.
Tanto o AWS CloudFormation quanto o Terraform permitem visualizar as mudanças que serão feitas na sua infraestrutura. No Terraform, você pode executar o comando “terraform plan” para ver como o Terraform planeja aplicar as alterações. No CloudFormation, os usuários podem verificar essas informações por meio dos conjuntos de mudanças.
Linguagem
O Terraform utiliza a linguagem de configuração da HashiCorp (HCL), uma linguagem criada pela própria HashiCorp. Ela é semelhante ao JSON, com funcionalidades e recursos adicionais.
Os templates do CloudFormation são escritos em formato YAML ou JSON.
Registro e Reversões
Ambas as ferramentas oferecem bons recursos de registro (logging). Na minha experiência, os erros e problemas foram geralmente diretos (na maioria das vezes).
CloudFormation: Por padrão, o CloudFormation reverte todas as alterações em caso de falha na atualização da pilha. Esse recurso pode ser desabilitado para fins de depuração.
Terraform: O Terraform não reverte as alterações automaticamente em caso de falha. No entanto, você pode usar o comando “terraform destroy” para excluir a configuração semi-provisionada e iniciar uma nova execução do Terraform.
Abrangência
O Terraform não se limita à Nuvem AWS. Um dos principais diferenciais entre Terraform e CloudFormation é que o Terraform oferece suporte a outros provedores e serviços de nuvem.
Portanto, se você planeja usar IaC para diversas plataformas de nuvem, o Terraform é a escolha ideal. O CloudFormation, apesar de ser uma ferramenta poderosa, está restrita à AWS. Usando o Terraform, você pode configurar a infraestrutura e implantar sua aplicação em várias plataformas, tornando sua aplicação mais disponível e resiliente.
Suporte a Funcionalidades
Geralmente, quando a AWS lança novos serviços e funcionalidades, o CloudFormation é atualizado antes do Terraform, por ser um serviço próprio da AWS. Atualmente, ambas as ferramentas cobrem a maioria dos serviços e funcionalidades. Isso pode ser uma pequena desvantagem do Terraform, mas existe uma solução.
É possível criar uma pilha do CloudFormation dentro do código Terraform. Ou seja, se você usa Terraform e ele não tem suporte para um recurso específico, pode configurar temporariamente uma pilha do CloudFormation no código do Terraform.
Suporte Técnico
O plano de suporte técnico pago da AWS também cobre o suporte do CloudFormation.
A HashiCorp também oferece planos de suporte técnico pago para o Terraform.
Conclusão
Tanto o AWS CloudFormation quanto o Terraform são ferramentas poderosas e completas. As diferenças acima irão ajudá-lo a tomar uma decisão informada e escolher a ferramenta que melhor atende às suas necessidades. Como recomendação pessoal, se você planeja usar várias plataformas de nuvem no futuro, ou se já usa várias nuvens, o Terraform é uma ótima opção por ser uma solução centralizada para todas as suas necessidades. Se você precisa de uma ferramenta IaC apenas para AWS, tanto AWS CloudFormation quanto Terraform são boas opções.
Se você tem interesse em aprender Terraform, explore esses cursos online.