【AWS & Java】JavaでAmazon S3を操作してみよう

AWS

こんにちは。ECF Techブログ
担当 Michiharu.Tです。

AWSとJavaを連携した内容をお届けいたします。
この記事では、AWS SDK for Java 2.Xを使って、Amazon S3を操作するサンプルプログラムをご紹介します。

対象読者

下のような読者を想定して記載しています。

  • AWSの基本的な内容について知っている
  • Javaの基礎的な知識を持っている

S3でバケットを作成

まずはAWSマネジメントコンソールからS3内にバケットを1つ作成します。
「バケットを作成」の画面(上画面)での各設定は次のとおりです。
※基本デフォルトです。

  • 一般的な設定
    • バケット名:e3factory-2023
    • AWS リージョン:米国東部(バージニア北部)us-east-1
  • オブジェクト所有者
  • ACL無効(推奨)
  • このバケットのブロックパブリックアクセス設定
    • 「パブリックアクセスをすべて ブロック」にチェック
  • バケットのバージョニング
    • バケットのバージョニング:無効にする
  • タグ-オプション
    • 何もしない
  • デフォルトの暗号化
    • 暗号化タイプ:Amazon S3 マネージドキーを使用したサーバー側の暗号化 (SSE-S3)
    • バケットキー:有効にする
  • 詳細設定
    • オブジェクトのロック:無効にする

最後に「バケットを作成」をクリックします。

バケットが作成できたら、バケット名をクリックします。

テキストファイルをアップします。アップロードの部分にドラッグ&ドロップするだけでOKです。

今回は下のようなシンプルなテキストファイルをアップします。文字コードはUTF-8です。

Hello S3 With Java!

内容を確認したら、画面下の「アップロード」をクリックします。

アップロードに成功したら「閉じる」をクリックします。

AWSマネジメントコンソールでの操作は以上です。

Javaでプログラミング

次にJavaでのプログラムです。実現させたいことは、

  • バケット名の一覧を取得
  • バケットに入っているテキストファイルの内容を表示
    の2点です。

Eclipseからシンプルなmavenプロジェクトを作成して、実行してみたいと思います。

Eclipseで新規のMavenプロジェクトを作成します。

下の画面は下記設定にしています。「シンプルなプロジェクトの作成」にチェックを入れています。その他はデフォルトです。

プロジェクトの設定を記載。グループidとアーティファクトidを入れておけばとりあえずOKです。

プロジェクトができたら、pom.xmlを開いて依存関係を設定します。全文記載していますが、dependenciesタグの範囲を追加するだけです。

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.e3factory</groupId>
  <artifactId>s3test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3</artifactId>
            <version>2.20.43</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.28</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.28</version>
        </dependency>
    </dependencies>
</project>
AWSSDK内でログ関連のライブラリ(slf4j)を利用しているようなので、依存関係の中に入っています。これが無くても実行はできますが、エラーメッセージが出てしまいます。

これで、AWSSDKがつかえるようになります。

※AWS SDK for Java 2 系はJava8以降が必要となります。

Javaのプログラムは次のとおりです。src/main/java内にApp.javaとして作成しています。

package s3test;

import java.util.List;

import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.core.ResponseBytes;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.Bucket;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.model.ListBucketsRequest;
import software.amazon.awssdk.services.s3.model.ListBucketsResponse;

public class App {
    public static void main(String[] args) {
        //認証情報を設定・・・(1)
        AwsCredentials credentials = AwsBasicCredentials.create("Access ID","Secret Access Key");
        //S3クライアントを生成・・・(2)
        S3Client s3 = S3Client.builder()
                .region(Region.US_EAST_1)
                .credentialsProvider(StaticCredentialsProvider.create(credentials))
                .build();
        //バケットリストのリクエスト生成
        ListBucketsRequest listBucketsRequest = ListBucketsRequest.builder().build();
        //バケットリストのレスポンス取得
        ListBucketsResponse listBucketsResponse = s3.listBuckets(listBucketsRequest);
        //バケットの一覧を取得
        List<Bucket> list = listBucketsResponse.buckets();
        //バケット名を表示
        for(Bucket bucket : list) {
            System.out.println(bucket.name());
        }

        //オブジェクトの取得・・・(3)
        GetObjectRequest objRequest = GetObjectRequest
            .builder()
            .key("helloS3.txt")
            .bucket("e3factory-2023")
            .build();
        ResponseBytes<GetObjectResponse> objBytes = s3.getObjectAsBytes(objRequest);
        //UTF-8文字列として取得・・・(4)
        String message = objBytes.asUtf8String();
        System.out.println(message);
    }
}

()つきのコメントについての解説します。

  • (1)"Access ID","Secret Access Key"の部分は、IAMユーザーに付与されているアクセスキーの情報を設定します。アクセスキーの情報である「アクセスID」と「シークレットアクセスキー」の情報が必要です。シークレットアクセスキーは作成時しか参照できないため、わからなくなっている場合は再度アクセスキーの作成が必要です。
  • (2)regionメソッドの引数は、s3バケットを設置しているリージョンに該当する定数を指定します。
  • (3)keyメソッドの引数にはキー名、bucketメソッドの引数にはバケット名が入ります。
  • (4)ResponseBytesインスタンスのasUtf8Stringメソッドを使って、UTF-8の文字列データとして取得しています。

Javaアプリケーションとして実行します。結果は下のとおりです。

e3factory-2023
Hello S3 With Java!

バケット名(1行目)とhelloS3.txt内の文字列が取得できていることがわかります。

本日は以上とさせていただきます。最後までご覧くださりありがとうございます。本記事は随時、関連する内容を更新していく予定です。少しでも開発ライフのお役に立てれば幸いです。


合同会社イー・シー・エフでは、未経験者向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。

ECFエデュケーション
タイトルとURLをコピーしました