Comece a trabalhar com Java no Amazon S3

Postado em 14. ago, 2012 por Leonardo Wolter em Arquitetura, Inovação

É relativamente simples colocar sua aplicação no cloud da Amazon. Um dos serviços oferecidos e bastante utilizados é o  Amazon Simple Storage Service (S3), para armazenamento de dados em cloud.

A vantagem do serviço S3 é justamente não precisarmos ter tanta preocupação com a gestão do hardware e infraestrutura, podendo também diminuir custos. O S3 oferece um espaço virtualmente ilimitado (seus arquivos podem ter de 1byte a 5terabytes cada), sendo estes arquivos gravados redundantemente em diversos dispositivos e reparados caso sejam corrompidos. Um bucket pode ser armazenado em diferentes regiões (como em São Paulo, por exemplo), possibilitando uma menor latência. É frequentemente utilizado para armazenar imagens de sites onde há muito conteúdo gerado pelos usuários.

O S3 pode ser manipulado pelo console manualmente. Mas o interessante é codificar para realizar as operações de storage. Para isso, há APIs nas mais diversas linguagens AWS SDK(disponível em Java, Mobile(iOS eAndroid) , PHPPythonRuby e Windows & .NET.).

Além da API, a Amazon disponibiliza um plugin para Eclipse(com o AWS SDK incluso),  que será necessário para acompanhar este post.

Considerando que você já tenha uma conta na Amazon com o S3. Dentro dele, temos uma divisão (bucket) chamada caelum-imagens:

Tendo em mãos o plugin da amazon, vamos iniciar um novo projeto no Eclipse. Ao criar o novo projeto, selecione AWS Java Project:

Digite o nome do seu Projeto, clique em Configure AWS accounts e digite a sua Access Key ID e a sua Secret Access Key (que podem ser encontradas no menu Security Credentials, na sua conta da Amazon):

No final desse processo, será criado automaticamente um arquivo de nome AwsCredentials.properties, contendo os dados da nossa conta que digitamos anteriormente.

Para se conectar ao sistema, a API é simples: primeiro vamos ler o conteúdo do AwsCredentials.properties, jogando essa informação dentro de uma classe específica do AWS, chamada PropertiesCredentials. Com essas informações, instanciamos uma classe que é capaz de se comunicar com o S3, a AmazonS3Client. Observe o código que realiza essas operações:

Crie uma classe ConectorDoS3 para teste, e coloque o seguinte código dentro do seu main:

InputStream credentials = ConectorDoS3.class.getResourceAsStream("AwsCredentials.properties");
PropertiesCredentials awsCredentials = new PropertiesCredentials(credentials);
AmazonS3 s3 = new AmazonS3Client(awsCredentials);

Pronto! Com a referência s3 em mãos podemos efetuar diversas operações através da API como, por exemplo, enviar uma imagem para o nosso bucket caelum-imagens através do metodo putObject():

s3.putObject(new PutObjectRequest("caelum-imagens", "logo.jpg", new File("diretorio-local/imagem.jpg")));

De forma análoga podemos ler os dados gravados. Podemos usar o GetObjetRequest através do método getObject:

S3Object object = s3.getObject(new GetObjectRequest("caelum-imagens", "logo.jpg"));
InputStream stream = object.getObjectContent();

Repare que o GetObjectRequest, assim como o Put, pode ser configurado de diferentes formas para buscar apenas um pedaço do arquivo, etc. Em vez de buscar o arquivo com essa imagem, você pode também gerar uma URL, para que essa possa ser utilizada, por exemplo, numa tag img de um HTML. Isso é feito através do método generatePresignedUrl.

Esses são apenas os primeiros passos com o S3. Há muitos outros detalhes e melhores práticas que você deve ficar atento para obter o melhor do serviço, considerando falhas e diminuindo latência e número de requests. Conheça mais da Amazon AWS no nosso curso online, em especial o EC2.

Leonardo Wolter

Tags: , , , ,

5 Respostas para “Comece a trabalhar com Java no Amazon S3”

  1. Roberto Oknawa

    14. ago, 2012

    Era bem isso que eu precisava, kkkk. Obrigado caelum!

  2. Leonardo Wolter

    15. ago, 2012

    Disponha, Roberto!

  3. Diogo Silvério

    16. ago, 2012

    Muito bom. Já faço uso pessoal há algum tempo e venho usando agora para por em produção alguns projetos.

    Há uma gama de perfis de máquinas para escolha. Certamente atende a qualquer necessidade pessoal(e provavelmente corporativas também)

  4. Camilo

    22. out, 2012

    Leonardo, poderia me tirar uma dúvida?

    Na página do S3 diz que o preço para 1.000 solicitações GET tem um custo de $0,01.

    Eu vou hospedar milhares de pequenas imagens de avatares (perfil de usuários), exemplo:

    http://s3-sa-east-1.amazonaws.com/meubucket/imgs/001.jpg

    Sempre que exibir essa imagem no site, é contado uma solicitação GET? Ou será contado somente transferência de dados?

    E então o que seria esse GET?

    E solicitações PUT? Cada vez que eu fizer um upload de uma imagem, pagarei?

    Obrigado
    Camilo

  5. Leonardo Wolter

    22. out, 2012

    Olá, Camilo! De acordo com a pagina do Amazon S3 na verdade é R$0.01 a cada 10.000 requests por GET ou 1.000 por POST, PUT, COPY e LIST. Parece ser isso mesmo, cada solicitação de imagem no site deve contar. No FAQ da Amazon está um pouquinho melhor explicado :)

Deixar uma Resposta