Após muitos anos de serviço, resolvi aposentar o blog antigo feito com [Blogger do Google]. Minha experiência com geradores de site estáticos sempre foi muito boa, desde os primeiros geradores de sites estáticos que escrevi ainda nos anos 90, alguns em Object Pascal (Delphi), outros mesmo em Perl! Nos últimos anos, tive o prazer de criar o site da primeira [PyCon Amazônia], usando o [Pelican] e antes disso já vinha trabalhando numa nova versão do gerador do [site do meu livro]. Mas eu queria um blog novo e rápido, após alguma pesquisa, resolvi tentar o [Hugo], escrito em [Go] e ultra rápido. Achei bem simples, fácil de instalar e multiplataforma. O novo site, hospedado em [https://blog.nilo.pro.br] foi criado pela conversão dos posts do Blogger. Aproveitei também para portar a infraestrutura para a AWS, uma vez que o custo é muito baixo. Mas faltava algo, o processo de compilação e publicação não estava automatizado e percebi que estava há muito tempo sem postar nada, desde janeiro de 2017 para ser exato. Este tempo passou sem que eu percebesse. Embora o novo blog tenha sido publicado em fevereiro de 2019, nenhum novo post surgiu. Já era hora de resolver este problema.

Um site estático é simplesmente um site onde todas as páginas são criadas previamente, ou seja, que não dependende de um servidor para gerar seu conteúdo. Por exemplo, um site feito em Wordpress é um site dinâmico, pois o conteúdo de cada post vem de uma base de dados e cada página é montada a medida que é solicitada. Claro que hoje em dia existem várias formas de melhorar a performance destes sites, fazendo com que as páginas sejam geradas apenas quando são alteradas ou criadas. Um site dinâmico não pode funcionar sem seu servidor especialmente configurado, normalmente com uma base de dados e outros parâmetros necessários para seu funcionamento. Os sites dinâmicos surgiram para facilitar o gerenciamento de conteúdo on-line. A ideia era disponibilizar os criadores de conteúdo de ferramentas tão fáceis como as de um forum. E funciona muito bem, mas com um custo relativamente alto. Para autores que também programam, soluções com sites estáticos, que são semelhantes a como geramos programas passaram a ser bem interessantes. Sites estáticos podem ser gerados na máquina do autor/desenvolvedor, não precisão de banco de dados ou de um servidor especial. Um site estático pode rodar mesmo a partir de um diretório local no computador, facilitando o desenvolvimento e teste do conteúdo.

Um gerador de site estático como o Hugo processa uma série de diretórios, com os artigos do blog ou do site e os compila. Este artigo, por exemplo, foi escrito em Word, convertido para Markdown com o pandoc, editado no Vim e traduzido para html pelo Hugo. O Hugo também cria todos os links de navegação entre as páginas, incluíndo as tags e páginas internas. Tempo total na minha máquina virtual: 242 ms. Isso mesmo, todo o site do meu blog demora menos de 14 de segundo para ser inteiramente gerado. São mais de 300 arquivos e é rapído o suficiente para este seja recompilado a medida que salvo o arquivo.

A compilação em si é fácil de automatizar, pois o Hugo lê um arquivo de configuração e gera o site em uma pasta chamada public. A hospedagem na AWS (Amazon Web Services) é feita utilizando-se um bucket do Simple Storage Service, mais conhecido como S3. O S3 funciona como um disco na núvem para onde podemos copiar arquivos. O processo de hospedagem do site estático é bem simples, uma vez gerados, copia-se os arquivos para o S3 e pronto. O processo estaria terminado caso não houvessem dois problemas. Embora o S3 possa ser configurado como servidor web, ele não faz cache e você é cobrado por cada acesso, em sites grandes isso pode ficar caro. Hoje é interessante também dar acesso ao site em IPV6 e com certificados SSL/TLS. Para resolver estes problemas, precisamos usar uma outra solução da AWS, chamada Cloudfront. O AWS Cloudfront faz a distribuição de conteúdo em vários pontos pelo mundo, diminuindo o tempo de acesso entre o site e o cliente que o está acessando, fato interessante para mim, uma vez que meus servidores estão na Europa e que o blog é lido normalmente no Brasil.

Usando o Cloudfront é possível configurarmos uma distribuição (configuração) que diz o que distribuir onde, indicando principalmente a origem do conteúdo. Um bucket do S3 é uma origem compatível com o Cloudfront. Você também pode escolher usar um certificado SSL/TLS criado pela AWS gratuitamente, desde que seja usado pelos serviços deles. Desta forma, temos o conteúdo sendo servido próximo de quem o acessa (cache), usando SSL, com IPV6 e mesmo com suporte a HTTP/2! Tudo com apenas alguns clicks e sem precisar manter um servidor rodando. O custo mensal de toda esta infra-estrutura para menos de 5000 acessos por mês é algo inferior a 1€, muito abaixo de serviços de hospedagem mais simples.

Resta atualizar os arquivos gerados localmente e também gerar uma invalidação de cache no Cloudfront. Esta invalidação faz com que o cache seja esvaziado e que o Cloudfront recupere uma nova cópia dos arquivos no S3. Caso esta etapa não seja realizada, a atualização pode demorar algunas dias, até que a cópia em cache expire.

Vejamos como automatizar isso usando o cliente Python da AWS no Linux.

# Faz o build/gera o site estático no diretório public
hugo
# Copia o diretório public para o bucket. Substituir BLOG_BUCKET
# pelo nome do bucket que você criou.
aws s3 sync public/. s3://<<BLOG_BUCKET>>
# Cria a invalidação no Cloudfront. Substituir DIST_ID pelo ID de sua
# distribuição no CloudFront.
aws cloudfront create-invalidation --distribution-id <<DIST_ID>> --paths "/*"

E a atualização está feita. Desta forma, uma vez que um novo artigo é criado, o site pode ser atualizado com um só comando. Eu estou usando este script para atualizar o novo blog, espero que ele ajude a aumentar a frequência dos posts :-D!