Armazenando arquivos no AWS/S3

Um dos serviços legais que o AWS possui é o S3 (Simple Storage Service), o serviço de armazenamento. 

O S3 é focado e ideal quando precisamos gravar um arquivo apenas 1 vez, e ler várias vezes. Ele não garante que se você atualizar um objeto com a mesma chave, que ao ler, a última versão será recuperada.

O benefício é que pagamos por Gb hospedado nos servidores da Amazon. 

Ainda podemos escolher o tipo de redundância que queremos ter. Se o dado que você armazena por lá é uma cópia de uma informação que você possui em outros servidores, e pode facilmente “recriar”, é possível armazenar os documentos usando Reduced Redundancy Storage (RRS), e os preços neste caso são diferentes.

Estou testando algumas bibliotecas Java para acessar o S3. Uma que vou testar JetS3t.

O legal é que todo serviço da Amazon possui uma API, então tudo o que podemos fazer manualmente, podemos fazer programando. E para alguns serviços certar funcionalidades só vão aparecer se estivermos programando. Então mão na massa. 

Para começar, no melhor estilo observar, copiar e criar, comecei testando uma API biblioteca de apoio que me chamou a atenção por poder rodar tanto em JavaSE como JavaME. Esta lib é bem legal, mas possui algumas limitações, como não poder escolher a região do S3 onde se quer armazenar a informação (ele sempre vai no Standard) e não estar pronto para tornar o objeto público. Nada que um pequeno hacking no fonte não resolva. Ainda assim o exemplo é importante para aprender o básico das requisições. 

O que se precisa para poder programar este exemplo? Bom, (a) de uma conta no AWS, e (b) access keys para poder chamar as requisições. 

Neste meu exemplo faço um upload e um download de uma imagem, fazendo a operação completa… criar bucket, enviar arquivo, baixar arquivo, remover arquivo, remover bucket. 

Bucket… é o nome que o AWS dá para a nossa área. Um bucket possui um nome único e único em todo o S3. Verifiquei isto quando fui criar um bucket “teste” e ele já existia. 🙂

Aqui se tem uma ideia meu exemplo, que usei para testar a história toda. 

 

String accessKeyId = “access-key-da-aws-da-sua-conta”;
String secretKey = “secret-key-da-aws-da-sua-conta”;
S3 s3 = new S3(S3.HTTPS_URL, accessKeyId, secretKey);
String bucketName = “danielwildt” + System.currentTimeMillis();
s3.createBucket(bucketName);
String fileName = “/users/dwildt/pasta/arquivo-para-teste.jpg”;
String fileNameDecode = “/users/dwildt/pasta/arquivo-para-teste-back.jpg”;
String key = “pasta/nome-arquivo-no-aws.jpg”;
String data = readFileAsString(fileName);
s3.putObjectInline(bucketName, key, data);
S3Object s3Image = s3.getObject(bucketName, key);
saveImageFromString(s3Image.getData(), fileNameDecode);
s3.deleteObject(bucketName, key);
s3.deleteBucket(bucketName);

 

Então esta lib que testei é capaz de fazer estas operações. Ela também consegue listar objetos. O S3 tem uma regra que ele apenas lista 1000 objetos por vez, e funciona em um processo de paginação. Esta biblioteca não tem este poder. No meu caso eu não tenho este “problema”, pois eu preciso apenas enviar e recuperar objetos. E eu sempre sei o nome do objeto que quero buscar. 

Bom, próximos passos? Faça download da biblioteca de exemplo. Ainda não parei para subir este meu fonte de teste, mas em breve coloco ele no github. Uma dica é que para fazer a chamada do “putObjectInline” é necessário fazer um encode dos dados do arquivo. Teste enviar sem fazer isto para ver o erro. Isto é importante para qualquer situação futura. No exemplo abaixo tem um pedaço de código que faz isto. 

 

private String readFileAsString(String filePath) {
  //… tratamento de exceções e etc… 
  byte[] buffer = new byte[(int) new File(filePath).length()];
  FileInputStream f = new FileInputStream(filePath);
  f.read(buffer);
  String encodedImage = Base64.encodeBytes(buffer);
  //… tratamento de exceções e etc… 
  return encodedImage;
}

 

Quem escreveu este post? Daniel Wildt é CTO da Trevisan Tecnologia e curte ajudar o time a melhorar continuamente. Site no danielwildt.com e twitter @dwildt.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s