Aprenda os fundamentos do Amazon SimpleDB (SDB) e explore algumas das
funções fornecidas pelo boto, uma biblioteca Python de software livre,
para interação com o
SDB.
Nesta série, “Computação em nuvem com o Amazon Web Services”,
aprenda sobre computação em nuvem usando Amazon Web Services. Explore
como os serviços fornecem uma alternativa atraente para arquitetar e
construir aplicativos escaláveis e confiáveis.
Amazon Simple Storage Service
A Parte 1
desta série apresenta os blocos modulares do Amazon Web Services e
explica como esta infraestrutura virtual pode ser usada para criar
sistemas em escala da Web.
Neste artigo, saiba mais sobre o
Amazon Simple Storage Service (S3). S3 é um sistema de armazenamento de
dados na
Internet altamente escalável e rápido que simplifica o armazenamento e
recuperação de qualquer volume de dados, a qualquer momento e de qualquer
parte do mundo.
Você paga pelo armazenamento e pela largura de banda com base no uso
real do serviço. Não há custo de instalação, custo mínimo ou custo
recorrente adicional.
A Amazon fornece a administração e a
manutenção da infraestrutura de armazenamento, deixando-o livre para se
concentrar nas funções principais de seus sistemas e aplicativos. S3 é
uma plataforma abrangente que está prontamente disponível para suas
necessidades de armazenamento de dados. Ela é excelente para:
- Armazenar os dados de seus aplicativos.
- Backups pessoais ou corporativos.
- Distribuição rápida e barata, para seus clientes, de mídias e outros conteúdos que consomem muita largura de banda.
Os recursos da S3 incluem:
- Confiabilidade: A plataforma foi projetada para tolerar falhas e corrigir o sistema
muito rapidamente, com tempo de indisponibilidade mínimo ou inexistente.
A Amazon fornece um
acordo de nível de serviço (SLA) para manter disponibilidade de
99,99%. - Simplicidade: A S3 foi construída a partir de conceitos simples e fornece grande
flexibilidade para o desenvolvimento de seus aplicativos. É possível
criar esquemas de armazenamento mais complexos colocando funções
adicionais em camadas sobre os componentes da S3. - Escalabilidade: O design fornece um alto nível de escalabilidade e permite uma ampliação
fácil do serviço quando um pico de demanda atingir seus aplicativos em
escala da web. - Baixo custo: As taxas da S3 são muito competitivas em relação a outras soluções de armazenamento de dados pessoais e corporativos do mercado.
Os três conceitos básicos que sustentam a estrutura de trabalho da S3 são buckets,
objetos e chaves.
Buckets
Buckets são os blocos modulares fundamentais. Cada objeto
armazenado na
Amazon S3 está contido em um bucket. Pense em um bucket
como análogo a uma pasta, ou um diretório, no sistema de arquivos.
Uma das principais distinções entre uma pasta de arquivos e um
bucket é que cada bucket e seu conteúdo podem ser acessados usando uma
URL. Por exemplo, se você tiver um bucket chamado
“prabhakar,”
ele poderá ser acessado usando a URL http://prabhakar.s3.amazonaws.com.
Cada conta da S3 pode conter o máximo de 100 buckets. Buckets não podem
ser aninhados um dentro do outro, então não é possível criar um bucket
dentro de outro bucket.
É possível afetar a localização geográfica de seus buckets especificando
uma restrição de localização ao criá-los.
Isso automaticamente garantirá que quaisquer objetos armazenados dentro
daquele
bucket sejam armazenados naquela localização geográfica.
Neste momento,
eles podem ser localizados nos Estados Unidos ou na União Européia. Se
você não especificar uma localização ao criar o bucket, o bucket e seu
conteúdo serão armazenados na localização mais próxima do endereço de
cobrança de sua conta.
Nomes de bucket precisam atender aos seguintes requisitos da S3:
- O nome deve iniciar com um número ou uma letra.
- O nome deve ter entre 3 e 255 caracteres.
- Um nome válido pode conter somente letras minúsculas, números, pontos, sublinhados e travessões.
-
Apesar de ser possível usar números e pontos no nome, eles não podem
ter o formato de um endereço IP. Não é possível dar o nome 192.168.1.254
a um bucket. - O espaço de nome do bucket é compartilhado com
todos os buckets de todas as contas na S3. O nome deve ser exclusivo em
toda a S3.
Buckets que conterão objetos a serem
servidos com URLs acessíveis deverão estar em conformidade com os
seguintes requisitos adicionais da S3:
- O nome do bucket não pode conter sublinhados.
- O nome deve ter entre 3 e 63 caracteres.
- O nome não pode terminar com um travessão. Por exemplo, myfavorite-.bucket.com
é inválido. - Não pode haver travessões junto a pontos no nome. Portanto,
my-.bucket.com seria inválido.
É
possível usar uma convenção de nomenclatura de domínio para os buckets,
como media.yourdomain.com, e desta forma, mapear os domínios ou
subdomínios da Web existentes para a
S3.
O mapeamento de fato será feito quando entradas CNAME de DNS forem
adicionadas
para apontar para a S3. A grande vantagem deste esquema é a
possibilidade de usar seu próprio nome de domínio nas URLs para fazer o
download de arquivos.
O mapeamento do CNAME será responsável por
converter para o endereço da S3 do
bucket. Por exemplo, http://media.yourdomain.com.s3.amazonaws.com
torna-se http://media.yourdomain.com – muito mais prático.
Objetos
Objetos contêm os dados armazenados dentro de buckets na S3.
Pense em um objeto como o arquivo que você deseja armazenar. Cada
objeto armazenado é composto de duas entidades: dados e metadados.
Os
dados são a coisa real a ser armazenada, como um arquivo PDF, um
documento do Word, um arquivo de vídeo etc. Os dados armazenados também
têm metadados associados para descrever o objeto.
Alguns exemplos de
metadados são o tipo de conteúdo do objeto sendo armazenado, a data em
que o objeto foi modificado pela última vez e quaisquer outros metadados
específicos do usuário ou do aplicativo. Os metadados de um objeto são
especificados pelo desenvolvedor como pares chave-valor quando o objeto é
enviado à S3 para armazenamento.
Diferentemente da limitação no
número de buckets, não existem restrições no número de objetos. É
possível armazenar um número ilimitado de objetos nos buckets e cada
objeto pode conter até 5 GB de dados.
Os dados nos objetos S3
publicamente acessíveis podem ser recuperados por HTTP,
HTTPS ou BitTorrent. A distribuição de grandes arquivos
de mídia, a partir de uma conta da S3, torna-se muito simples ao usar
BitTorrent. A Amazon não só criará o torrent do objeto, como também o
distribuirá.
Chaves
Cada objeto armazenado dentro de um bucket da S3 é identificado usando uma chave exclusiva.
Isso é similar em conceito ao nome de um arquivo em uma pasta de um sistema de arquivos.
O nome do arquivo dentro de uma pasta em um disco rígido deve ser exclusivo.
Cada objeto dentro de um bucket tem exatamente uma chave. O nome do bucket
e da chave são usados em conjunto para fornecer a identificação exclusiva de cada objeto armazenado na S3.
O
endereço de cada objeto dentro da S3 é uma URL que combina a URL de
serviço da S3, o nome do
bucket e a chave exclusiva. Se um objeto com a chave
my_favorite_video.mov for armazenado dentro do bucket chamado prabhakar,
o endereço desse objeto será URL http://prabhakar.s3.amazonaws.com/
my_favorite_video.mov.
Apesar de os conceitos
serem simples como mostra a Figura 1, buckets, objetos e chaves,
juntos, fornecem muita flexibilidade para criar soluções de
armazenamento de dados.
É possível aproveitar esses blocos modulares
para simplificar o armazenamento de dados na S3 ou usar da
flexibilidade para criar camadas e construir armazenamento ou
aplicativos mais complexos sobre a S3 para fornecer funções adicionais.
Figura 1. Exibição conceitual da S3

Log de acesso
Cada bucket da S3 pode ter registros de log de acesso, que contêm
detalhes sobre cada solicitação de um objeto contido. Os registros de
log são desativados por padrão; é preciso ativar explicitamente a
gravação de registros para cada bucket da Amazon S3 a ser rastreado.
Um
registro de log de acesso contém muitos detalhes sobre a solicitação,
incluindo o tipo de solicitação, o recurso solicitado e a data e hora em
que a solicitação foi processada.
Os logs são fornecidos no
formato de log de acesso do servidor S3, mas podem ser facilmente convertidos para um
formato de log combinado do Apache.
Em seguida, eles podem ser facilmente analisados por qualquer
ferramenta de análise de log de software livre ou comercial, como Webalizer,
para obter um relatório legível por pessoas e gráficos bonitos sob
solicitação.
Os relatórios podem ser úteis para obter insight sobre a
base de clientes que está acessando os arquivos.
Consulte a seção Recursos ao final do artigo para ver as ferramentas que podem ser usadas para visualizar mais facilmente os registros de log da S3.
Segurança
Cada bucket e objeto criado na S3 é privado da conta de usuário que os
criou. É preciso conceder permissões explicitamente para outros usuários
e clientes para que eles possam ver a lista de objetos em buckets S3 ou
para baixar os dados contidos dentro deles.
A Amazon S3 fornece os
seguintes recursos de segurança para proteger os buckets e os objetos
dentro deles:
- Autenticação: Garante que a solicitação está sendo feita pelo usuário que é proprietário do
bucket ou objeto. Cada solicitação S3 deve incluir a chave de acesso do Amazon Web Services,
que identifica o usuário de forma exclusiva. - Autorização: Garante que o usuário que está tentando acessar o recurso tem as
permissões ou direitos ao recurso. Cada objeto S3 tem uma lista de
controle de acesso (ACL) associada, que identifica explicitamente as
concessões e permissões para aquele recurso. É possível conceder acesso a
todos os usuários do
Amazon Web Services ou a um usuário específico, identificado pelo
endereço de
e-mail, ou conceder acesso anônimo a qualquer
usuário. - Integridade: Cada solicitação S3 deve estar digitalmente assinada pelo usuário solicitante com uma chave secreta do
Amazon Web Services. Ao receber a solicitação, a S3
verificará a assinatura para garantir que a solicitação não foi adulterada em trânsito. - Criptografia: Você pode acessar a S3 por meio do protocolo HTTPS para garantir que os
dados sejam transmitidos por meio de uma conexão criptografada. - Registro contra repúdio: Cada solicitação S3 tem uma marcação de data e hora e serve como prova da transação.
Toda solicitação REST feita à S3 deve passar pelas seguintes etapas padrão – essenciais para garantir a segurança:
- A solicitação e todos os parâmetros necessários devem ser montados em uma cadeia de caracteres.
-
A chave de acesso secreta do Amazon Web Services deverá ser usada para
criar um hash de autenticação Hash Message Authentication Code (HMAC)
com chave da cadeia de caracteres da solicitação. - Essa assinatura calculada também é adicionada como um parâmetro na solicitação.
- Em seguida, a solicitação é encaminhada para a Amazon S3.
- A Amazon S3 verificará se a assinatura fornecida é um hash HMAC com chave válido da solicitação.
- Se a assinatura for válida, então, e só então, a Amazon S3 processará a solicitação.
Precificação
As cobranças da S3 são calculadas com base em três critérios, que são
diferentes dependendo da localização geográfica dos buckets:
-
O volume total de espaço de armazenamento usado, que inclui o tamanho
real do conteúdo dos dados e dos metadados associados – A unidade usada
pela
S3 para determinar o armazenamento consumido é
GB/mês. O número de
bytes de armazenamento usado por uma conta é
calculado a cada hora e, no final do mês, é convertido no armazenamento
usado durante o mês. A tabela abaixo mostra a precificação para
armazenamento.
| Local | Custo |
|---|---|
| Estados Unidos | US$ 0,15 por GB/mês de armazenamento usado |
| Europa | US$ 0,18 por GB/mês de armazenamento usado |
- O volume de dados ou largura de banda transferido de e para a S3 – Isso
inclui todos os dados transferidos por upload e download da S3. Não há
custo para dados transferidos entre EC2 e buckets da S3 localizados nos
Estados Unidos. Os dados transferidos entre EC2 e
buckets da S3 europeia têm como custo a taxa padrão de transferência de
dados, como mostra a tabela abaixo.
| Local | Custo |
|---|---|
| Estados Unidos | US$ 0,100 por GB — todos os dados recebidos US$ 0,170 por GB — primeiros 10 TB/mês de dados |
| Europa | US$ 0,100 por GB — todos os dados recebidos US$ 0,170 por GB — primeiros 10 TB/mês de dados |
- O número de solicitações de API realizadas – A S3 cobra tarifas por cada
solicitação usando a interface – para criar objetos, listar
buckets, listar objetos etc. Não há tarifa para excluir objetos e
buckets. As tarifas são, novamente, ligeiramente diferentes dependendo
da localização geográfica do bucket. A tabela a seguir mostra a
precificação de solicitações de API.
| Local | Custo |
|---|---|
| Estados Unidos | US$ 0,01 por 1.000 solicitações PUT, POST ou LIST US$ 0,01 por 10.000 solicitações GET e todas as outras solicitações Nenhum custo para exclusão de solicitações |
| Europa | US$ 0,012 por 1.000 solicitações PUT, POST ou LIST US$ 0,012 por 10.000 solicitações GET e todas as outras solicitações Nenhum custo para exclusão de solicitações |
Consulte Amazon S3 para obter a precificação mais recente.
Também é possível usar a Calculadora mensal simples AWS para calcular os custos de uso mensal para a S3 e os outros Amazon Web Services.
Introdução ao Amazon Web Services e S3
Para começar a explorar a S3, é preciso registrar uma conta no Amazon Web Services. Você receberá um número de conta do Amazon
Web Services e as chaves de acesso de segurança, juntamente com o certificado de segurança
x.509 que será necessário ao começar a usar as diversas bibliotecas e ferramentas para se comunicar com a S3.
Todas
as comunicações com qualquer um dos Amazon Web Services são feitas pela
interface
SOAP ou pela interface de consulta/REST. As mensagens de
solicitação, que são enviadas por uma dessas
interfaces, devem ser assinadas digitalmente pelo usuário remetente para
garantir que não foram adulteradas em trânsito e que realmente se
originam do usuário remetente.
Essa é a parte mais básica do uso das
APIs do Amazon Web Services. Cada solicitação
deve ser digitalmente assinada e ter a assinatura anexada à solicitação. Cada conta de usuário do Amazon Web Services está associada com as seguintes credenciais de segurança:
- Um ID de chave de acesso que identifica o usuário como a pessoa que faz as solicitações por meio da interface de consulta/REST.
-
Uma chave de acesso secreta é usada para calcular a assinatura digital
quando o usuário faz solicitações por meio da interface de consulta. - Os certificados x.509 público e privado para assinar solicitações e para autenticação ao usar a interface
SOAP.
É possível gerenciar chaves e certificados, gerá-los
novamente, visualizar relatórios de atividade de conta e uso e modificar
as informações do perfil a partir das
informações da Conta do Web Services.
Depois de criar com sucesso a conta do Amazon Web Services, é preciso
ativar o serviço Amazon S3 para a conta realizando as seguintes etapas:
- Faça o logon
em sua conta do Amazon Web Services. - Vá para a página inicial do S3.
- Clique em Sign Up For This Web Service no lado direito da página.
- Forneça as informações solicitadas e conclua o processo de registro.
Exemplos neste artigo usam a interface de consulta/REST para se comunicar com o
S3. É preciso obter as chaves de acesso. Elas podem ser acessadas em sua
página de informações da conta do Web Services
selecionando View Access Key Identifiers. Agora você está pronto para usar o
Amazon Web Services e o serviço S3 está ativado em sua conta.
Interagindo com a S3
Para saber mais sobre a interação com a S3, é possível usar
bibliotecas existentes disponíveis na
Amazon ou de terceiros e desenvolvedores independentes.
Este artigo não se aprofunda em detalhes da comunicação com a
S3, incluindo como assinar solicitações, como criar os documentos XML
usados para encapsular os dados ou os parâmetros enviados para e
recebidos da S3.
Deixamos que as bibliotecas tratem isso para nós e
usamos a interface de mais alto nível que elas oferecem. Revise o
guia do desenvolvedor da S3 para ver mais detalhes.
Você
usará uma biblioteca Java, de software livre chamada JetS3t, para
explorar a S3 e aprenderá sobre sua API visualizando pequenos fragmentos
de código.
No final do artigo, você coletará e organizará esses
fragmentos em algo útil: um Shell da S3 simples e conveniente que pode
ser usado a qualquer momento para testar e interagir com a S3.
JetS3t
JetS3t
é um kit de ferramentas Java de software livre para a interação com a
S3. Ele é mais do que só uma biblioteca. A distribuição inclui várias
ferramentas muito úteis relacionadas à S3, que podem ser usadas por
usuários típicos da S3, bem como por provedores de serviço que criam
aplicativos na S3.
O JetS3t inclui:
- Cockpit: Uma GUI para gerenciar o conteúdo de uma conta da Amazon S3.
- Synchronize: Um aplicativo de linha de comando para sincronizar diretórios em um computador com uma conta da Amazon S3.
- Gatekeeper: Um servlet que pode ser usado para mediar o acesso a contas da Amazon S3.
- CockpitLite: Uma versão mais leve do Cockpit que encaminha todas as operações por meio de um serviço mediador de gatekeeper.
- Uploader: Uma GUI que encaminha todas as operações por meio de um serviço mediador
de gatekeeper e que pode ser usada por provedores de serviços para
fornecer acesso a contas da S3 para clientes.
É possível, obviamente, usar um desses aplicativos de GUI
para interagir com a S3, mas não será muito útil se for necessário desenvolver aplicativos para fazer
interface com a S3.
Você pode fazer o download
do código fonte completo deste artigo como um archive compactado,
incluindo um projeto Netbeans pronto, que pode ser importado para a área
de trabalho. Faça o download da versão mais recente do JetS3t.
Conectando-se à S3
O JetS3t fornece uma classe abstrata chamada
org.jets3t.service.S3Service que precisa ser estendida por classes que implementam uma interface específica, como REST ou
SOAP. O JetS3t fornece duas implementações que podem ser usadas para conectar e interagir com a S3:
- org.jets3t.service.impl.rest.httpclient.RestS3Service
comunica-se com a S3 por meio da interface REST. - org.jets3t.service.impl.soap.axis.SoapS3Service
comunica-se com a S3 por meio da interface SOAP usando Apache Axis
1.4.
O JetS3t usa um arquivo chamado
jets3t.properties para configurar vários parâmetros usados durante a
comunicação com a S3. O exemplo neste artigo usa o
jets3t.properties padrão que acompanha a distribuição.
O guia de configuração do JetS3t tem uma explicação detalhada dos parâmetros.
Neste artigo, você usará o RestS3Service para se conectar com a S3. Um novo objeto
RestS3Service pode ser criado fornecendo suas chaves de acesso do Amazon Web Services
na forma de um objeto AWSCredentials.
Lembre-se que os
fragmentos de código neste artigo destinam-se a demonstrar a API. Para
executar cada fragmento, é preciso garantir que todas as importações de
classe necessárias estejam presentes.
Consulte o código fonte no pacote
de download para ver as importações corretas. Ou, ainda mais simples, é possível importar os projetos
Netbeans fornecidos para sua área de trabalho para ter acesso fácil a todo o código fonte.
Listagem 1. Criar um novo RestS3Service
String awsAccessKey = �Your AWS access key�;
String awsSecretKey = “Your AWS Secret key�;
// use suas chaves AWS para criar um objeto de credenciais
AWSCredentials awsCredentials = new AWSCredentials(awsAccessKey, awsSecretKey);
// crie o objeto de serviço com nossas credenciais AWS
S3Service s3Service = new RestS3Service(awsCredentials);
Gerenciando buckets
O conceito de um bucket é encapsulado por org.jets3t.service.model.S3Bucket, que estende a classe org.jets3t.service.model.BaseS3Object. Essa é a classe de nível superior para buckets e objetos no modelo JetS3t.
Cada objeto S3Bucket fornece um toString(), além de vários métodos de
acesso que podem ser usados para imprimir as informações importantes de
um bucket
(nome e localização geográfica, data em que foi criado,
nome do proprietário e quaisquer metadados associados com o bucket).
Listagem 2. Listar buckets
// liste todos os buckets na conta AWS e exiba informações para cada um.
S3Bucket[] buckets = s3Service.listAllBuckets();
for (S3Bucket b : buckets) {
System.out.println(b);
}
É possível criar um novo bucket fornecendo um nome exclusivo para ele. O
espaço de nome para
buckets é compartilhado por todas as contas de usuário, portanto, às
vezes, encontrar um nome exclusivo pode ser desafiador. Também é
possível especificar onde o bucket e os objetos que ele conterá devem
ser localizados fisicamente.
Listagem 3. Criar buckets
// crie um bucket nos EUA e exiba suas informações
S3Bucket bucket = s3Service.createBucket(bucketName);
System.out.println("Created bucket - " + bucketName + " - " + bucket);
// crie um bucket na UE e exiba suas informações
S3Bucket bucket = s3Service.createBucket(bucketName, S3Bucket.LOCATION_EUROPE);
System.out.println("Created bucket - " + bucketName + " - " + bucket);
É preciso excluir todos os objetos contidos no bucket antes de excluí-lo, ou uma exceção será lançada.
A classe RestS3Service que você estiver usando serve para
ligar com objetos únicos. Quando você começar a lidar com vários
objetos, fará mais sentido usar uma abordagem multiencadeada para
acelerar os processos.
O JetS3t fornece a classe org.jets3t.service.multithread.S3ServiceSimpleMulti justamente para esta finalidade. Será possível envolver o objeto s3Service existente usando essa classe e
tirar vantagem completa dos multiprocessadores. Isto é útil quando é
preciso limpar um bucket excluindo todos os objetos que ele contém.
Listagem 4. Excluir um bucket
// obtenha o bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket�);
// exclua um bucket – ele deve estar vazio
s3Service.deleteBucket(bucket);
// crie uma versão multiencadeada de RestService
S3ServiceSimpleMulti s3ServiceMulti = new S3ServiceSimpleMulti(s3Service);
// obtenha todos os objetos no bucket
S3Object[] objects = s3Service.listObjects(bucket);
// exclua todos os objetos do bucket para limpá-lo
s3ServiceMulti.deleteObjects(bucket, objects);
Cada bucket é associado a uma ACL que determina as permissões ou
concessões para o bucket e o nível de acesso fornecido a outros
usuários. É possível recuperar a ACL e imprimir as concessões que ela
fornece.
Listagem 5. Recuperar a ACL para o bucket
// obtenha o bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket�);
// obtenha a ACL e exiba
AccessControlList acl = s3Service.getBucketAcl(bucket);
System.out.println(acl);
As permissões padrão em buckets e objetos recém-criados os tornam
privados do proprietário. Para mudar isso, altere a ACL de um bucket e
conceda a um grupo de usuários permissões para ler, gravar ou ter
controle total sobre o bucket.
Listagem 6. Tornar um bucket e seu conteúdo públicos
// obtenha o bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket�);
// obtenha a ACL
AccessControlList acl = s3Service.getBucketAcl(bucket);
// dê acesso de leitura a todos
acl.grantPermission(GroupGrantee.ALL_USERS, Permission.PERMISSION_READ);
// salve as alterações na S3
bucket.setAcl(acl);
s3Service.putBucketAcl(bucket);
É possível ativar facilmente o registro de log para um bucket e
recuperar o status atual de registro de log. Depois que o registro de
acesso é ativado, logs de acesso detalhados para cada arquivo naquele
bucket são armazenados na S3. A conta da S3 será tarifada de acordo com o
espaço de armazenamento consumido pelos
logs.
Listagem 7. Registro de log para buckets da S3
// obtenha o bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket�);
// o registro em log está ativado?
S3BucketLoggingStatus loggingStatus = s3Service.getBucketLoggingStatus(bucketName);
System.out.println(loggingStatus);
// ative o registro em log
S3BucketLoggingStatus newLoggingStatus = new S3BucketLoggingStatus();
// defina um prefixo para os arquivos de log
newLoggingStatus.setLogfilePrefix(logFilePrefix);
// defina o nome do bucket de destino
newLoggingStatus.setTargetBucketName(bucketName);
// dê ao grupo log_delivery permissão para ler e escrever no bucket
AccessControlList acl = s3Service.getBucketAcl(bucket);
acl.grantPermission(GroupGrantee.LOG_DELIVERY, Permission.PERMISSION_WRITE);
acl.grantPermission(GroupGrantee.LOG_DELIVERY, Permission.PERMISSION_READ_ACP);
bucket.setAcl(acl);
// salve o ACL alterado do bucket na S3
s3Service.putBucketAcl(bucket);
// salve as alterações no registro de log do bucket
s3Service.setBucketLoggingStatus(bucketName, newLoggingStatus, true);
System.out.println("The bucket logging status is now enabled.");
Gerenciando os seus objetos
Cada objeto contido em um bucket é representado por
org.jets3t.service.model.S3Object. Cada objeto S3Bucket fornece um
toString() que pode ser usado para imprimir os detalhes importantes de um objeto:
- Nome da chave
- Nome do bucket recipiente
- Data em que o objeto foi modificado pela última vez
- Quaisquer metadados associados com o objeto
Ele também fornece métodos para acessar as diversas propriedades de um objeto, juntamente com seus metadados.
Listagem 8. Listar objetos
// liste os objetos em um bucket.
S3Object[] objects = s3Service.listObjects(bucket);
// exiba os detalhes do objeto
if (objects.length == 0) {
System.out.println("No objects found");
} else {
for (S3Object o : objects) {
System.out.println(o);
}
}
É possível filtrar a lista de objetos recuperados fornecendo um prefixo correspondente.
Listagem 9. Filtrar a lista de objetos
// liste objetos que correspondem a um prefixo.
S3Object[] filteredObjects = s3Service.listObjects(bucket, “myprefix�, null);
// exiba os detalhes do objeto
if (filteredObjects.length == 0) {
System.out.println("No objects found");
} else {
for (S3Object o : filteredObjects) {
System.out.println(o);
}
}
Cada objeto pode ter metadados associados, como o tipo de conteúdo, data
de modificação etc. Também é possível associar metadados personalizados
específicos do aplicativo com um objeto.
Listagem 10. Recuperar metadados do objeto
// obtenha o bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);
// obtenha objetos que correspondem a um prefixo
S3Object[] filteredObjects = s3Service.listObjects(bucket, “myprefix�, null);
if (filteredObjects.length == 0) {
System.out.println("No matching objects found");
}else {
// obtenha os metadados para múltiplos objetos.
S3Object[] objectsWithHeadDetails = s3ServiceMulti.getObjectsHeads(bucket,
filteredObjects);
// exiba os metadados
for (S3Object o : objectsWithHeadDetails) {
System.out.println(o);
}
}
Cada objeto recém-criado é privado por padrão. É possível usar o JetS3t
para gerar uma URL assinada que qualquer pessoa poderá usar para fazer
download dos dados do objeto.
Essa URL pode ser criada para ser válida somente por um certo período,
no final do qual ela automaticamente expirará. O objeto ainda será
privado, mas você poderá fornecer a URL para qualquer pessoa e permitir
que façam o download por um breve período.
Listagem 11. Gerar uma URL assinada para downloads de objetos
// obtenha o bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);
// por quanto tempo esta URL deve valer?
int duration = Integer.parseInt(tokens.nextToken());
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, duration);
Date expiryDate = cal.getTime();
// crie a URL assinada
String url = S3Service.createSignedGetUrl(bucketName, objectKey,
awsCredentials, expiryDate);
System.out.println("You can use this public URL to access this file for the next "
+ duration + " min - " + url);
A S3 permite o máximo de 5 GB por objeto em um bucket. Para objetos
maiores do que isso, será preciso dividi-los em vários arquivos, cada um
com tamanho de 5 GB, e fazer o upload de todas as partes para a S3.
Listagem 12. Upload para a S3
// obtenha o bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);
// crie um objeto com os dados de arquivo
File fileData = new File(“/my_file_to_upload�);
S3Object fileObject = new S3Object(bucket, fileData);
// coloque os dados na S3
s3Service.putObject(bucket, fileObject);
System.out.println("Successfully uploaded object - " + fileObject);
O JetS3t fornece uma classe DownloadPackage que simplifica
a associação de dados de um objeto da
S3 com um arquivo local e o salvamento automático de dados nele. Esse
recurso pode ser usado para fazer facilmente o download de objetos da
S3.
Listagem 13. Download da S3
// obtenha o bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);
// obtenha o objeto
S3Object fileObject = s3Service.getObject(bucket, fileName);
// associe um arquivo com os dados do objeto
DownloadPackage[] downloadPackages = new DownloadPackage[1];
downloadPackages[0] = new DownloadPackage(fileObject,
new File(fileObject.getKey()));
// faça download de objetos para os arquivos associados
s3ServiceMulti.downloadObjects(bucket, downloadPackages);
System.out.println("Successfully retrieved object to current directory");
Esta seção abordou algumas das funções básicas fornecidas pelo kit de
ferramentas JetS3t e como usá-las para interagir com a S3. Consulte a
seção Recursos para obter mais informações sobre serviços da S3 e ver uma discussão aprofundada sobre o kit de ferramentas
JetS3t.
Shell da S3
A interação com a S3 até o momento, por meio de pequenos fragmentos
de código, pode ser montada em uma forma mais útil e duradoura criando
um programa Shell da S3 simples que pode ser executado a partir da linha
de comando.
Você criará um programa Java simples que aceita a chave de
acesso e a chave secreta do
Amazon Web Services como parâmetros e retorna um prompt de console. Em
seguida, você poderá digitar uma ou algumas letras, como
b, para listar
buckets ou om para listar objetos que correspondam a um certo prefixo.
Use esse programa para teste.
O programa de shell contém um main()
preenchido com uma implementação usando os fragmentos de código que
foram usados neste artigo. Por questões de espaço, a listagem do código
do Shell da S3 não foi incluída aqui.
O código fonte completo do Shell
da S3, juntamente com suas dependências, está no
download. É possível executar o shell simplesmente executando o arquivo
devworks-s3.jar.
Listagem 14. Executando o Shell da S3
java -jar devworks-s3.jar my_aws_access_key my_aws_secret_key
É possível digitar h a qualquer momento no Shell da S3 para obter uma lista de comandos suportados.
Figura 2. Ajuda no Shell da S3

Alguns dos métodos mais úteis foram adicionados ao Shell da S3. É
possível estendê-lo para adicionar quaisquer outras funções necessárias
para tornar o shell ainda mais útil para o caso específico.
Resumo
Neste artigo, você aprendeu alguns dos conceitos básicos por trás do
serviço S3 da Amazon.
O kit de ferramentas JetS3t é uma biblioteca de software livre que pode
ser usada para interagir com a
S3.
Você também aprendeu como criar um Shell da S3 simples usando
amostras de fragmentos de código para que possa continuar a testar a S3,
de forma fácil e simples, usando a linha de comando. A Parte 3 desta série explica como usar a
Amazon Elastic Compute Cloud (EC2) para executar servidores virtuais na nuvem.
Recursos
Aprender
- Saiba mais sobre Amazon Web Services específicos:
- Amazon Simple Storage Service (S3)
- Amazon Elastic Compute Cloud (EC2)
- Amazon Simple Queue Service (SQS)
- Amazon SimpleDB (SDB)
- O
Painel Integridade do Serviço é atualizado pela equipe da Amazon
com relação a quaisquer problemas com os serviços.
- Registre-se
para obter uma conta do Amazon Web Services. - A Amazon Web Services
Developer Connection
é o portal para todos os recursos do desenvolvedor. - Leia o blog para descobrir os acontecimentos mais recentes no mundo do
Amazon Web Services. - Na página de informações de Conta Web
Services , é possível gerenciar suas chaves e certificados, gerá-los
novamente, visualizar relatórios de atividade de conta e uso e
modificar as informações de seu perfil. - S3 Technical Resources
tem a documentação técnica do Amazon Web Services, guias do usuário e outros artigos de interesse. - Amazon S3 tem as informações mais recentes sobre precificação. Use a ferramenta AWS Simple Monthly Calculator
para calcular seus custos de uso mensal da S3 e outros Amazon
Web Services. - Revise o
Guia do desenvolvedor da S3
para obter mais detalhes. - Amazon
Confira o Acordo de nível de serviço
(ANS)
para a S3. - A página de recursos S3stats
tem vários links para processar e visualizar registros de log da S3. Os logs estão no formato
S3 Server Access Log, mas podem ser facilmente convertidos para o formato Apache Combined Log
e analisados por qualquer ferramenta de análise de log de software livre ou comercial, como Webalizer. - Saiba mais sobre o JetS3t, um kit de ferramentas Java de software livre para a
Amazon S3, desenvolvido por
James Murty. Consulte a
documentação do kit de ferramentas e obtenha explicações detalhadas dos parâmetros no
guia de configuração.
Obter produtos e tecnologias
- Faça o download do JetS3t
e de outras ferramentas.
***
artigo publicado originalmente no developerWorks Brasil, por Prabhakar Chaganti
Prabhakar Chaganti é o diretor de tecnologia (CTO) da Ylastic, uma empresa que está criando
uma interface unificada exclusiva para arquitetar, gerenciar e monitorar todo o ambiente de
computação da nuvem AWS de um usuário: EC2, S3, SQS e SimpleDB. Ele é autor de dois livros
recentes, Xen Virtualization e GWT Java AJAX Programming É também vencedor do
prêmio de escolha da comunidade pelo dispositivo virtual mais inovador no VMware Global Virtual
Appliance Challenge.







