quinta-feira, 7 de agosto de 2014

Hospedando um Website estático na Amazon


Como muita gente já sabe, a Amazon oferece serviços de ótima qualidade na "nuvem", através de uma iniciativa chamada de Amazon Web Services (ou, simplesmente, Amazon AWS).

Dentre os serviços disponíveis, estão alguns que - quando combinados - permitem a hospedagem de websites de uma forma muito fácil e com um custo relativamente baixo (e escalável).

Hoje então vou falar um pouco de hospedagem de websites, mais precisamente os estáticos, utilizando essa infra-estrutura da Amazon. Mais precisamente, vou abordar os serviços abaixo:
Além disso, pro exemplo, vou utilizar um domínio registrado no registro.br e já mostrar como fazer as configurações por lá (mas sem utilizar seu serviço de DNS).

De maneira geral, os serviços da Amazon podem ser acessados pelo "console", através do endereço https://console.aws.amazon.com, sendo necessários um cadastro prévio (gratuito) e a posterior autenticação para acesso à área pessoal de gerenciamento de serviços.



Hospedando o site no Amazon S3

O Amazon S3 (Simple Storage Service), como o próprio nome já diz, é o serviço de storage da Amazon. Através desse serviço, podemos armazenar os arquivos dos nossos sites de forma muito simples (a própria Amazon utiliza essa serviço para hospedar seus sites globais).

O painel de controle do S3 pode ser acessado diretamente pela URL "https://console.aws.amazon.com/s3".

Para hospedar o site Let's Boxe! (um website estático, bem simples), foram criados dois "buckets": a) "letsboxe.com.br" (principal); e b) "www.letsboxe.com.br".




Vamos primeiro à criação e configuração do bucket principal (sem o "www").

1. No menu "Actions", clicar em "Create Bucket...".



2. Digitar o nome do bucket (nome do domínio) e a região física onde os arquivos serão armazenados - o que influencia na latência nos acessos.


3. Pode-se configurar o serviço de log dos acessos clicando em "Set Up Logging".


4. Após clicar em "Create", o conteúdo do bucket e suas propriedades serão exibidos.

*É claro que, no momento da criação, o conteúdo do bucket estará vazio (na imagem existe conteúdo por se tratar de um bucket previamente criado).

5. Na aba "Permissions", observar as permissões definidas para o usuário utilizado na Amazon AWS e, se for o caso, pro serviço de log.


6. Nessa mesma aba, clicar no botão "Add bucket policy" e adicionar a política acesso abaixo (trocando apenas o nome do bucket).


*Para facilitar, o texto abaixo pode ser copiado:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AddPerm", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::letsboxe.com.br/*" } ] }

Obs.: Quando configuramos um bucket como um website, temos que configurar todos os objetos que queremos servir para serem publicamente legíveis. A política acima garante acesso para todos aos objetos presentes no diretório indicado (nesse caso, o diretório raiz do bucket). Claro que poderíamos melhorar essa regra, excluindo possíveis diretórios privados (sendo retornado um erro 403, "Access Denied", para qualquer arquivo solicitado que não tiver essa permissão de leitura atribuída).

*Para mais informações sobre políticas de segurança envolvendo os buckets, consulte a documentação: "Using Bucket Policies and User Policies".


7. Na aba "Static Website Hosting", selecionar a opção "Enable website hosting" e digitar o nome do arquivo de index e do arquivo de erro (ambos devem estar presentes na raiz no bucket) e clicar em "Save".



Vamos agora à criação e configuração do segundo bucket (com o "www").

1. Repita os passos de 1 a 4, utilizados na criação do bucket principal, colocando o "www." na frente do nome do bucket (nome do domínio).

2. Na aba "Static Website Hosting", selecionar a opção "Redirect all requests to another host name", digitar o nome do bucket principal no campo "Redirect all requests to" e Salvar.


Pronto, já estão configurados os dois buckets. Agora podemos fazer o upload dos arquivos do site para o bucket principal.


Carregando os arquivos do Website no bucket principal

Esse procedimento pode ser utilizado tanto para o primeiro carregamento dos arquivos, quanto para as futuras atualizações do site. Lembrando que os arquivos do website só serão carregados para o bucket principal (sem o "www"), sendo que o outro bucket (com o "www") só apontará pra ele.

1. Com o bucket selecionado, no menu "Actions", clicar em "Upload".


2. Na janela aberta, pode-se selecionar os arquivos para upload.


*Se clicar em "Add files", só será possível fazer upload de arquivos, ficando de fora os diretórios. A melhor maneira de selecionar todos os arquivos do website de uma vez é arrastando o conteúdo da pasta de deploy para a área em cinza "Drag and drop files and folders to upload here".

3. Selecionados os arquivos, pode-se fazer algumas configurações adicionais, como encriptação dos arquivos no servidor (clicando em "Set details"), ou, simplesmente, já clicar em "Start Upload".


4. Após o upload dos arquivos, para garantir o acesso público aos mesmos, pode-se selecioná-los e, no menu "Actions", clicar em "Make Public". 


Com isso, vai ser adicionada uma permissão de leitura para todos ("Everyone"), que pode ser conferida selecionando um dos arquivos e, na seção "Properties", abrindo a aba "Permissions".


5. Outra questão importante, para evitar cache de arquivos nos navegadores, é selecionar esses arquivos e, na seção "Properties", na aba "Metadata", definir um "max-age" (em segundos) pro "Cache-Control".



Bom, o próximo passo agora é configurar o servidor DNS, para apontar para os endpoints dos nossos buckets.


Configurando o Servidor DNS (Route 53)

O Route 53 é o serviço de Domain Name System (DNS) da Amazon. O interessante de se utilizar esse serviço de DNS (ao invés do serviço do registro.br, por exemplo) é que ele "casa" muito bem com outros serviços da Amazon, como o que acabamos de utilizar: o Amazon S3.

O painel de controle do Route 53 pode ser acessado diretamente pela URL "https://console.aws.amazon.com/route53".

1. No menu "Hosted Zones", clicar em "Create Hosted Zone" e preencher o campo "Domain Name" com o nome de domínio.



2. A hosted zone criada será listada na tabela e, clicando nela, serão apresentadas informações sobre a mesma.


Obs.: Para uma hosted zone recém criada, inicialmente só existirão 2 "Record Sets".

3. Clicar em "Go to Record Sets".



4. Os dois primeiros (tipos SOA e NS) já estarão criados e configurados. Deve-se então criar os outros dois (tipo A), um relativo ao bucket principal (sem o "www") e o outro ao segundo bucket (com o"www").

5. Para criar o Record Set do bucket principal, clicar em "Create Record Set" e preencher o formulário da seguinte forma: a) deixar o prefixo do campo "Name" em branco; b) manter o campo "Type" como "A - IPv4 address"; c) Marcar a opção "Alias" como "Yes"; d) clicar no campo "Alias Target" e selecionar o endpoint correspondente ao bucket criado no Amazon S3; e) Clicar em "Create".


6. Para criar o Record Set do segundo bucket, proceder da mesma forma que o primeiro, mas no item (a), preencher o prefixo do campo "Name" com "www.".



7. Ao final, devem ser observados os "Record Sets"apresentados na imagem do item 3.


Configurando o registro.br

Se você adquiriu seu domínio através do registro.br, como já estamos utilizando o serviço de DNS da própria Amazon, vamos precisar apenas fazer uma pequena configuração, informando os servidores "Master" e "Slave" da Amazon que iremos utilizar.


Esses valores podem ser obtidos dentre os 4 disponíveis no serviço Route 53, no Record Set do tipo "NS".

A dica aqui é fazer um "ping" nos 4 e utilizar o mais rápido como Master e o segundo mais rápido como Slave. Exemplo:

$ ping ns-1478.awsdns-56.org
PING ns-1478.awsdns-56.org (205.251.197.198): 56 data bytes
64 bytes from 205.251.197.198: icmp_seq=0 ttl=56 time=29.196 ms
64 bytes from 205.251.197.198: icmp_seq=1 ttl=56 time=29.974 ms
64 bytes from 205.251.197.198: icmp_seq=2 ttl=56 time=29.408 ms
64 bytes from 205.251.197.198: icmp_seq=3 ttl=56 time=30.176 ms

Pronto! Agora é só esperar (algumas horas) e observar a propagação do DNSwww.whatsmydns.net/#NS/letsboxe.com.br


E onde entra o Cloud Front então?

O Cloud Front é um serviço da Amazon para entrega de conteúdo na Web, que também poderia ser utilizado em conjunto com o Amazon S3, para disponibilização de websites.

De fato, o Cloud Front é um serviço de CDN (Content Delivery Network), replicando conteúdo em vários data-centers pelo mundo, sendo bastante indicado para casos de websites com maior número de arquivos de mídia (imagens, vídeos, etc) e/ou que tenham como requisito alta disponibilidade e performance.

Por outro lado, o custo de hospedagem ficaria um pouco mais alto; além do tempo de atualização de arquivos do site ser maior (pela necessidade de replicação em diferentes servidores).

O painel de controle do Cloud Front pode ser acessado diretamente pela URL "https://console.aws.amazon.com/cloudfront". Mas deixarei os detalhes de sua configuração para um post futuro.

No caso da configuração de DNS para um domínio no registro.br, ela ficaria algo assim:



Bom pessoal, com esse post tentei passar um pouco da experiência que tive para hospedar um site simples e estático na estrutura de cloud da Amazon. Como não sou especialista no assunto, sendo que o meu foco é mais a programação em si, pode ser que algum detalhe tenha ficado de fora. Além disso, procurei utilizar configurações mais básicas, para fins didáticos. De qualquer forma, fico aberto a sugestões de alterações!