Dev (Back & Front)ARTIGO

Computação em nuvem com o Amazon Web Services – Parte 02

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:

  1. 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%.
  2. 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.
  3. 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.
  4. 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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
enviados
US$ 0,130 por GB — próximos 40 TB/mês de dados enviados
US$ 0,110 por GB — próximos 100 TB/mês de dados enviados
US$ 0,100 por
GB — dados enviados/mês acima de 150 TB

Europa US$ 0,100 por GB — todos os dados
recebidos

US$ 0,170 por GB — primeiros 10 TB/mês de dados
enviados
US$ 0,130 por GB — próximos 40 TB /
mês de dados enviados
US$ 0,110 por GB — próximos 100 TB/mês de dados enviados
US$ 0,100 por
GB — dados enviados/mês acima de 150 TB

  • 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:

  1. Faça o logon
    em sua conta do Amazon Web Services.
  2. Vá para a página inicial do S3.
  3. Clique em Sign Up For This Web Service no lado direito da página.
  4. 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:

  1. Cockpit: Uma GUI para gerenciar o conteúdo de uma conta da Amazon S3.
  2. Synchronize: Um aplicativo de linha de comando para sincronizar diretórios em um computador com uma conta da Amazon S3.
  3. Gatekeeper: Um servlet que pode ser usado para mediar o acesso a contas da Amazon S3.
  4. CockpitLite: Uma versão mais leve do Cockpit que encaminha todas as operações por meio de um serviço mediador de gatekeeper.
  5. 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

Obter produtos e tecnologias

***

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.

é o portal de tecnologia da IBM para profissionais de TI de todo o mundo. Colabore, aprenda a criar aplicativos inovadores e compreenda tecnologias avançadas. Acesse mais artigos e tutoriais em www.ibm.com/developerworks/br

Ver perfil