AdSense

網頁

2021/12/20

Java 從本機取得AWS S3 bucket objects清單

在locahost的Java應用程式中以AWS提供的aws-sdk-java-v2來取得S3 bucket objects清單。


注意本篇取得的是objects的metadata而非object的內容。

範例環境:

  • Java 11
  • Maven


事前要求

參考「AWS 建立IAM管理使用者及credentials」設定供應用程式存取AWS需要的IAM管理員credentials。

參考「AWS 建立S3 bucket並上傳檔案」建立S3 bucket及上傳hello.txt檔案。


下載AWS SDK for Java 2.x

在專案的pom.xml加入以下需要的AWS SDK for Java的S3依賴。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>bom</artifactId>
            <version>2.15.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>s3</artifactId>
</dependency>

範例的pom.xml如下。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.abc</groupId>
    <artifactId>java-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>11</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>2.15.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        ...
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3</artifactId>
        </dependency>
    </dependencies>
    ...
</project>

設定完pom.xml後在專案根目錄已命令列執行mvn install下載依賴。


存取S3 bucket

下面在Java程式呼叫S3Client.builder()建立S3Client來存取S3 bucket objects。AWS SDK預設會讀取$HOME/.aws/credentials的access keys來通過權限驗證。然後用ListObjectsRequest.builder()設定存取區域。最後用S3Client.listObjects取得bucket中的物件清單。

Main.java

package com.abc.demo;

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.ListObjectsRequest;
import software.amazon.awssdk.services.s3.model.ListObjectsResponse;
import software.amazon.awssdk.services.s3.model.S3Object;

import java.util.List;
import java.util.ListIterator;

public class Main {

    public static void main(String[] arges) {
        S3Client s3Client = S3Client.builder()
                .region(Region.AP_NORTHEAST_1)
                .build();

        ListObjectsRequest listObjectsRequest = ListObjectsRequest.builder()
                .bucket("s3-demo-bucket-202112151320") // bucket name
                .build();

        ListObjectsResponse res = s3Client.listObjects(listObjectsRequest);
        List<S3Object> s3ObjectList = res.contents();

        for (S3Object s3Object : s3ObjectList) {
            System.out.print("key=" + s3Object.key());
        }
    }
}


測試

執行Java應用程式輸出以下結果,key為S3 bucket中的檔案名稱。

key=hello.txt

github


沒有留言:

AdSense