Nos últimos anos, o armazenamento em linha tornou-se uma prática corrente, proporcionando arquitecturas altamente escaláveis, maior segurança e ampla acessibilidade aos dados. Um dos serviços de armazenamento mais populares é o Simple Storage Service da Amazónia, conhecido popularmente como S3.
O Amazon S3 é um serviço extremamente poderoso no centro da Amazon Serviços Web. No entanto, fora do ambiente de produção, pode ser difícil trabalhar com o S3. Envolve a passagem de chaves de acesso, o aprovisionamento de contas de utilizador e a manutenção de uma ligação de rede fiável, para não mencionar que custa dinheiro. O FakeS3 é um servidor leve que simula o comportamento do S3 real. Responde às mesmas chamadas que o Amazon S3 responde e armazena os ficheiros carregados no seu sistema de ficheiros local - não são feitos pedidos ao serviço da Amazon. Embora a gem não suporte o conjunto completo de comandos do S3, a API implementada é suficiente para a maioria dos casos de uso das aplicações.
Neste artigo, vou apresentar a abordagem de integração do AWS e FakeS3 com Paperclip - popular biblioteca de anexos de ficheiros para Active Record. O Paperclip e o S3 misturados fornecem um sistema eficaz de armazenamento de ficheiros que combina as funcionalidades principais do Paperclip (como a gestão de validações e transformações de imagem) com as vantagens do armazenamento online. Embora a configuração destas ferramentas não seja óbvia e exija a consulta de documentação detalhada, bem como a resolução de muitos problemas específicos das gemas, vale a pena gastar algum tempo para tornar o desenvolvimento mais rápido e eficiente.
Qual é o nosso objetivo?
A integração das ferramentas descritas requer três etapas:
Lançamento do servidor falso S3 fornecido pela gem FakeS3 em segundo plano.
Configuração do cliente AWS S3 para delegar todos os pedidos ao servidor falso lançado.
Configurar o Paperclip para utilizar um endpoint S3 falso nos URLs dos recursos criados.
Certifique-se de instalar a versão 1.6 do aws-sdk. O Paperclip, que usa SKD para gerenciar o armazenamento no serviço da Amazon, não funciona bem com versões superiores desta gem. Isso se deve a mudanças significativas na API do SDK trazidas com a versão 2.0.
Lembre-se também que o principal objetivo do FakeS3 é minimizar as dependências de tempo de execução. É mais uma ferramenta de desenvolvimento para testar chamadas S3 no seu código em vez de um servidor de produção que procura duplicar a funcionalidade S3. Por conseguinte, deve incluir a gema apenas no grupo de desenvolvimento e teste.
Configuração do AWS
O AWS SDK fornece um método auxiliar dedicado responsável pelo carregamento da configuração. Por padrão, ele carregará a configuração de config/aws.ymlextrair os seus parâmetros para o ambiente atual e passá-los para o cliente AWS. Em primeiro lugar, chamar o seguinte método num inicializador:
access_key_id, secret_access_key - Credenciais de cliente AWS necessárias para obter acesso à sua conta Amazon. São ignoradas pelo falso servidor S3, portanto, valores personalizados em ambientes sandbox.
s3_endpoint, s3_port- Especificação do endpoint S3. Usamos estes parâmetros para substituir o endpoint S3 real pelo endpoint falso lançado pela gem FakeS3 - todos os pedidos ao serviço da Amazon serão agora delegados ao servidor falso local.
s3_force_path_style - O S3 aceita dois estilos de inclusão do nome do bucket no URL. Pode optar por colocar o nome do bucket no estilo de domínio (bucket.s3.amazonaws.com) ou no estilo de caminho (s3.amazonaws.com/bucket). Para manter as coisas simples e evitar configurações extras associadas ao mapeamento do subdomínio do bucket para o endereço de loopback, prefiro o estilo de caminho ao estilo de domínio no ambiente de desenvolvimento.
use_ssl - força o AWS SDK a usar HTTPS em vez de HTTP comum. Precisamos de desativar esta opção, porque a gema FakeS3 não suporta pedidos HTTPS que o cliente AWS executa por defeito.
A configuração para o ambiente de produção é bastante simples:
No entanto, desta vez, estamos a lidar com o serviço S3 real, pelo que é necessário fornecer credenciais AWS autênticas.
Devido a potenciais riscos de segurança, é uma boa prática manter valores secretos como chaves de acesso fora do seu sistema de controlo de versões, por exemplo, utilizando variáveis de ambiente. Vamos usar o ERB para injetar os seus valores no ficheiro de configuração.
Configuração de clipe de papel
Agora é hora de encarar o Paperclip e forçá-lo a trabalhar bem com o cliente S3 já configurado. O principal objetivo da configuração do Paperclip é obter o caminho de armazenamento que irá localizar os recursos alojados pelo fakeserver:
localhost:10001/:nome_do_balde/:caminho
Mais uma vez, vamos começar com o ambiente de desenvolvimento:
armazenamento - especifica o suporte de armazenamento (por defeito, sistema de ficheiros local). Uma vez que estamos a utilizar o AWS S3, temos de o alterar para :s3.
balde - nome do bucket S3 que irá armazenar os seus ficheiros. Se o bucket não existir, o Paperclip tentará criá-lo.
url - definido como :s3_alias_url fará com que o Paperclip faça o alias do nome do host do bucket S3 com o valor especificado por :s3_host_alias parâmetro.
s3_host_alias - alias para o host padrão do bucket S3. Observe que a colocação do nome do host, da porta e do bucket corresponde à configuração do cliente AWS.
caminho - padrão para as chaves sob as quais os ficheiros serão armazenados no bucket. As chaves devem ser únicas dentro do bucket, tal como os nomes dos ficheiros. Devido ao facto de o S3 não suportar diretórios, pode utilizar um / para simular estruturas de diretórios.
Da mesma forma que as credenciais da AWS, o nome do bucket também é considerado um valor secreto que deve ser armazenado fora da sua base de código. Eu recomendo armazenar seu nome em uma variável de ambiente.
Por fim, junte a configuração às opções padrão do Paperclip em um inicializador:
As configurações do AWS e do Paperclip contêm uma referência ao fakeserver S3 local que se espera que seja executado em localhost:10001. Antes de trabalhar no desenvolvimento, deve lançar o servidor com o seguinte comando (fornecido pela gem FakeS3):
fakes3 -r public/system -p 10001
Os parâmetros passados são:
raiz -r - diretório raiz sob o qual os arquivos enviados serão armazenados. Considere excluí-lo do VCS se não quiser que os ficheiros carregados sejam armazenados no seu repositório.
porta -p - número da porta em que o servidor local será executado.
Se estiver a utilizar o Foreman para a gestão de processos na sua aplicação, poderá ser conveniente adicionar a seguinte entrada ao Procfile:
Isto poupar-lhe-á o tempo perdido no lançamento do fakeserver sempre que precisar de desenvolver algumas funcionalidades relacionadas com o S3.
Conclusão
Configurámos o cliente AWS para delegar todos os pedidos ao fakeserver local, configurámos o Paperclip para utilizar o endpoint S3 falso nos URLs dos recursos criados e lançámos o fakeserver fornecido pela gema Fake S3, armazenando todos os ficheiros no sistema de ficheiros local.
Como resultado, tornámo-nos independentes da ligação à Internet e poupámos dinheiro, tornando o nosso desenvolvimento mais rápido e mais fiável.