AWS S3 с Java

1. Въведение

В този урок ще научим как програмно да взаимодействаме със системата за съхранение на Amazon S3 (Simple Storage Service) от Java.

Не забравяйте, че S3 има много проста структура - всяка група може да съхранява произволен брой обекти, които могат да бъдат достъпни с помощта на SOAP интерфейс или API в стил REST.

Занапред ще използваме AWS SDK за Java, за да създаваме, изброяваме и изтриваме сегменти S3. Също така ще качваме, изброяваме, изтегляме, копираме, преместваме, преименуваме и изтриваме обекти в тези групи.

2. Зависимости на Maven

Преди да започнем, трябва да декларираме зависимостта на AWS SDK в нашия проект:

 com.amazonaws aws-java-sdk 1.11.163 

За да видите най-новата версия, проверете Maven Central.

3. Предпоставки

За да използваме AWS SDK, ще са ни необходими няколко неща:

  1. AWS акаунт: имаме нужда от акаунт в Amazon Web Services. Ако все още нямате, продължете и създайте акаунт
  2. Удостоверения за сигурност на AWS: Това са нашите ключове за достъп, които ни позволяват да правим програмни повиквания към действия на API на AWS. Можем да получим тези идентификационни данни по два начина, като използваме идентификационни данни на AWS root акаунт от раздела с ключове за достъп на страницата с идентификационни данни за защита или чрез използване на потребителски идентификационни данни на IAM от конзолата на IAM
  3. Избор на AWS регион: Трябва да изберем AWS регион (и), в който искаме да съхраняваме данните на Amazon S3. Имайте предвид, че цените за съхранение на S3 варират в зависимост от региона. За повече подробности преминете към официалната документация. За този урок ще използваме US East (Ohio) (region us-east-2 )

4. Създаване на връзка с клиент

Първо, трябва да създадем клиентска връзка за достъп до уеб услугата Amazon S3. За тази цел ще използваме интерфейса AmazonS3 :

AWSCredentials credentials = new BasicAWSCredentials( "", "" ); 

И след това конфигурирайте клиента:

AmazonS3 s3client = AmazonS3ClientBuilder .standard() .withCredentials(new AWSStaticCredentialsProvider(credentials)) .withRegion(Regions.US_EAST_2) .build();

5. Операции с Amazon S3 Bucket

5.1. Създаване на кофа

Важно е да се отбележи, че пространството от имена на сегмента се споделя от всички потребители на системата. Така че името на нашата група трябва да е уникално за всички съществуващи имена на кофи в Amazon S3 (ще разберем как да проверим това само след малко).

Освен това, както е посочено в официалната документация, имената на кофите трябва да отговарят на следните изисквания:

  • имената не трябва да съдържат долни черти
  • имената трябва да са между 3 и 63 знака
  • имената не трябва да завършват с тире
  • имената не могат да съдържат съседни периоди
  • имената не могат да съдържат тирета до точки (напр. „my-.bucket.com“ и „my.-bucket“ са невалидни)
  • имената не могат да съдържат главни букви

Нека създадем кофа:

String bucketName = "baeldung-bucket"; if(s3client.doesBucketExist(bucketName)) { LOG.info("Bucket name is not available." + " Try again with a different Bucket name."); return; } s3client.createBucket(bucketName);

Тук използваме s3client , който създадохме в предишната стъпка. Преди да създадем група, проверяваме дали името на нашата група е налично или не, като използваме метода doesBucketExist () . Ако това име е налично, тогава ще използваме метода createBucket () .

5.2. Кофи за изброяване

Сега, след като създадохме няколко групи, нека сега отпечатаме списък с всички налични сегменти в нашата среда S3, използвайки метода listBuckets () . Този метод ще върне списък с всички групи:

List buckets = s3client.listBuckets(); for(Bucket bucket : buckets) { System.out.println(bucket.getName()); }

Това ще изброи всички групи, които присъстват в нашата среда S3:

baeldung-bucket baeldung-bucket-test2 elasticbeanstalk-us-east-2

5.3. Изтриване на група

Важно е да се уверите, че нашата група е празна, преди да можем да я изтрием. В противен случай ще бъде създадено изключение. Също така имайте предвид, че само собственикът на група може да я изтрие, независимо от нейните разрешения (Правила за контрол на достъпа):

try { s3client.deleteBucket("baeldung-bucket-test2"); } catch (AmazonServiceException e) { System.err.println("e.getErrorMessage()); return; }

6. Операции с обекти на Amazon S3

Файл или колекция от данни в кофата на Amazon S3 е известен като обект. Можем да извършим няколко операции върху обекти като качване, изброяване, изтегляне, копиране, преместване, преименуване и изтриване.

6.1. Качване на обекти

Качването на обект е доста ясен процес. Ще използваме метод putObject () , който приема три параметъра:

  1. bucketName : Името на сегмента, където искаме да качим обект
  2. ключ : Това е пълният път към файла
  3. файл : Действителният файл, съдържащ данните за качване
s3client.putObject( bucketName, "Document/hello.txt", new File("/Users/user/Document/hello.txt") );

6.2. Обекти от списъка

Ще използваме метода listObjects () , за да изброим всички налични обекти в нашата група S3:

ObjectListing objectListing = s3client.listObjects(bucketName); for(S3ObjectSummary os : objectListing.getObjectSummaries()) { LOG.info(os.getKey()); }

Извикването на метод listObjects () на обекта s3client ще даде обект ObjectListing , който може да се използва за получаване на списък на всички обобщения на обектите в посочената група. Ние просто отпечатваме ключа тук, но има и няколко други налични опции, като размер, собственик, последна промяна, клас на съхранение и т.н.

Това ще отпечата списък с всички обекти в нашата кофа:

Document/hello.txt

6.3. Изтегляне на обект

To download an object, we'll first use the getObject() method on s3client which will return an S3Object object. Once we get this, we'll call getObjectContent() on this to get an S3ObjectInputStream object which behaves like a conventional Java InputStream.

S3Object s3object = s3client.getObject(bucketName, "picture/pic.png"); S3ObjectInputStream inputStream = s3object.getObjectContent(); FileUtils.copyInputStreamToFile(inputStream, new File("/Users/user/Desktop/hello.txt"));

Here, we are using FileUtils.copyInputStreamToFile() method by Apache Commons. You can also visit this Baeldung article to explore other ways to convert an InputStream to a File.

6.4. Copying, Renaming and Moving an Object

We can copy an object by calling copyObject() method on our s3client which accepts four parameters:

  1. source bucket name
  2. object key in source bucket
  3. destination bucket name (it can be same as source)
  4. object key in destination bucket
s3client.copyObject( "baeldung-bucket", "picture/pic.png", "baeldung-bucket2", "document/picture.png" );

Note: We can use a combination of copyObject() method deleteObject() for performing moving and renaming tasks. This will involve copying the object first and then deleting it from its old location.

6.5. Deleting an Object

To delete an Object, we'll call deleteObject() method on s3client and pass the bucket name and object key:

s3client.deleteObject("baeldung-bucket","picture/pic.png");

6.6. Deleting Multiple Objects

To delete multiple objects at once, we'll first create the DeleteObjectsRequest object and pass the bucket name to its constructor. Then we'll pass an array of all the object keys that we want to delete.

След като имаме този обект DeleteObjectsRequest , можем да го предадем на метода deleteObjects () на нашия s3client като аргумент. Ако успее, това ще изтрие всички обекти, които сме предоставили:

String objkeyArr[] = { "document/hello.txt", "document/pic.png" }; DeleteObjectsRequest delObjReq = new DeleteObjectsRequest("baeldung-bucket") .withKeys(objkeyArr); s3client.deleteObjects(delObjReq);

7. Заключение

В тази статия се фокусирахме върху основите на взаимодействието с уеб услугата Amazon S3 - както на ниво сегмент, така и на ниво обект.

Както винаги, пълното изпълнение на този урок може да бъде намерено в Github.