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:

 

Code 1-1

 

  • 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.

 

Code 2-1

 

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.

 

Code 3-1

 

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.

 

Code 4-1

Code 5-1

 

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.

 

Code 6-1

 

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.

 

Code 7-1

 

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.

 

Code 8-1

Code 9-1

 

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:

 

Code 10-1

 

  • 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.

 

Code 11-1

 

2. Executar “terraform plan”: delinear as alterações que o Terraform fará à infraestrutura AWS.

Code 12-1

Code 13-1

 

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.

 

Code 14-1

Code 15-1

 

 

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

Code 16-1

 

  • 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.

 

Code 17-1

Code 18-1

 

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.

 

Code 19-1

 

 

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 !!!

 

Code 20-1

 

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:

 

Code 21-1

Code 22-1

 

 

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.

Partilha este artigo