Implante o site Hugo na AWS S3 com o AWS CLI
Automatize a implantação do Hugo no AWS S3
A implantação de um site estático Hugo no AWS S3 usando a AWS CLI oferece uma solução robusta e escalável para hospedar seu site. Este guia cobre o processo completo de implantação, desde a configuração inicial até estratégias avançadas de automação e gerenciamento de cache.
Para um contexto mais amplo sobre tópicos de infraestrutura web, consulte o cluster de infraestrutura web.

A implantação com a AWS CLI está se tornando a abordagem padrão, já que a distribuição do Hugo removeu o comando deploy do pacote padrão.
Consulte sobre extended e withdeploy em Como Instalar Ubuntu 24.04 e ferramentas úteis se for fazer isso localmente e ainda quiser chamar hugo deploy.
Pré-requisitos
Antes de implantar seu site Hugo no AWS S3, certifique-se de ter:
- Um site Hugo pronto para implantação (se precisar de ajuda para criar um, consulte o guia de início rápido do Hugo)
- Uma conta AWS com permissões apropriadas
- AWS CLI instalado e configurado
- Conhecimento básico de operações de linha de comando
Construindo Seu Site Hugo
O primeiro passo para implantar seu site Hugo é gerar os arquivos estáticos. Use a Lista de Comandos do Hugo como referência para comandos e opções disponíveis.
Construa seu site com flags de otimização:
hugo --gc --minify
A flag --gc remove arquivos de cache não utilizados, enquanto --minify comprime seu HTML, CSS e JavaScript para desempenho ideal. Isso gera seu site estático no diretório public/, que é o que implantaremos no S3.
Configurando a AWS CLI
Se você ainda não configurou a AWS CLI, execute:
aws configure
Você será solicitado a inserir:
- ID da Chave de Acesso AWS: Sua chave de acesso AWS
- Chave Secreta de Acesso AWS: Sua chave secreta de acesso
- Região padrão: Sua região AWS preferida (ex.:
us-east-1,ap-southeast-2) - Formato de saída padrão:
json(recomendado)
Para acesso programático, certifique-se de que seu usuário IAM tenha permissões para:
s3:PutObjects3:GetObjects3:DeleteObjects3:ListBucketcloudfront:CreateInvalidation(se estiver usando CloudFront)
Criando e Configurando o Bucket S3
Criar o Bucket
Crie seu bucket S3 usando a AWS CLI:
aws s3 mb s3://your-bucket-name --region us-east-1
Importante: Escolha um nome de bucket globalmente único. Se planeja usar o bucket para hospedagem de sites, o nome do bucket deve corresponder ao seu nome de domínio se estiver usando um domínio personalizado.
Configurar Bucket para Hospedagem de Sites Estáticos
Ative a hospedagem de sites estáticos:
aws s3 website s3://your-bucket-name \
--index-document index.html \
--error-document 404.html
Definir Política do Bucket
Para acesso de leitura pública (se não estiver usando CloudFront), crie uma política de bucket:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}
Aplique a política:
aws s3api put-bucket-policy \
--bucket your-bucket-name \
--policy file://bucket-policy.json
Nota de Segurança: Se estiver usando CloudFront (recomendado), você pode restringir o acesso ao bucket S3 apenas ao CloudFront, eliminando a necessidade de acesso de leitura pública.
Implantando no S3 Usando a AWS CLI
O comando central de implantação usa aws s3 sync para fazer upload do seu site:
aws s3 sync public/ s3://your-bucket-name/ \
--delete \
--cache-control max-age=60
Parâmetros Chave Explicados
public/: Seu diretório de saída local do Hugos3://your-bucket-name/: Seu destino no bucket S3--delete: Remove arquivos no S3 que não existem localmente, garantindo que seu bucket espelhe sua build--cache-control max-age=60: Define os cabeçalhos de cache (60 segundos neste exemplo)
Opções Avançadas de Sincronização
Para ter mais controle sobre sua implantação:
aws s3 sync public/ s3://your-bucket-name/ \
--delete \
--cache-control "public, max-age=31536000, immutable" \
--exclude "*.html" \
--cache-control "public, max-age=60" \
--include "*.html" \
--exclude "*.js" \
--cache-control "public, max-age=31536000, immutable" \
--include "*.js"
Este exemplo define durações de cache diferentes para arquivos HTML (60 segundos) versus ativos estáticos como JavaScript (1 ano), o que é uma estratégia de otimização comum.
Configurando Distribuição CloudFront
Embora o S3 possa hospedar sites estáticos diretamente, usar o Amazon CloudFront como CDN oferece melhor desempenho, segurança e distribuição global. Para configuração de preços pay-as-you-go (pagamento conforme o uso), consulte criando CloudFront com pagamento conforme o uso.
Criar Distribuição CloudFront
aws cloudfront create-distribution \
--distribution-config file://cloudfront-config.json
Uma configuração básica do CloudFront inclui:
- Bucket S3 como origem
- Comportamentos de cache padrão
- Certificado SSL/TLS (do AWS Certificate Manager)
- Configuração de domínio personalizado (opcional)
Estratégias de Gerenciamento de Cache
Ao implantar através do CloudFront, considere estas estratégias de cache:
- Definir TTL Máximo: Configure o TTL Máximo do CloudFront para controlar por quanto tempo o conteúdo é armazenado em cache nas localizações de borda
- Versionamento de Conteúdo: Use identificadores de versão nos nomes de arquivos (ex.:
style-v2.css) para forçar atualizações de cache - Cabeçalhos Cache-Control: Defina cabeçalhos apropriados durante a sincronização S3 (como mostrado acima)
- Invalidação Seletiva: Invalidar apenas os caminhos alterados em vez de todo o cache
Invalidação de Cache
Após implantar atualizações, invalide o cache do CloudFront para servir conteúdo fresco:
aws cloudfront create-invalidation \
--distribution-id YOUR_DISTRIBUTION_ID \
--paths "/*"
Para invalidações mais direcionadas:
aws cloudfront create-invalidation \
--distribution-id YOUR_DISTRIBUTION_ID \
--paths "/index.html" "/blog/*"
Consideração de Custo: Os primeiros 1.000 caminhos de invalidação por mês são gratuitos. Depois disso, cada caminho custa $0,005. Use invalidação seletiva para minimizar custos.
Automação com CI/CD
Implantações manuais funcionam para projetos pequenos, mas a automação é essencial para fluxos de trabalho de produção. Você pode integrar este processo de implantação com Gitea Actions para implantar site Hugo no AWS S3 ou pipelines CI/CD similares.
Script de Implantação Básico
Crie um script de implantação simples:
#!/bin/bash
set -e
# Construir site Hugo
echo "Construindo site Hugo..."
hugo --gc --minify
# Implantar no S3
echo "Implantando no S3..."
aws s3 sync public/ s3://your-bucket-name/ \
--delete \
--cache-control max-age=60
# Invalidar cache CloudFront
echo "Invalidando cache CloudFront..."
aws cloudfront create-invalidation \
--distribution-id YOUR_DISTRIBUTION_ID \
--paths "/*"
echo "Implantação concluída!"
Torne-o executável e rode:
chmod +x deploy.sh
./deploy.sh
Exemplo de GitHub Actions
Para repositórios do GitHub, crie .github/workflows/deploy.yml:
name: Deploy to AWS S3
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: 'latest'
- name: Build
run: hugo --gc --minify
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Deploy to S3
run: |
aws s3 sync public/ s3://your-bucket-name/ \
--delete \
--cache-control max-age=60
- name: Invalidate CloudFront
run: |
aws cloudfront create-invalidation \
--distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} \
--paths "/*"
Monitoramento e Otimização
Habilitar Logs
Configure logs do S3 e CloudFront para rastrear padrões de acesso:
# Habilitar logs de acesso S3
aws s3api put-bucket-logging \
--bucket your-bucket-name \
--bucket-logging-status file://logging.json
Configurar Alarmes CloudWatch
Monitore sua implantação com CloudWatch:
aws cloudwatch put-metric-alarm \
--alarm-name high-error-rate \
--alarm-description "Alerta sobre alta taxa de erros" \
--metric-name 4xxError \
--namespace AWS/CloudFront \
--statistic Sum \
--period 300 \
--threshold 10 \
--comparison-operator GreaterThanThreshold
Solução de Problemas Comuns
Arquivos Não Atualizando
Se as alterações não estiverem aparecendo:
- Verifique o status da invalidação do cache CloudFront
- Confirme que a flag
--deleteestá sendo usada no comando de sincronização - Limpe o cache do navegador ou teste no modo anônimo
- Verifique as permissões do bucket S3
Implantações Lentas
Otimize o desempenho da sincronização:
- Use
--excludee--includepara pular arquivos desnecessários - Considere usar
--size-onlypara comparações mais rápidas - Use uploads paralelos com
--cli-read-timeoute--cli-write-timeout
Erros de Permissão
Certifique-se de que seu usuário IAM tenha:
- Permissões de acesso ao bucket S3
- Permissões de invalidação do CloudFront (se aplicável)
- Políticas de bucket configuradas corretamente
Resumo das Melhores Práticas
- Sempre use
--deletepara manter o S3 sincronizado com sua build local - Defina cabeçalhos de cache apropriados com base nos tipos de arquivo
- Use CloudFront para implantações de produção
- Automatize implantações com pipelines CI/CD
- Monitore custos - esteja atento às cobranças de invalidação do CloudFront
- Versione suas implantações - marque releases para rollback fácil
- Teste localmente primeiro - verifique sua build do Hugo antes de implantar
Recursos Relacionados
Para informações mais detalhadas sobre implantação do Hugo, consulte o guia abrangente sobre implantar site gerado pelo Hugo no AWS S3, que cobre opções adicionais de implantação e configurações.
Ao escrever seu conteúdo, lembre-se de usar blocos de código Markdown para exemplos de código e consulte a Lista de Comandos Markdown Abrangente para diretrizes de formatação.
Links Úteis
- Implantar site gerado pelo Hugo no AWS S3
- Usando Gitea Actions para implantar site Hugo no AWS S3
- Lista de Comandos do Hugo
- Lista de Comandos Markdown
- Usando Blocos de Código Markdown