AWS SDK for Java 2.x の使用を開始する - AWS SDK for Java 2.x

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS SDK for Java 2.x の使用を開始する

AWS SDK for Java 2.x は、Amazon Web Services (AWS) 用の Java API を提供します。この SDK を使用すると、Amazon S3、Amazon EC2、DynamoDB などで動作する Java アプリケーションを構築できます。

このチュートリアルでは、Apache Maven を使用して SDK for Java 2.x の依存関係を定義し、Amazon S3 に接続してファイルをアップロードするコードを記述する方法を説明します。

このチュートリアルを完了するには、次の手順に従ってください。

ステップ 1: このチュートリアルのために設定する

このチュートリアルを開始する前に、以下を実行する必要があります

  • Amazon S3 にアクセスする許可

  • AWS IAM Identity Center へのシングルサインオンを使用して AWS のサービス へアクセスするように設定された Java 開発環境

設定の概要 の手順に従って、このチュートリアルの設定を行ってください。Java SDK のシングルサインオンアクセスを使用して開発環境を設定し、アクティブな AWS アクセスポータルセッションができた後、このチュートリアルのステップ 2 に進みます。

ステップ 2: プロジェクトを作成する

このチュートリアル用のプロジェクトを作成するには、プロジェクトの設定方法に関する入力を求める Maven コマンドを実行します。すべての入力と確認が完了すると、Maven は pom.xml を作成してプロジェクトの構築を終了し、スタブ Java ファイルを作成します。

  1. ターミナルまたはコマンドプロンプトウィンドウを開き、DesktopHome フォルダなど、任意のディレクトリに移動します。

  2. ターミナルに以下のコマンドを入力して、Enter を押します。

    mvn archetype:generate \ -DarchetypeGroupId=software.amazon.awssdk \ -DarchetypeArtifactId=archetype-app-quickstart \ -DarchetypeVersion=2.20.43
  3. 各プロンプトの 2 列目にリストされている値を入力します。

    プロンプト 入力する値
    Define value for property 'service': s3
    Define value for property 'httpClient': apache-client
    Define value for property 'nativeImage': false
    Define value for property 'credentialProvider' identity-center
    Define value for property 'groupId': org.example
    Define value for property 'artifactId': getstarted
    Define value for property 'version' 1.0-SNAPSHOT: <Enter>
    Define value for property 'package' org.example: <Enter>
  4. 最後の値を入力すると、Maven は選択した内容を一覧表示します。Y を入力して確認するか、N を入力して値を再入力します。

Maven は、入力した getstarted 値に基づいて artifactId という名前が付けられたプロジェクトフォルダーを作成します。getstarted フォルダー内で、レビューできる README.md ファイル、pom.xml ファイル、および src ディレクトリを検索します。

Maven は以下のディレクトリーツリーを構築します。

getstarted ├── README.md ├── pom.xml └── src ├── main │   ├── java │   │   └── org │   │   └── example │   │   ├── App.java │   │   ├── DependencyFactory.java │   │   └── Handler.java │   └── resources │   └── simplelogger.properties └── test └── java └── org └── example └── HandlerTest.java 10 directories, 7 files

以下は、pom.xml プロジェクトファイルの内容を示しています。

dependencyManagement セクションには AWS SDK for Java 2.x に対する依存関係が含まれており、dependencies セクションには Amazon S3 に対する依存関係があります。プロジェクトでは Java 1.8 が使用されています。これは、maven.compiler.sourcemaven.compiler.target およびプロパティに 1.8 値があるためです。

<?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>org.example</groupId> <artifactId>getstarted</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.shade.plugin.version>3.2.1</maven.shade.plugin.version> <maven.compiler.plugin.version>3.6.1</maven.compiler.plugin.version> <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version> <aws.java.sdk.version>2.20.43</aws.java.sdk.version> <-------- SDK version picked up from archetype version. <slf4j.version>1.7.28</slf4j.version> <junit5.version>5.8.1</junit5.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws.java.sdk.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <-------- S3 dependency <exclusions> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>netty-nio-client</artifactId> </exclusion> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sso</artifactId> <-------- Required for identity center authentication. </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>ssooidc</artifactId> <-------- Required for identity center authentication. </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> <-------- HTTP client specified. <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>${slf4j.version}</version> </dependency> <!-- Needed to adapt Apache Commons Logging used by Apache HTTP Client to Slf4j to avoid ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl during runtime --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <!-- Test Dependencies --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>${junit5.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven.compiler.plugin.version}</version> </plugin> </plugins> </build> </project>

ステップ 3: コードを記述する

次のコードは Maven によって作成された App クラスを示しています。main メソッドはアプリケーションへのエントリポイントであり、Handler クラスのインスタンスを作成してその sendRequest メソッドを呼び出します。

package org.example; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class App { private static final Logger logger = LoggerFactory.getLogger(App.class); public static void main(String... args) { logger.info("Application starts"); Handler handler = new Handler(); handler.sendRequest(); logger.info("Application ends"); } }

Maven によって作成された DependencyFactory クラスには、S3Client インスタンスを構築して返す s3Client ファクトリメソッドが含まれています。S3Client インスタンスは Apache ベースの HTTP クライアントのインスタンスを使用します。これは、どの HTTP クライアントを使用するかを Maven が求めたときに apache-client が指定されたためです。

DependencyFactory は次のコードに示されています。

package org.example; import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.services.s3.S3Client; /** * The module containing all dependencies required by the {@link Handler}. */ public class DependencyFactory { private DependencyFactory() {} /** * @return an instance of S3Client */ public static S3Client s3Client() { return S3Client.builder() .httpClientBuilder(ApacheHttpClient.builder()) .build(); } }

Handler クラスにはプログラムのメインロジックが含まれています。Handler のインスタンスが App クラス内で作成されると、DependencyFactoryS3Client サービスクライアントを配置します。コードは、S3Client インスタンスを使用して Amazon S3 サービスを呼び出します。

Maven は TODO コメント付きの次の Handler クラスを生成します。チュートリアルの次のステップでは、TODO をコードに置き換えます。

package org.example; import software.amazon.awssdk.services.s3.S3Client; public class Handler { private final S3Client s3Client; public Handler() { s3Client = DependencyFactory.s3Client(); } public void sendRequest() { // TODO: invoking the api calls using s3Client. } }

ロジックを設定するには、Handler クラスのすべてのコンテンツを次のコードに置き換えます。sendRequest メソッドが入力され、必要なインポートが追加されます。

このコードはまず、バケット名を一意にするために、System.currentTimeMillis() を使用して生成された名前の最後の部分を使用して新しい S3 バケットを作成します。

createBucket() メソッドでバケットを作成すると、プログラムは S3ClientputObject メソッドを使用してオブジェクトをアップロードします。オブジェクトの内容は、RequestBody.fromString メソッドで作成された単純な文字列です。

最後に、プログラムは、cleanUp メソッド内のオブジェクトを削除し、その後にバケットを削除します。

package org.example; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.CreateBucketRequest; import software.amazon.awssdk.services.s3.model.DeleteBucketRequest; import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; import software.amazon.awssdk.services.s3.model.HeadBucketRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.model.S3Exception; public class Handler { private final S3Client s3Client; public Handler() { s3Client = DependencyFactory.s3Client(); } public void sendRequest() { String bucket = "bucket" + System.currentTimeMillis(); String key = "key"; createBucket(s3Client, bucket); System.out.println("Uploading object..."); s3Client.putObject(PutObjectRequest.builder().bucket(bucket).key(key) .build(), RequestBody.fromString("Testing with the {sdk-java}")); System.out.println("Upload complete"); System.out.printf("%n"); cleanUp(s3Client, bucket, key); System.out.println("Closing the connection to {S3}"); s3Client.close(); System.out.println("Connection closed"); System.out.println("Exiting..."); } public static void createBucket(S3Client s3Client, String bucketName) { try { s3Client.createBucket(CreateBucketRequest .builder() .bucket(bucketName) .build()); System.out.println("Creating bucket: " + bucketName); s3Client.waiter().waitUntilBucketExists(HeadBucketRequest.builder() .bucket(bucketName) .build()); System.out.println(bucketName + " is ready."); System.out.printf("%n"); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } } public static void cleanUp(S3Client s3Client, String bucketName, String keyName) { System.out.println("Cleaning up..."); try { System.out.println("Deleting object: " + keyName); DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest.builder().bucket(bucketName).key(keyName).build(); s3Client.deleteObject(deleteObjectRequest); System.out.println(keyName + " has been deleted."); System.out.println("Deleting bucket: " + bucketName); DeleteBucketRequest deleteBucketRequest = DeleteBucketRequest.builder().bucket(bucketName).build(); s3Client.deleteBucket(deleteBucketRequest); System.out.println(bucketName + " has been deleted."); System.out.printf("%n"); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } System.out.println("Cleanup complete"); System.out.printf("%n"); } }

ステップ 4: アプリケーションを構築して実行する

プロジェクトが作成され、完全な Handler クラスを含めたら、アプリケーションを構築して実行します。

  1. IAM Identity Center セッションがアクティブであることを確認してください。そのためには、AWS Command Line Interface コマンド aws sts get-caller-identity を実行してレスポンスを確認します。アクティブなセッションがない場合は、このセクションの手順を参照してください。

  2. ターミナルまたはコマンドプロンプトウィンドウを開いて、プロジェクトディレクトリ getstarted に移動します。

  3. プロジェクトを構築するには、以下のコマンドを使用します。

    mvn clean package
  4. 次のコマンドを使用して、アプリケーションを実行します。

    mvn exec:java -Dexec.mainClass="org.example.App"

プログラムが作成した新しいバケットとオブジェクトを表示するには、次のステップを実行します。

  1. Handler.java で、sendRequest メソッド内の cleanUp(s3Client, bucket, key) 行をコメントアウトし、ファイルを保存します。

  2. mvn clean package を実行してプロジェクトを再構築します。

  3. mvn exec:java -Dexec.mainClass="org.example.App" を再実行してテキストオブジェクトをもう一度アップロードします。

  4. S3 コンソールにサインインして、新しく作成されたバケット内の新しい対象を表示します。

ファイルを表示した後、オブジェクトを削除し、その後にバケットを削除します。

成功

Maven プロジェクトがエラーなしで構築および実行された場合は、正常に完了しています! Java 2.x 用 SDK を使用して最初の Java アプリケーションを正常に構築しました。

クリーンアップ

このチュートリアルで作成されたリソースをクリーンアップするには、以下を行います。

  • まだ行っていない場合は、S3 コンソールで、アプリケーションの実行時に作成されたオブジェクトとバケットをすべて削除します。

  • プロジェクトフォルダ (getstarted) を削除します。

次のステップ

これで基本を理解したので、次の事項を学習する準備が整いました。