Servindo e protegendo imagens do Amazon S3 utilizando o Amazon CloudFront

Marcelo Albuquerque
5 min readNov 12, 2022

Quando estamos criando um Bucket para servir imagens nos deparamos com muitas questões referentes a segurança e as orientações são enfáticas em relação a não deixarmos esse Bucket aberto de forma pública. Recentemente estive trabalhando em um projeto onde precisei me atentar a essa questão e estudando mais a fundo a própria documentação da AWS, cheguei a uma solução prática: o Bucket terá seu acesso restrito apenas ao CloudFront. Dessa forma, além de garantirmos a segurança de nosso Bucket, também ganhamos em performance, pois estamos configurando uma CDN para servir nossas imagens. Então, vamos ao tutorial!

Photo by Jan Antonin Kolar on Unsplash

Amazon S3

Vamos começar pela criação de nosso Bucket utilizando o Amazon S3. Podemos criar um Bucket com as configurações de segurança padrão, ou seja, não necessitamos liberar o acesso público, o que nos garante uma maior segurança.

Criação de um novo bucket

Observe que minha lista de Buckets está vazia. Clicando no botão "Create bucket" sou direcionado para a tela onde devo informar o "Bucket name", para este tutorial vou utilizar o nome marcelo-bucket-1, fique atento a região onde você está criando seu bucket. Não necessito alterar nenhuma outra opção, portanto, deixo todas as opções com os valores padrão:

Criação de um novo bucket

Amazon CloudFront

Com o Amazon CloudFront podemos entregar conteúdo de forma segura, com baixa latência e com altas velocidades de transferência. Considero obrigatória a utilização de uma CDN para entregar os conteúdos, seja seu produto um Web Site, Web App ou qualquer outro tipo de aplicação para Web.

O conceito aqui é simples, vamos criar uma distribuição que irá realizar a entrega de todo o conteúdo de nosso bucket. E apenas esta distribuição terá acesso permitido ao nosso bucket, qualquer requisição que seja feita fora de nossa distribuição diretamente ao nosso bucket será negada.

Criação de uma distribuição

Minha lista de Distribuições está vazia. Clicando no botão “Create distribution” sou direcionado para a tela onde devo informar e selecionar o “Origin domain” que nada mais é que a localização do conteúdo que desejamos entregar através do CloudFront, aqui vou selecionar o bucket que criamos na etapa anterior no S3. Observe que o campo "Name" foi preenchido de forma automática:

Lista de distribuições e configurações iniciais

O ponto chave é a escolha do "Origin access", temos aqui 3 (três) opções:

  • Public (Selecionando esta opção, o bucket obrigatóriamente deve permitir o acesso público, justamente o que queremos evitar).
  • Origin access control settings (recommended) (Também chamada de OAC, esta é a opção recomendada pela própria AWS que nos fornece maiores possibilidades e justamente a que vamos escolher).
  • Legacy access identities (Conhecida como OAI, precursora da OAC, que como podemos perceber deixou de ser a solução recomendada, porém, ainda funcional).

Se quiser saber um pouco mais sobre as diferenças entre a OAC e OAI, recomendo a leitura desse artigo.

Vamos selecionar a opção recomendada: Origin access control settings (recommended):

Seleção da Origin access

Observe que ao selecionar a "Origin access", um novo campo nos é exibido: o "Origin access control", que lista as configurações de acesso ao nossos buckets. Neste momento, não tenho nenhuma configuração criada, portanto, vou criá-la clicando no botão "Create control setting", em seguida será exibida uma tela para defirmos um nome para nossa control setting, podemos manter o nome sugerido ou informar um novo e mantemos as configurações padrão:

Criação da control setting

Fique atento a esta mensagem:

Mensagem informando que precisamos atualizar as políticas de acesso ao bucket

Esta mensagem está nos informando que precisamos atualizar as políticas de acesso ao bucket, porém, tais políticas só nos serão apresentadas após a criação da distribuição.

Vamos manter todas as outras configurações com os valores padrões e criarmos a distribuição:

Criação da distribuição

Obser que duas mensagens são exibidas após a criação da distribuição:

Mensagens após a criação da distribuição
  • Successfully created new distribution (Informa que a distribuição foi devidamente criada).
  • The S3 bucket policy needs to be updated (Esta é a mensagem mais importante, nos informa que as políticas de acesso ao nosso bucket precisam ser atualizadas. Conforme vimos no passo anterior).

Podemos então clicar no botão "Copy policy" para copiarmos a política de acesso que vamos configurar em nosso bucket:

Cópia da política de acesso a ser configurada no bucket

Não se preocupe caso tenha fechado essa mensagem sem copiar a nova política, a qualquer momento, mesmo tendo saído da página atual, podemos ter acesso a ela acessando a distribuição, navegando até a aba "Origin" e editando essa origin:

Este passo só é necessário caso por algum motivo, você não tenha atualizado a política no bucket.

Editando as políticas de acesso ao bucket

Precisamos acessar nosso bucket no Amazon S3 e atualizar sua política de acesso, podemos fazer isso acessando o link informado na mensagem de atualização de política ou ir diretamente ao bucket:

Observe que acessando diretamente o link, somos levados para a aba "Permissions" do nosso bucket.

Na aba "Permissions" temos acesso a política do bucket, vamos editá-la e simplesmente colaremos o conteúdo copiado no passo anterior. Observe que ao rolar, chegamos na seção "Bucket policty" e no canto direito, temos o botão "Edit", basta clicar nesse botão para podermos colar o conteúdo no formato JSON:

Colando o conteúdo copiado para a política do bucket

Finalizando

Retornando ao CloudFront, podemos verificar o "Status" da distribuição e também temos acesso ao "Domain name" para utilizarmos nas chamadas aos arquivos do bucket. Caso o processo ainda não tenha sido finalizado, basta aguardar até o "Status" estar com o valor "Enabled".

Retornando ao CloudFront

Com esses passos temos um Bucket configurado com segurança e uma CDN entregando nosso conteúdo de uma forma performática.

--

--