No mundo do Cloud Computing, é fundamental a implementação e gestão eficiente de recursos web. Este artigo mostra como configurar um site hospedado no Amazon S3 (Simple Storage Service), servido pelo Amazon CloudFront, e com recurso ao Terraform, uma ferramenta popular de Infraestrutura como Código (IaC). Mas, antes de mais, vamos conhecer os principais conceitos envolvidos.
O que é o AWS?
O Amazon Web Services (AWS) é uma plataforma de cloud abrangente e amplamente adotada que oferece mais de 200 serviços a partir de centros de dados em todo o mundo. O AWS fornece uma variedade de serviços, incluindo capacidade de computação, opções de armazenamento e capacidade de rede, que contribuem para a flexibilidade e escalabilidade dos recursos da cloud.
O que é um Bucket S3?
Um bucket do Amazon S3 é um recurso de armazenamento em cloud pública disponível no serviço AWS S3. Tal como as pastas de ficheiros, os buckets são utilizados para armazenar objetos, que podem ser dados e metadados descritivos. O S3, conhecido pela sua escalabilidade e disponibilidade de dados, é normalmente utilizado para cópia de segurança e recuperação, arquivo de dados e alojamento web.
O que é o CloudFront?
O Amazon CloudFront é um serviço de rede de entrega de conteúdo (CDN) rápido que fornece dados, vídeos, aplicações e API de forma segura a clientes de todo o mundo, com baixa latência e elevada velocidade de transferência. O CloudFront funciona perfeitamente com os serviços da AWS, como o S3, para acelerar a entrega de conteúdo web estático e dinâmico.
O que é o Terraform?
O Terraform, da HashiCorp, é uma ferramenta de software de Infraestrutura como Código que permite criar, alterar e melhorar a infraestrutura de forma segura e previsível. O Terraform gere serviços de cloud através de ficheiros de configuração declarativos, tornando-o uma ferramenta essencial para a infraestrutura de cloud moderna.
O poder do Terraform: compreender os mecanismos principais
O Terraform destaca-se no domínio da IaC pela sua abordagem única à gestão e aprovisionamento de recursos. Na sua essência, o Terraform funciona com base em dois princípios fundamentais: idempotência e gestão de estado. Entender como o Terraform funciona e o papel do ficheiro “terraform.tfstate” é fundamental para valorizar o seu poder e as suas capacidades.
Como o Terraform funciona
O Terraform utiliza uma abordagem declarativa, em que o utilizador define o estado desejado da sua infraestrutura em ficheiros de configuração. Segue-se uma breve descrição do seu funcionamento:
- Configuração: escrita de código em HCL (HashiCorp Configuration Language) para descrever o estado desejado da infraestrutura.
- Inicialização: a execução do ficheiro “terraform init” inicia o Terraform, configurando os fornecedores necessários.
- Planeamento: o “terraform plan” compara o estado desejado com o estado do mundo real e define um plano para alcançar o estado desejado.
- Aplicação: o ficheiro “terraform apply” executa o plano, fazendo as chamadas de API necessárias para criar, atualizar ou excluir recursos.
- Idempotência: este processo é idempotente, o que significa que reaplicar a mesma configuração não trará alterações, a menos que o estado desejado seja diferente do estado atual.
Gestão de estado do Terraform (terraform.tfstate)
O ficheiro “terraform.tfstate” é fundamental na forma como o Terraform rastreia o estado da infraestrutura:
- Ficheiro de estado: o Terraform armazena o estado da infraestrutura e a configuração neste ficheiro. Isso inclui metadados e o estado atual de cada recurso que o Terraform gere.
- Objetivo: o ficheiro de estado ajuda a mapear os recursos reais para a configuração desejada, mantém o controlo dos metadados e melhora o desempenho de grandes infraestruturas.
- Importância do planeamento: durante a fase de planeamento, o Terraform utiliza este ficheiro de estado para determinar quais as alterações que têm de ser feitas para atingir o estado desejado.
- Dados sensíveis: o ficheiro de estado pode conter dados sensíveis, pelo que é crucial geri-lo de forma segura, normalmente utilizando back-ends de estado remotos como o AWS S3 com encriptação e controlo de acesso.
Idempotência, agnosticismo e integração
Antes de mergulharmos no processo de implementação, é essencial entendermos os atributos exclusivos do Terraform que o tornam uma ferramenta indispensável à gestão de infraestruturas modernas, especialmente no contexto de implementação de um site em AWS.
Idempotência: infraestrutura fiável e consistente
Uma das principais características do Terraform é a sua idempotência, a qual garante que a execução da mesma configuração várias vezes resulta no mesmo estado, sem criar alterações ou duplicações desnecessárias. Esta propriedade é crucial para manter a consistência e a fiabilidade na gestão de infraestruturas:
- Quando aplicamos uma configuração do Terraform, ele calcula e executa apenas o que é necessário para atingir o estado desejado.
- Isto significa que se voltarmos a executar o Terraform sem alterar a configuração, ele não executará qualquer ação, uma vez que a infraestrutura já se encontra no estado desejado.
Agnosticismo: multi-cloud e multi-serviço
O Terraform é agnóstico em relação à cloud, o que significa que pode gerir recursos em vários fornecedores de cloud, bem como infraestruturas no local:
- Disponibiliza uma maneira unificada de interagir com diferentes serviços de cloud, do AWS ao Azure e ao Google Cloud.
- Este agnosticismo torna o Terraform incrivelmente versátil para estratégias multi-cloud, reduzindo a dependência de fornecedores e permitindo soluções de infraestrutura mais flexíveis.
Poderoso na gestão de alterações
A capacidade do Terraform para gerir e aplicar alterações de forma incremental é particularmente poderosa. No contexto da implementação do nosso site:
- Quando modificamos o “index.html” ou qualquer outro ficheiro do site, o Terraform lida com a atualização de forma eficiente.
- Apenas carrega os ficheiros alterados para o bucket S3 e pode desencadear a invalidação da cache do CloudFront, garantindo que os visitantes do website veem sempre o conteúdo mais recente.
Integração com CI/CD
A verdadeira força do Terraform num ambiente DevOps moderno é a sua compatibilidade com os pipelines de Continuous Integration and Continuous Deployment (CI/CD):
- O Terraform pode ser integrado em fluxos de trabalho de CI/CD, permitindo a implementação e a gestão automáticas de alterações na infraestrutura.
- Esta integração garante que as atualizações da infraestrutura são tão simplificadas como as alterações de código, alinhando-se com as práticas Agile.
Garantir a segurança e a eficiência nas implementações do Terraform no AWS
Antes de mergulhar nas etapas de implementação de um site com o Terraform no AWS, precisamos de configurar uma comunicação segura e eficiente entre o Terraform e o AWS. Este processo garante que o Terraform possa gerir os recursos do AWS de forma eficaz, aderindo às melhores práticas de segurança.
Configurar um utilizador AWS seguro para o Terraform
Criar um utilizador IAM dedicado
Para começar, é crucial criar um utilizador AWS Identity and Access Management (IAM) dedicado especificamente para o Terraform. Esse utilizador, ao qual podemos chamar “tf_s3_cloudfront”, terá permissões adaptadas aos recursos que o Terraform gerirá:
- Criar um utilizador IAM separado para o Terraform ajuda a isolar as permissões e a auditar as atividades do Terraform separadamente de outros utilizadores e serviços.
- Esta prática está em conformidade com o princípio do privilégio mínimo, garantindo que o utilizador não tem mais permissões do que as necessárias para executar as tarefas pretendidas.
Configurar a política de IAM
A política de IAM para “tf_s3_cloudfront” deve ser tão restritiva quanto possível, sem deixar de permitir que o Terraform execute as ações necessárias. Com base nos requisitos, a política deve incluir permissões para S3 e CloudFront:
- A permissão “s3:*” autoriza que o Terraform gira buckets S3 prefixados com “random-jokes-“.
- A permissão “cloudfront:*” consente que o Terraform gira distribuições do CloudFront.
Gerir as credenciais AWS de forma segura
Depois de configurar o utilizador IAM, é fundamental gerir de forma segura as credenciais AWS (ID da chave de acesso e chave de acesso secreta):
- Nunca codificar credenciais: evita codificar as credenciais do AWS nos ficheiros Terraform ou em qualquer código-fonte. A exposição de credenciais pode levar a vulnerabilidades de segurança.
- Usar variáveis de ambiente ou ficheiros de configuração: armazena as credenciais do AWS em variáveis de ambiente ou utiliza o ficheiro de credenciais do AWS (~/.aws/credentials). O Terraform deteta automaticamente as credenciais definidas através desses métodos.
- Integração com o pipeline de CI/CD: ao integrar o Terraform com pipelines de CI/CD, usa os recursos de armazenamento seguro da ferramenta de CI/CD para gerires as credenciais da AWS.
A importância da segurança e do privilégio mínimo
A adesão às melhores práticas de segurança e ao princípio do privilégio mínimo é crucial na gestão de infraestrutura da cloud:
- Minimização de riscos de segurança: as políticas de IAM restritivas e o tratamento seguro de credenciais minimizam os potenciais riscos de segurança e o acesso não autorizado.
- Conformidade e auditoria: a utilização de utilizadores IAM dedicados e o cumprimento das melhores práticas de segurança contribuem para a conformidade com as normas de segurança e facilitam a auditoria.
Ao seguires estes passos, garantes que o Terraform interage com o AWS de forma segura e eficiente, abrindo caminho para a implementação segura e eficaz do site.
Com as bases de segurança firmemente estabelecidas, podemos agora prosseguir para as etapas de implementação de um site no AWS utilizando o Terraform, confiantes de que a nossa infraestrutura não é apenas eficiente, mas também segura e compatível com as práticas recomendadas.
Implementar um site no AWS com o Terraform
Agora, vamos explorar as etapas para fazer upload de um site para o AWS S3 e defini-lo como a origem de uma distribuição do CloudFront, usando o Terraform.
Passo 1: configurar o Terraform
Comecemos por escrever os ficheiros de configuração do Terraform que definem os recursos AWS necessários. Isso envolve a criação de “main.tf”, “variables.tf”, “provider.tf” e outros ficheiros de configuração necessários:
- provider.tf: configura o fornecedor do AWS com as credenciais e a região necessárias.
- variables.tf: define variáveis como a região do AWS, o nome do bucket S3 e as configurações do CloudFront.
- main.tf: contém a lógica central para criar e configurar recursos do AWS, como buckets S3, distribuições do CloudFront e muito mais.
- output.tf: este ficheiro especifica os valores de output que o Terraform reportará ao utilizador. Esses outputs podem ser cruciais para entender os resultados da configuração, como URL, ID ou outros dados importantes.
Passo 2: criar um bucket S3
Definimos um bucket S3 no Terraform para armazenar os ficheiros do website. Ativamos o alojamento do site no bucket e configuramos as definições de acesso público de acordo com as nossas necessidades.
Passo 3: configurar o website no S3
Fazemos upload dos ficheiros estáticos do site (por exemplo, HTML, CSS, JavaScript) para o bucket S3, utilizando o recurso “aws_s3_object”. Esta etapa envolve a especificação do caminho do ficheiro e a garantia de que o tipo de conteúdo correto está definido.
Passo 4: configurar o CloudFront
Criamos uma distribuição do CloudFront com o bucket S3 como origem. Isso envolve a definição de um recurso de distribuição do CloudFront, a configuração da identidade do acesso de origem (OAI) e a configuração de comportamentos de cache.
Passo 5: implementar a invalidação de cache
Implementamos a invalidação de cache para garantir que as atualizações do site sejam refletidas imediatamente. Isto pode ser conseguido através de um “null_resource” com um fornecedor executável localmente no Terraform.
Explorada a implementação da configuração principal, vamos agora mostrar o papel das variáveis no Terraform.
As variáveis no Terraform funcionam como parâmetros personalizáveis, tornando as configurações da nossa infraestrutura mais adaptáveis e fáceis de modificar. Definidas no ficheiro “variables.tf”, estas variáveis podem ser atribuídas e alteradas sem alterar a lógica central dos nossos scripts Terraform.
Ao tirar partido destas variáveis, podemos personalizar facilmente os nossos recursos AWS, como especificar a região para a nossa distribuição CloudFront ou definir um prefixo para os nomes dos nossos buckets S3.
Implementar o index.html com o Terraform
Nesta nossa demonstração, o foco principal é implementar o ficheiro “index.html”, que serve como ponto de entrada para o nosso site estático hospedado no AWS S3 e distribuído via CloudFront. Para tal, é crucial compreender a estrutura e as práticas recomendadas por trás dessa configuração.
Compreender o index.html e o seu papel:
- O coração do website: o ficheiro index.html é essencialmente a página inicial ou a interface principal do website estático. Contém a estrutura HTML e é normalmente o primeiro ficheiro carregado quando alguém visita o site.
- Conteúdo e estrutura: este ficheiro pode incluir referências a outros recursos, como CSS para styling, JavaScript para interatividade e conteúdo multimédia, formando o núcleo da interface de utilizador do website.
Análise pormenorizada do código index.html:
O “index.html” fornecido é uma página web bem estruturada, concebida para mostrar “piadas aleatórias”. Vamos analisar os seus componentes principais.
Estrutura HTML
- <!DOCTYPE html>: esta declaração define o tipo de documento e a versão HTML, indicando que se trata de um documento HTML5.
- <html lang="en">: o elemento de raiz do documento HTML, com lang="en" a especificar que a língua principal é o inglês.
Secção “Head”
- <head>: contém metainformação sobre o documento, links para folhas de estilo e o título.
- <meta charset="UTF-8">: especifica a codificação de caracteres para o documento HTML.
- <meta name="viewport" content="width=device-width, initial-scale=1.0">: garante que a página é responsiva e renderiza bem em todos os dispositivos.
- <title>Random Jokes</title>: define o título da página web, exibido na barra de navegação ou no separador.
Estilos CSS internos
<style>: contém estilos CSS utilizados para estilizar o conteúdo HTML. Inclui:
- importação de uma fonte do Google Fonts.
- estilização para “body”, “joke container”, “joke texto”, e para o botão.
- o estilo do “body” define a cor de fundo, o tipo de letra e centra o conteúdo.
- o estilo do botão muda ao passar o rato para melhorar a interação com o utilizador.
Secção “Body”
- <body>: define o corpo do documento e contém todo o conteúdo do mesmo, como texto, hiperligações, imagens, tabelas, listas, etc.
- <div id="joke-container">: um container que inclui a piada e o botão.
- <div id="joke">: apresenta o texto da piada.
- <button id="next-joke-btn">: um botão para carregar a próxima piada.
JavaScript para conteúdo dinâmico
- <script>: inclui JavaScript para tornar a página interativa.
- Um “event listener” é anexado ao botão "Next Joke".
- A função “fetchJoke” vai buscar uma piada aleatória de uma API e atualiza o texto da piada na página.
- O tratamento de erros é incluído para apresentar uma mensagem se a obtenção da piada falhar.
Este ficheiro “index.html” é um excelente exemplo de uma página web simples, mas interativa. Combina a estrutura HTML, o estilo CSS e a funcionalidade JavaScript para criar uma experiência user-friendly, em que os visitantes podem desfrutar de uma nova piada a cada clique no botão. O uso de API externas para conteúdo dinâmico e princípios de design responsivo torna-a uma página web moderna e envolvente.
Na nossa configuração do Terraform, este ficheiro é estrategicamente colocado no diretório “static/html” para manter o projeto organizado e simplificar o processo de implementação no AWS S3 e no CloudFront.
Boas práticas: organização do ficheiro index.html
Colocamos o ficheiro “index.html” dentro do diretório “static/html”. Esta estrutura é uma boa prática pelas seguintes razões:
- Clareza e organização: separa claramente o conteúdo estático (como ficheiros HTML, CSS, JavaScript) de outras partes do código da infraestrutura, tornando o projeto mais organizado e mais fácil de navegar.
- Escalabilidade: à medida que o website cresce e inclui mais páginas e recursos, esta estrutura organizada torna-se cada vez mais vantajosa.
- Segurança: manter o conteúdo estático num diretório específico ajuda a implementar práticas de segurança, como permissões de acesso, de forma mais eficaz.
O papel do Terraform na implementação do index.html
Utilizando o Terraform, automatizamos a implementação do ficheiro “index.html” no bucket S3. Eis um trecho da configuração do Terraform que possibilita isso mesmo:
- Upload automatizado: o Terraform carrega automaticamente o ficheiro “index.html” do diretório local “static/html” para o bucket S3 especificado.
- Gestão dinâmica de conteúdos: as alterações feitas ao ficheiro “index.html” podem ser facilmente implementadas executando novamente o Terraform, assegurando que a versão mais recente do site está sempre disponível.
Guia visual: executar comandos do Terraform
1. Executar “terraform init”: iniciar o Terraform para fazer download dos plugins necessários e configurar o ambiente.
2. Executar “terraform plan”: delinear as alterações que o Terraform fará à infraestrutura AWS.
Interpretar o output do plano do Terraform
Executar o “terraform plan” é um passo crítico. Esse comando fornece uma visão geral das ações que o Terraform executará ao aplicar a nossa configuração. Vamos examinar um output típico que poderemos encontrar.
Plano: 10 para acrescentar, 0 para alterar, 0 para destruir
Este output pode ser decomposto da seguinte forma:
- 10 para adicionar: o Terraform identificou 10 recursos que precisam de ser criados para corresponder ao estado desejado. Podem ser novos recursos do AWS, como buckets S3, distribuições do CloudFront, funções IAM, etc.
- 0 para alterar: não existem recursos que precisam de ser atualizados. Se o Terraform tivesse detetado discrepâncias entre a nossa configuração e o estado atual dos recursos, este número refletiria a contagem de recursos a serem modificados.
- 0 para destruir: nenhum recurso está programado para ser removido. Se removermos um recurso da nossa configuração ou efetuarmos alterações que exijam a substituição de recursos existentes, este número indica quantos recursos serão destruídos e potencialmente recriados.
Importância do output do plano
- Revisão e confirmação: o output do plano permite-nos rever e confirmar as alterações antes de serem aplicadas. Este passo é crucial para evitar modificações não intencionais na nossa infraestrutura.
- Segurança e visibilidade: fornece um mecanismo de segurança, dando-nos visibilidade sobre a forma como a nossa infraestrutura será alterada sem efetuar quaisquer alterações imediatas.
- Auditoria e documentação: este output pode ser utilizado para efeitos de auditoria e como documentação das alterações efetuadas à nossa infraestrutura.
3. Aplicar com “terraform apply”: aplicar as alterações para implementar o “index.html” no bucket S3 e configurar o CloudFront.
Compreender o output do Terraform e testar no browser
Depois de executar o “terraform apply”, o Terraform disponibiliza variáveis de output que fornecem informações importantes sobre os recursos criados ou modificados. Vamos dissecar o output da nossa execução do Terraform e entender como testar o nosso site num browser.
Explicação do output do Terraform
- cloudfront_distribution_domain: este é o nome de domínio atribuído à nossa distribuição CloudFront. É através deste URL que os utilizadores acederão ao website. O CloudFront funciona como uma rede de distribuição de conteúdos para servir eficazmente o nosso website a utilizadores de localizações globais.
- s3_bucket_name: é o nome do bucket S3 onde os ficheiros do nosso website são armazenados. Este nome de bucket é gerado dinamicamente através de uma combinação de um prefixo especificado e de uma string aleatória para garantir a exclusividade.
- s3_bucket_url: é o URL direto para aceder ao bucket S3. Embora seja útil para o acesso direto, normalmente utilizaremos o URL do CloudFront para o acesso público, de modo a aproveitar a cache e a distribuição da CDN.
Testar o website num browser
- Acesso via CloudFront: abre um browser e navega até http://d2ajbha7qpdos6.cloudfront.net. Este URL deve carregar o website, servindo o ficheiro “index.html” a partir do bucket S3 através do CloudFront.
- Acesso através do URL do bucket S3: também podes aceder ao website diretamente através do URL do bucket S3 (http://random-jokes-ezld0h.s3-website.eu-central-1.amazonaws.com). No entanto, este modo de acesso não beneficia da rede de distribuição do CloudFront.
Além disso, como podes ver, não é possível aceder ao URL do bucket S3. Intencionalmente, está bloqueado para o mundo exterior e receberás uma mensagem de “acesso negado”. No nosso código, apenas o CloudFront pode aceder ao conteúdo no S3 como origem.
Demonstrar atualizações de conteúdos dinâmicos
Vejamos como são tratadas as atualizações do nosso website:
- Atualizar index.html: faz uma alteração ao ficheiro “index.html” no diretório “static/html”.
- Reaplicar a configuração do Terraform: executa o “terraform apply” novamente. O Terraform fará o upload do “index.html” atualizado para o bucket S3.
- Invalidação de cache: o Terraform também executará a invalidação da cache no CloudFront, garantindo que o conteúdo atualizado seja servido aos utilizadores.
- Verifica a atualização: atualiza o URL de distribuição do CloudFront no browser. Deverás ver as alterações refletidas, demonstrando a eficiência do Terraform na gestão e implementação de atualizações de websites.
Para ilustrar isto, vou alterar o “index.html” no texto do botão “Next Joke” - vou acrescentar pontos de exclamação !!!
Como vês, podemos constatar a mudança depois de usar o comando “terraform apply” no output. Além disso, o próprio Terraform gere a invalidação de cache para ver a nossa alteração no browser:
Usar o código
Se quiseres experimentar este projeto IaC, podes aceder ao código Terraform completo no meu GitHub. Basta clonares o repositório e seguires as instruções no arquivo README.md para configurares o teu próprio site estático no AWS S3 com o CloudFront.
Ao usares este repositório como ponto de partida, podes implementar e gerir rapidamente os teus sites estáticos no AWS com o Terraform. Não te esqueças de rever e adaptar o código aos teus requisitos específicos.
Boa programação!
Conclusão
À medida que o Cloud Computing continua a evoluir, ferramentas como o Terraform tornam-se indispensáveis para programadores e engenheiros. Não apenas simplificam as complexidades associadas à infraestrutura de cloud, como também garantem que essas infraestruturas sejam robustas, seguras e ágeis. Este guia serve como um testemunho das capacidades do Terraform, fornecendo um projeto para um alojamento web, baseado na cloud, eficiente e seguro.
Quer sejas um profissional experiente ou um novato em infraestrutura de cloud, as ideias e práticas descritas neste artigo oferecem um conhecimento valioso para aproveitar ao máximo o potencial do AWS e do Terraform. O percurso desde a configuração de um utilizador AWS com políticas IAM específicas até à visualização de um site em funcionamento realça o poder transformador da combinação dos serviços AWS com o processo de automatização do Terraform.
Olhando para os futuros avanços na tecnologia de cloud, a integração destas ferramentas e princípios desempenhará, sem dúvida, um papel fundamental na formação de paisagens digitais eficientes, seguras e escaláveis.
Lê sobre Multipart Upload com o Amazon S3 neste artigo.