Implantar site Hugo no AWS S3
O Hugo é um gerador de sites estáticos.
Quando o site é gerado com o Hugo, é hora de implantá-lo em alguma plataforma de hospedagem. Aqui está um tutorial sobre como fazer o push para o AWS S3 e servir com a CDN AWS CloudFront.

Este guia faz parte do cluster Infraestrutura Web — publicação estática, CDN, indexação e serviços de domínio.
Para um fluxo de trabalho de implantação completo baseado em CLI, consulte Implantar Site Hugo no AWS S3 com AWS CLI.
Preparar o site
Não será descrito aqui como criar um projeto de site Hugo ou adicionar artigos ou posts de blog lá. Assumimos que você já fez isso.
Se não, aqui está uma inicialização rápida do Hugo
Opções de Implantação
Existem várias opções disponíveis para implantar e hospedar um site gerado pelo Hugo (https://gohugo.io/hosting-and-deployment/). Pessoalmente, gosto de:
- Como um site Hugo pode ser hospedado no GitHub
- AWS Amplify para construção e implantação.
- e implantar no S3 com o comando hugo deploy e servir com AWS CloudFront CDN e AWS Route53 e AWS Lambda.
Para alternativas como Netlify, consulte Netlify para Hugo e sites estáticos: preços, nível gratuito e alternativas.
Abaixo, descrevo exatamente isto - o último método.
1. Criar bucket S3 com permissões relaxadas
Acesse: https://console.aws.amazon.com/s3
-
Crie um bucket com um nome como o do site, por exemplo: “microsoft.com”
-
Clique no bucket => propriedades, mais abaixo => hospedagem de site estático

-
Clique em editar, depois - ativar, e “hospedar um site estático”

- também coloque lá em index: index.html e em error: 404.html
- Clique em salvar, lembre-se do “endpoint do site do bucket”, ficará assim: http://microsoft.com.s3-website-ap-southeast-2.amazonaws.com
- Acesse as permissões do bucket, veja as imagens abaixo. O acesso público não deve ser bloqueado.


- Política do bucket (substitua microsoft.com pelo seu nome de domínio):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::microsoft.com/*"
}
]
}
2. Criar Certificado
Acesse o gerenciador de certificados da AWS https://console.aws.amazon.com/acm Escolha a região correta.
- Clique em solicitar
- certificado público
- nomes de domínio: escolha dois como: “microsoft.com” e “www.microsoft.com”
- você pode pedir mais subdomínios como “blog.microsoft.com”, “xmpp.microsoft.com” etc.
- faça a validação DNS. É muito mais fácil fazer/pushar isso via console Route53 se o seu registrador for a AWS.
3. Implantar função Lambda no Lambda@Edge
A função Lambda@Edge irá reescrever as URLs do projeto Hugo QuickStart para diretórios para um objeto padrão, index.html. É assim que o Cloudfront serve a URI ‘/posts/my-post/’ com o conteúdo ‘/posts/my-post/index.html’ retornando 200 em vez de 404.
Código Lambda@Edge Flavor Cafe (Scotch)
// Hugo no Cloudfront, função Lambda@Edge
// Flavor Cafe (Scotch)
// @starpebble no github
//
// Duas regras de reescrita para uri's de subdiretórios do hugo.
// Exemplo:
// 1. reescrever uri /posts/ para /posts/index.html
// 2. reescrever uri /posts para /posts/index.html
//
// Adicione tantas extensões de arquivo quanto desejar para a regra 2.
// uri's que terminam em extensões de arquivo conhecidas não são reescritas pela regra 2.
'use strict';
// @starpebble no github
// hugo flavor cafe (scotch)
const DEFAULT_OBJECT = 'index.html';
exports.handler = (event, context, callback) => {
const cfrequest = event.Records[0].cf.request;
if (cfrequest.uri.length > 0 && cfrequest.uri.charAt(cfrequest.uri.length - 1) === '/') {
// e.g. /posts/ para /posts/index.html
cfrequest.uri += DEFAULT_OBJECT;
}
else if (!cfrequest.uri.match(/.(css|md|gif|ico|jpg|jpeg|js|png|txt|svg|woff|ttf|map|json|html)$/)) {
// e.g. /posts para /posts/index.html
cfrequest.uri += `/${DEFAULT_OBJECT}`;
}
callback(null, cfrequest);
return true;
};
4. Criar CDN AWS CloudFront
Isso não funcionará com a nova interface da AWS Console, você precisará usar o comando de linha de comando aws cli - consulte Criar AWS CloudFront no modelo Pay-as-You-Go (não o Plano Gratuito)
Acesse https://console.aws.amazon.com/cloudfront
- Criar Distribuição
- criar origem apontando para seu bucket s3

- Certificado para seu site
- quando oferecer converter para site estático - concorde
- criar comportamento apontando para sua origem, e Redirecionar Http para Https

- abaixo em comportamentos/associações de funções - em Solicitação de Origem - selecione sua Função Lambda

- Salvar
- Acesse a aba Geral da sua distribuição e copie o nome de domínio da sua Distribuição. Deveria parecer com: asdfasdfasdf.cloudfront.net

5. Apontar DNS AWS Route53 para seu CloudFront
Acesse https://console.aws.amazon.com/route53/v2/hostedzones
- crie ou clique na zona hospedada do seu site. Deve ser chamada como seu site: por exemplo: “microsoft.com”
- crie um registro “A” vazio apontando para sua distribuição CloudFront (nome de domínio da Distribuição)
- crie um registro “A” “www” apontando como alias para seu primeiro registro “A”
6. Instalar aws cli
- Instale as ferramentas de linha de comando do cliente aws https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
- configure a conexão aws cli
- verifique o arquivo ~/.aws/credentials, deve ter algo como
[default]
aws_access_key_id = .......
aws_secret_access_key = .......
- teste a conexão, digite algo como abaixo para ver seu bucket s3
aws s3 ls
7. Atualize seu config.toml
- abra seu hugo.toml ou config.toml em seu projeto hugo
- adicione ao final (substitua novamente microsoft.com pelo seu):
[[deployment.targets]]
# Um nome arbitrário para este alvo.
name = "lfs3"
# S3; veja https://gocloud.dev/howto/blob/#s3
# Para endpoints compatíveis com S3, veja https://gocloud.dev/howto/blob/#s3-compatible
URL = "s3://microsoft.com?region=ap-southeast-2"
# Se você estiver usando uma CDN CloudFront, o deploy invalidará o cache conforme necessário.
cloudFrontDistributionID = ""
Se você mantiver seus configs em config.yml, deve ficar assim
deployment:
targets:
name: "lfs3"
URL: "s3://microsoft.com?region=ap-southeast-2"
cloudFrontDistributionID: "E123123123"
- salve este arquivo
- compile seu site
hugo
- implante com o comando hugo deploy
hugo deploy
- abra a URL do seu site no navegador para ver se tudo funcionou
Para mais tópicos de infraestrutura web, consulte o pilar de infraestrutura web.
Links úteis
- Enviar Formulário Google em Site Hugo
- Adicionar marcação de dados estruturados ao site Hugo
- Hugo Cheat Sheet
- Implantar Site Hugo no AWS S3 com AWS CLI
- Usando Gitea Actions para implantar site Hugo no AWS S3
- Inicialização rápida do Hugo: https://gohugo.io/getting-started/quick-start/
- Grande lista de exemplos de temas Hugo: https://themes.gohugo.io/
- Hospedagem e implantação do Hugo: https://gohugo.io/hosting-and-deployment/
- Manipulação de imagens no Tema Mainroad do Hugo: Manipulação de imagens do tema Mainroad
- Instalar Interface de Linha de Comando AWS (AWS CLI): https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
- Temas mais populares para Hugo
- Como armazenar imagens de miniatura na pasta do bundle de página para sites Hugo com tema Mainroad
Espero que este pequeno documento de tutorial ajude você. Tenha um ótimo dia!