Upload pro S3: o mais simples possível em Ruby

Apresentação do editor: O AC é nosso conhecido de longa data, já tendo participado de alguns projetos conosco e fazendo parte da nossa rede mais próxima de profissionais. Ele tem uma bagagem enorme com desenvolvimento Ruby e Java e publica bastante coisa interessante também no seu blog http://www.beyondclick.com.br. Bom, vamos ao post! 🙂

Introdução

Seguindo a série de artigos que visam mostrar a forma mais simples de subir um arquivo para a Amazon S3 em diferentes linguagens e tecnologias. Neste artigo vou mostrar como fazer usando Ruby. Ruby, não Rails. Esse é o próximo artigo. 😉

Para a versão TL;DR, fork no github.

A forma mais simples, presupõe que teremos a menor quantidade de dependências no projeto. Por conta disso achei justo fazer uma aplicação Rack

Neste caso teremos duas dependências, que não estão no Ruby:

Como eu tenho carinho com meus projetos, eu declarei as dependências em um Gemfile e, uso o Bundler para colocar as gems no “classpath” da aplicação Rack.

A AWS-SDK em ruby é uma gem, criada pela Amazon, para acessar os seus serviços de forma simplificada.

A documentação do aws-sdk descreve todos os módulos disponíveis.

Neste artigo irei utilizar o modulo AWS::S3, que é o client para o serviço Amazon S3.

Recebendo um arquivo usando Ruby.

A página com o formulário, não tem nada de mais. Ela é simples, o suficiente, para ser apenas um arquivo html.

O campo file, deste formulário, quando enviado, irá gerar o seguinte parâmetro:

Basicamente, o Rack se encarrega de criar um arquivo temporário e te dá uma forma trivial de recuperar o arquivo. Basta acessar o valor, pela Hash:

Enviando para o Amazon S3

Para mandar o arquivo enviado para a Amazon S3, usamos o arquivo temporário, criado pelo Rack ao receber a requisição POST com o form multi-part. Mas, antes temos que fazer o login e recuperar um bucket:

Pronto! Arquivo na Amazon! \o/

Sobre a organização do código

Para facilitar a compreensão do código, separei em arquivos com responsabilidades distintas:

  • Gemfile: contem as dependências do projeto
  • config.ru: configura o rack e chama o objeto que irá tratar as requisições
  • app/simplest_ruby_s3.rb: gerencia o roteamento de requisições:
    • GET /: apresenta a página com o formulário para subir o arquivo.
    • POST /upload: chama o objeto que irá interagir com a AWS::S3.
    • Qualquer outra requisição: retorna um 404.
  • app/uploader_s3.rb: interage com o client AWS::S3 para subir o arquivo.

Sugestões? Opiniões? Deixem nos comentários.

  • Maria Clara Bezerra

    Oi Antonio,
    Tenho uma dúvida simples pra ver contigo. Consegui organizar aqui os arquivos usando o Aptana, mas na hora de fazer o rackup no terminal eu fico com uma dúvida:
    ACCESS_KEY_ID=YOUR_ACCESS_KEY SECRET_ACCESS_KEY=YOUR_SECRET BUCKET_NAME=YOUR_BUCKET rackup
    Onde exatamente eu tenho que substituir as informações nestes campos? Tentei de algumas formas diferentes, mas não rolou pra mim. Vc poderia me ajudar nisso? Obrigada! =)

21