Hospedando um site estático na AWS com S3 e CloudFront
Usando o S3 e CloudFront para hospedagem de uma aplicação web estática (por exemplo, uma aplicação Angular ou React) com boas práticas de segurança
Felipe Côrtes
mai 22, 2020 · 6 min de leitura
É possível utilizar o Amazon S3 para hospedar um site e, junto a ele, temos a utilização do protocolo HTTPS e uma distribuição pelas várias regiões com o Amazon CloudFront. Até agora não disse nada de novo, mas há um detalhe que muitos esquecem na hora de realizar a hospedagem: o bucket fica com acesso totalmente público. Assim, nesse artigo vou um pouco além e abordo um pouco da Bucket Policy do Amazon S3 e mostrar como adicionar um domínio ao site com o Amazon Route 53.
Um pouquinho sobre os serviços
Se você não conhece algum serviço que citei acima, vou explicar brevemente um pouco sobre cada um para que possa se ambientar.
- Amazon S3: é um serviço de armazenamento de objetos que oferece escalabilidade, disponibilidade, segurança e performance. Neste serviço será onde armazenaremos os arquivos estáticos do site.
- Amazon CloudFront: é um serviço rápido de rede de entrega de conteúdo (CDN) que entrega dados, vídeos, aplicativos e APIs a clientes em todo o mundo com segurança, baixa latência e altas velocidades de transferência em um ambiente de uso facilitado. Resumindo, este serviço será o responsável por entregar os arquivos estáticos do site.
- Amazon Route 53: é um web service Domain Name System (DNS) na nuvem altamente disponível e escalável. O Route 53 será o serviço que irá gerenciar o DNS.
- AWS Certificate Manager: é um serviço que permite provisionar, gerenciar e implantar facilmente certificados Secure Sockets Layer (SSL)/Transport Layer Security (TLS) para uso com os serviços da AWS e os recursos internos conectados.
Implantando e configurando o Amazon S3
Vamos começar criando um bucket:
- Navegue até o serviço do S3;
- Clique em
Create Bucket; - Adicione um nome exclusivo globalmente ao seu novo bucket, selecione a região de preferência e deixei ativo o
Block all public access; - Em seguida clique em
Create.
Nós não vamos utilizar o Static website hosting do S3 porque será necessário habilitar o acesso público dele. Utilizaremos o CloudFront para distribuir os arquivos estáticos do site e, nele, configurar o protocolo HTTPS e o domínio.
Agora vamos fazer o upload dos arquivos. Acessando o bucket criado, clique em Upload. Em seguida, adicione os arquivos desejados e clique em Upload.
Configurando o CloudFront
Vamos agora criar uma nova distribuição no CloudFront:
- Navegue até o serviço CloudFront, clique em
Create Distributione selecione o método de entrega Web.
- Selecione o bucket recém-criado em
Origin Domain Name; - Em
Restrict Bucket Accessmarque a opçãoYes**e crie uma novaOrigin Access Identity(caso não tenha uma); - Marque também a opção
Yes, Update Bucket PolicyemGrant Read Permissions on Bucket; - Indo para a etapa
Default Cache Behavior Settings, emViewer Protocol Policy, marque a opçãoRedirect HTTP to HTTPS(Com isso vamos força sempre o uso do HTTPS); - (Opcional) Em
Default Cache Behavior Settingstem uma opção chamada Compress Objects Automatically, ativando ela os arquivos serão sempre compactados com o gzip.
- Agora em
Distribution Settingsdefina emDefault Root Object(como por exemplo o index.html);
- Para finalizarmos, clique em
Create Distribution.
Você pode notar que não configurei o CNAME, farei isso no final do artigo porque nem todos tem um domínio em mãos para testar.
Ajustando a Bucket Policy
Vamos agora voltar para o bucket que criamos, em seguida vamos em Permissions e por fim em Bucket Policy. Aqui permitiremos que nossa distribuição no CloudFront acesse os arquivos do bucket adicionando essas permissões (Não esqueça de substituir o nome do bucket e o Origin Access Identity):
{
"Version": "2012-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "AllowGetObject",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E17XLR7K1HVHSH"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::nome-super-unico/*"
},
{
"Sid": "AllowListBucketContents",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E17XLR7K1HVHSH"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::nome-super-unico"
}
]
}Após salvar as alterações na Bucket Policy é possiver visualizar a aplicação com a URL do CloudFront, encontrada no campo Domain Name na distribuição criada.
Configurando páginas de error
Para finalizar a hospedagem do nosso site (caso não queira configurar um domínio), vamos adicionar uma página de error customizada. Voltando ao CloudFront:
- Selecione a distribuição criada e clique em
Distribution Settings; - Vá para a aba
Error Pagese clique emCreate Custom Error Response; - Vamos customizar o código de error 404 e redireciona-lo para uma página customizada;
- Finalize clicando em
Create.
(Opcional) Configurando um domínio personalizado
A única coisa que falta agora é adicionar um domínio personalizado para que possa ser mais fácil o acesso de um eventual público. Neste exemplo não vou comprar um domínio dentro da AWS, e sim, utilizar um domínio comprado em outro provedor e permitir que a AWS gerencie.
- Navegue até o servico Route 53;
- Vá em
Hosted zonese clique emCreate Hosted Zone; - Em
Domain Nameadicione o endereçamento do seu domínio e clique emCreate;
- Em seguida pegue, os 4 valores no registro do tipo NS e adicione em nameservers no provedor aonde adquiriu seu domínio. Após isso, demora de 2 a 24 horas para que a alteração seja propagada;
- Clique em
Create Record Set; - Adicione www no campo
Name, CNAME no campoTypee emValueadicione oDomain Nameda distribuição criada no CloudFront.
Vamos agora emitir um certificado para nosso domínio:
- Vá até o serviço AWS Certificate Manager e clique em
Get Started; - Em
Request a certificatedeixe emRequest a public certificatee clique emRequest a certificate; - O domínio que vamos adicionar em
Domain nameserá o record que criamos no Route 53 com www. Em seguida clique emNext;
- Em
Select validation methodmarque a opçãoDNS validatione clique emNext; - Nas etapas 3 e 4 clique em
Reviewe depois emConfirm and Request; - Na etapa de
Validationclique emCreate record in Route 53e depois emContinue.
Para que o certificado seja gerado demora até 30 minutos, fora o tempo que demora para propagar as alterações que fizemos no Route 53. A partir de agora recomendo esperar algumas horas antes de adicionar o domínio nas configurações do CloudFront Continuando:
- Navegue até o serviço CloudFront;
- Selecione a distribuição que criou e clique em
Distribution Settings; - Na aba General, clique em
Edit; - Em
Alternate Domain Namesadicionei o domínio e emSSL Certificate, marque a opçãoCustom SSL Certificatee adicionei o certificado que criamos no AWS Certificate Manager;
- Para finalizar clique em
Yes, Edit.
Quando voltar para a página inicial do CloudFront verá que o Status da distribuição está como In Progress. Quando mudar para Deployed é só acessar a url configurada.
Finalizado, agora é só desfrutar da aplicação.