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 Distribution
e selecione o método de entrega Web.
- Selecione o bucket recém-criado em
Origin Domain Name
; - Em
Restrict Bucket Access
marque a opçãoYes
**e crie uma novaOrigin Access Identity
(caso não tenha uma); - Marque também a opção
Yes, Update Bucket Policy
emGrant 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 Settings
tem uma opção chamada Compress Objects Automatically, ativando ela os arquivos serão sempre compactados com o gzip.
- Agora em
Distribution Settings
defina 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 Pages
e 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 zones
e clique emCreate Hosted Zone
; - Em
Domain Name
adicione 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 campoType
e emValue
adicione oDomain Name
da 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 certificate
deixe emRequest a public certificate
e clique emRequest a certificate
; - O domínio que vamos adicionar em
Domain name
será o record que criamos no Route 53 com www. Em seguida clique emNext
;
- Em
Select validation method
marque a opçãoDNS validation
e clique emNext
; - Nas etapas 3 e 4 clique em
Review
e depois emConfirm and Request
; - Na etapa de
Validation
clique emCreate record in Route 53
e 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 Names
adicionei o domínio e emSSL Certificate
, marque a opçãoCustom SSL Certificate
e 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.