AWS S3 com Java
1. Introdução
Neste tutorial, aprenderemos como interagir com o sistema de armazenamento Amazon S3 (Simple Storage Service) programaticamente, a partir de Java.
Lembre-se de que o S3 tem uma estrutura muito simples - cada bloco pode armazenar qualquer número de objetos que podem ser acessados usando uma interface SOAP ou uma API no estilo REST.
No futuro, usaremos o SDK da AWS para Java para criar, listar e excluir buckets S3. Também faremos upload, lista, download, copiaremos, moveremos, renomearemos e excluiremos objetos dentro desses intervalos.
2. Dependências do Maven
Antes de começarmos, precisamos declarar a dependência do AWS SDK em nosso projeto:
com.amazonaws
aws-java-sdk
1.11.163
Para ver a versão mais recente, verifiqueMaven Central.
3. Pré-requisitos
Para usar o SDK da AWS, precisamos de algumas coisas:
-
AWS Account:, precisamos de uma conta Amazon Web Services. Se você ainda não tem nenhum, vá em frente ecreate an account
-
AWS Security Credentials: Essas são nossas chaves de acesso que nos permitem fazer chamadas programáticas para ações da API da AWS. Podemos obter essas credenciais de duas maneiras, usando credenciais de conta raiz da AWS na seção de chaves de acesso dehttps://console.aws.amazon.com/iam/home?security_credential[Security Credentials] page or by using IAM user credentials from https://console.aws.amazon.com/iam/home? [console IAM]
-
Choosing AWS Region: Precisamos selecionar uma (s) região (ões) AWS onde queremos armazenar nossos dados do Amazon S3. Lembre-se de que os preços de armazenamento do S3 variam de acordo com a região. Para obter mais detalhes, vá paraofficial documentation. Para este tutorial, usaremos US East (Ohio) (regionus-east-2)
4. Criando Conexão de Cliente
Primeiro, precisamos criar uma conexão do cliente para acessar o serviço web Amazon S3. Usaremos a interfaceAmazonS3 para esta finalidade:
AWSCredentials credentials = new BasicAWSCredentials(
"",
""
);
E então configure o cliente:
AmazonS3 s3client = AmazonS3ClientBuilder
.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withRegion(Regions.US_EAST_2)
.build();
5. Operações de Bucket Amazon S3
5.1. Criando um Bucket
É importante observar que o namespace do intervalo é compartilhado por todos os usuários do sistema. So our bucket name must be unique across all existing bucket names in Amazon S3 (vamos descobrir como verificar isso em alguns instantes).
Além disso, conforme especificado emthe official documentation, os nomes dos intervalos devem cumprir os seguintes requisitos:
-
nomes não devem conter sublinhados
-
nomes devem ter entre 3 e 63 caracteres
-
nomes não devem terminar com um traço
-
nomes não podem conter pontos adjacentes
-
os nomes não podem conter traços ao lado de pontos (por exemplo, "meu.bucket.com" e "meu.bolo" são inválidos)
-
nomes não podem conter caracteres maiúsculos
Vamos criar um intervalo:
String bucketName = "example-bucket";
if(s3client.doesBucketExist(bucketName)) {
LOG.info("Bucket name is not available."
+ " Try again with a different Bucket name.");
return;
}
s3client.createBucket(bucketName);
Aqui, estamos usandos3client que criamos na etapa anterior. Antes de criar um intervalo, estamos verificando se nosso nome de intervalo está disponível ou não usando o métododoesBucketExist(). Se este nome estiver disponível, usaremos o métodocreateBucket().
5.2. Buckets de listagem
Agora que criamos alguns baldes, vamos imprimir uma lista de todos os baldes disponíveis em nosso ambiente S3 usando o métodolistBuckets(). Este método retornará uma lista de todos os Buckets:
List buckets = s3client.listBuckets();
for(Bucket bucket : buckets) {
System.out.println(bucket.getName());
}
Isso listará todos os buckets presentes em nosso ambiente S3:
example-bucket
example-bucket-test2
elasticbeanstalk-us-east-2
5.3. Excluindo um Bucket
It’s important to ensure that our bucket is empty before we can delete it. Caso contrário, uma exceção será lançada. Além disso, observe que apenas o proprietário de um depósito pode excluí-lo, independentemente de suas permissões (Políticas de Controle de Acesso):
try {
s3client.deleteBucket("example-bucket-test2");
} catch (AmazonServiceException e) {
System.err.println("e.getErrorMessage());
return;
}
6. Amazon S3 Object Operations
Um arquivo ou uma coleção de dados dentro do bucket do Amazon S3 é conhecido como um objeto. Podemos executar várias operações em objetos como upload, listagem, download, cópia, movimentação, renomeação e exclusão.
6.1. Carregando objetos
Carregar um objeto é um processo bastante simples. Usaremos um métodoputObject() que aceita três parâmetros:
-
bucketName: o nome do intervalo onde queremos fazer o upload do objeto
-
key: Este é o caminho completo para o arquivo
-
file: O arquivo real contendo os dados a serem carregados
s3client.putObject(
bucketName,
"Document/hello.txt",
new File("/Users/user/Document/hello.txt")
);
6.2. Listando objetos
Usaremos o métodolistObjects() para listar todos os objetos disponíveis em nosso intervalo S3:
ObjectListing objectListing = s3client.listObjects(bucketName);
for(S3ObjectSummary os : objectListing.getObjectSummaries()) {
LOG.info(os.getKey());
}
Chamar o métodolistObjects() do objetos3client produzirá o objetoObjectListing, que pode ser usado para obter uma lista de todos os resumos de objeto no intervalo especificado. Estamos apenas imprimindo a chave aqui, mas também há algumas outras opções disponíveis, como tamanho, proprietário, última modificação, classe de armazenamento, etc ...
Agora, será impressa uma lista de todos os objetos dentro do nosso bucket:
Document/hello.txt
6.3. Baixando um objeto
Para baixar um objeto, primeiro usaremos o métodogetObject() ems3client, que retornará um objetoS3Object. Assim que conseguirmos isso, chamaremosgetObjectContent() para obter um objetoS3ObjectInputStream que se comporta como um JavaInputStream. convencional
S3Object s3object = s3client.getObject(bucketName, "picture/pic.png");
S3ObjectInputStream inputStream = s3object.getObjectContent();
FileUtils.copyInputStreamToFile(inputStream, new File("/Users/user/Desktop/hello.txt"));
Aqui, estamos usando o métodoFileUtils.copyInputStreamToFile() do Apache Commons. Você também pode visitarthis example article para explorar outras maneiras de converter umInputStream em umFile.
6.4. Copiar, renomear e mover um objeto
Podemos copiar um objeto chamando o métodocopyObject() em nossos3client, que aceita quatro parâmetros:
-
nome do bloco de origem
-
chave de objeto no bloco de origem
-
nome do bloco de destino (pode ser o mesmo que origem)
-
chave de objeto no intervalo de destino
s3client.copyObject(
"example-bucket",
"picture/pic.png",
"example-bucket2",
"document/picture.png"
);
Observação: podemos usar uma combinação do métodocopyObject()deleteObject() para executar tarefas de movimentação e renomeação. Isso envolverá primeiro a cópia do objeto e a exclusão do local antigo.
6.5. Excluindo um Objeto
Para excluir um objeto, chamaremos o métododeleteObject() ems3cliente passaremos o nome do intervalo e a chave do objeto:
s3client.deleteObject("example-bucket","picture/pic.png");
6.6. Excluindo vários objetos
Para excluir vários objetos de uma vez, primeiro criaremos o objetoDeleteObjectsRequest e passaremos o nome do intervalo para seu construtor. Em seguida, passaremos uma matriz de todas as chaves de objeto que queremos excluir.
Assim que tivermos esse objetoDeleteObjectsRequest, podemos passá-lo para o métododeleteObjects() de nossos3client como um argumento. Se for bem-sucedido, isso excluirá todos os objetos que fornecemos:
String objkeyArr[] = {
"document/hello.txt",
"document/pic.png"
};
DeleteObjectsRequest delObjReq = new DeleteObjectsRequest("example-bucket")
.withKeys(objkeyArr);
s3client.deleteObjects(delObjReq);
7. Conclusão
Neste artigo, nos concentramos nos conceitos básicos de interação com o serviço da web Amazon S3 - no nível do bucket e do objeto.
Como sempre, a implementação completa deste tutorial pode ser encontradaover on Github.