AWS S3 dengan Java

1. Perkenalan

Dalam tutorial ini, kita akan mempelajari cara berinteraksi dengan sistem penyimpanan Amazon S3 (Simple Storage Service) secara terprogram, dari Java.

Ingat bahwa S3 memiliki struktur yang sangat sederhana - setiap bucket dapat menyimpan sejumlah objek yang dapat diakses baik menggunakan antarmuka SOAP atau API gaya REST.

Ke depannya, kami akan menggunakan AWS SDK untuk Java untuk membuat, mendaftar, dan menghapus bucket S3. Kami juga akan mengunggah, mendaftar, mengunduh, menyalin, memindahkan, mengganti nama, dan menghapus objek dalam wadah ini.

2. Ketergantungan Maven

Sebelum memulai, kami perlu mendeklarasikan ketergantungan AWS SDK di proyek kami:

 com.amazonaws aws-java-sdk 1.11.163 

Untuk melihat versi terbaru, periksa Maven Central.

3. Prasyarat

Untuk menggunakan AWS SDK, kami memerlukan beberapa hal:

  1. Akun AWS: kami membutuhkan akun Amazon Web Services. Jika Anda masih belum punya, lanjutkan dan buat akun
  2. Kredensial Keamanan AWS: Ini adalah kunci akses kami yang memungkinkan kami melakukan panggilan terprogram ke tindakan API AWS. Kami bisa mendapatkan kredensial ini dengan dua cara, baik dengan menggunakan kredensial akun root AWS dari bagian kunci akses halaman Kredensial Keamanan atau dengan menggunakan kredensial pengguna IAM dari konsol IAM
  3. Memilih Wilayah AWS: Kami harus memilih wilayah AWS tempat kami ingin menyimpan data Amazon S3 kami. Ingatlah bahwa harga penyimpanan S3 bervariasi menurut wilayah. Untuk lebih jelasnya, buka dokumentasi resmi. Untuk tutorial ini, kita akan menggunakan US East (Ohio) (region us-east-2 )

4. Membuat Koneksi Klien

Pertama, kita perlu membuat koneksi klien untuk mengakses layanan web Amazon S3. Kami akan menggunakan antarmuka AmazonS3 untuk tujuan ini:

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

Dan kemudian konfigurasikan klien:

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

5. Operasi Bucket Amazon S3

5.1. Membuat Bucket

Penting untuk diperhatikan bahwa namespace bucket dibagikan oleh semua pengguna sistem. Jadi nama bucket kami harus unik di semua nama bucket yang ada di Amazon S3 (kami akan mengetahui cara memeriksanya sebentar lagi).

Selain itu, seperti yang ditentukan dalam dokumentasi resmi, nama Bucket harus memenuhi persyaratan berikut:

  • nama tidak boleh mengandung garis bawah
  • panjang nama harus antara 3 dan 63 karakter
  • nama tidak boleh diakhiri dengan tanda hubung
  • nama tidak boleh berisi titik yang berdekatan
  • nama tidak boleh berisi tanda hubung di samping titik (misalnya, "my-.bucket.com" dan "my.-bucket" tidak valid)
  • nama tidak boleh berisi karakter huruf besar

Mari buat sebuah ember:

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);

Di sini, kami menggunakan s3client yang kami buat di langkah sebelumnya. Sebelum membuat sebuah keranjang, kita memeriksa apakah nama keranjang kita tersedia atau tidak dengan menggunakan metode doesBucketExist () . Jika nama ini tersedia, maka kita akan menggunakan metode createBucket () .

5.2. Mencantumkan Bucket

Sekarang, setelah kita membuat beberapa keranjang, sekarang mari kita mencetak daftar semua keranjang yang tersedia di lingkungan S3 kita menggunakan metode listBuckets () . Metode ini akan mengembalikan daftar semua Bucket:

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

Ini akan mencantumkan semua bucket yang ada di lingkungan S3 kami:

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

5.3. Menghapus Bucket

Penting untuk memastikan bahwa keranjang kita kosong sebelum kita dapat menghapusnya. Jika tidak, pengecualian akan dilempar. Selain itu, perhatikan bahwa hanya pemilik bucket yang dapat menghapusnya terlepas dari izinnya (Kebijakan Kontrol Akses):

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

6. Operasi Objek Amazon S3

File atau kumpulan data di dalam bucket Amazon S3 disebut sebagai objek. Kami dapat melakukan beberapa operasi pada objek seperti mengunggah, mendaftar, mengunduh, menyalin, memindahkan, mengganti nama, dan menghapus.

6.1. Mengupload Objek

Mengupload sebuah objek adalah proses yang sangat mudah. Kami akan menggunakan metode putObject () yang menerima tiga parameter:

  1. bucketName : Nama bucket tempat kita ingin mengunggah objek
  2. key : Ini adalah path lengkap ke file
  3. file : File sebenarnya yang berisi data yang akan diupload
s3client.putObject( bucketName, "Document/hello.txt", new File("/Users/user/Document/hello.txt") );

6.2. Daftar Objek

Kami akan menggunakan metode listObjects () untuk membuat daftar semua objek yang tersedia di bucket S3 kami:

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

Memanggil listObjects () method dari s3client objek akan menghasilkan ObjectListing objek, yang dapat digunakan untuk mendapatkan daftar semua ringkasan objek dalam ember yang ditentukan. Kami hanya mencetak kunci di sini, tetapi ada juga beberapa opsi lain yang tersedia, seperti ukuran, pemilik, terakhir diubah, kelas penyimpanan, dll…

Ini sekarang akan mencetak daftar semua objek di dalam keranjang kita:

Document/hello.txt

6.3. Mengunduh Objek

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.

Setelah kita memiliki objek DeleteObjectsRequest ini , kita dapat meneruskannya ke metode deleteObjects () dari s3client kita sebagai argumen. Jika berhasil, maka ini akan menghapus semua objek yang telah kita sediakan:

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

7. Kesimpulan

Dalam artikel ini, kami berfokus pada dasar-dasar berinteraksi dengan layanan web Amazon S3 - baik di tingkat bucket dan objek.

Seperti biasa, implementasi lengkap dari tutorial ini dapat ditemukan di Github.