Comece a trabalhar com Java no Amazon S3

É 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.

Tags: , , , ,

7 Comentários

  1. Roberto Oknawa 14/08/2012 at 12:12 #

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

  2. Leonardo Wolter 15/08/2012 at 09:53 #

    Disponha, Roberto!

  3. Diogo Silvério 16/08/2012 at 14:25 #

    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/10/2012 at 18:58 #

    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/10/2012 at 20:45 #

    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 🙂

  6. Luciano 03/06/2017 at 12:34 #

    Olá, bom post, eu gostaria de saber se dá para usar o S3 para acessar o servodor java no ec2 para fazer pagamentos em uma página estática através de apis e se no curso explica algo parecido?

  7. Jonas 05/02/2018 at 16:17 #

    Olá Leonardo, como eu faço se a pasta estiver dentro de uma estrutura war, gerado pelo deploy da aplicacao java.

    Tentei o codigo desse exemplo, ele funciona para um um recurso, comum, na raiz do backup, mas dentro da estrutura war, nao funciona, nao sei como faço para dar o endereço do recurso.

    O endereço relativo do recurso dentro da pasta war seria esse “./resources/img/fotoCliente.jpg., tentei usa-lo mas não deu certo.

Deixe uma resposta