Slide 1

Slide 1 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. © 2022, Amazon Web Services, Inc. or its affiliates. あらためて Java 環境での AWS SDK入門 ポール N A K A N O S H I M A . D E V # 2 8 Amazon Web Services Japan Solutions Architect

Slide 2

Slide 2 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. 自己紹介 ȃȞȑ 4WITTER BULBULPAUL LjȄǤșnjǍǼǛȞǹǟǞȉǷșΛΟɹॅ ǣȐȋȞǝȍșLjȞǓǬǕǮ ;೓օƝűƺ׺ା= +OTLIN*AVA0YTHON3ERVERLESS

Slide 3

Slide 3 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. 本日お話すること/しないこと [お話すること] • AWS SDK for Java の紹介 • v2の機能や特徴 [しないこと] • 細かなAPIの裏側のお話 3

Slide 4

Slide 4 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. アジェンダ • AWS SDK for Javaとは • v1とv2の違い • v2の特徴/機能 • まとめ

Slide 5

Slide 5 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. © 2022, Amazon Web Services, Inc. or its affiliates. AWS SDK for Java 5

Slide 6

Slide 6 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. AWS SDK for Java JavaのアプリケーションでAWSサービスを利用するためのSDK Apache License 2.0のOSS 現在v1, v2それぞれのバージョンを提供中 モバイル(Android)ではAmplify Libraryの利用が推奨 6

Slide 7

Slide 7 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. AWS SDK for Java v1 or v2 ? v1は現在も継続サポート中なので新サービスやAPI追加対応、 セキュリティ対応等も実施中 v2はv1から実装を大幅に書き換えた実装となっている為、一部機能 差や実装方法が異なる点があるのは注意が必要 7

Slide 8

Slide 8 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. v1 と v2 の違い v1 v2 サポート環境 Java 1.7+ Java 8+ 最新バージョン 1.12.x 2.17.x リリースフェーズ GA GA 機能面 一部のハイレベルライブラリ等が V1のみで提供 S3 encryption client, DynamoDB document APIs SQS client-side buffering etc… HTTP/2対応 ノンブロッキング I/O 自動ページネーション 起動パフォーマンスの向上 etc… 8

Slide 9

Slide 9 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. AWS SDKのライフサイクルサイクルポリシー 9

Slide 10

Slide 10 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. どちらを使えばよいの? v2で機能が足りているのであれば、v2 イミュータブルな実装や非同期プログラミングへの対応等の 開発者体験としても適している。 仮にどうしてもv1が必要な場合でも共存した形での実装は可能。 10

Slide 11

Slide 11 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. クライアントの作成時の違い // 2.x DynamoDbClient ddbClient = DynamoDbClient.create(); DynamoDbClient ddbClient = DynamoDbClient.builder().build(); // 1.11.x AmazonDynamoDB ddbClient = AmazonDynamoDBClientBuilder.defaultClient(); AmazonDynamoDBClient ddbClient = new AmazonDynamoDBClient(); 11 • v2 はBuilder パターンでの生成する方式に変更 • イミュータブルに実装が可能に

Slide 12

Slide 12 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. その他細かな違いの例 • 認証情報プロバイダークラスの変更 • リージョンのクラス名の変更 • パッケージ変更 • 環境変数名の変更 • 例外クラス名の変更 • etc… 12

Slide 13

Slide 13 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. © 2022, Amazon Web Services, Inc. or its affiliates. v2 の特徴/機能 13

Slide 14

Slide 14 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. v2 特徴的な機能 • 非同期クライアント • HTTP/2対応 • Smart Configuration Defaults • 自動ページネーション • クライアントメトリクス • GraalVM Native Image サポート 14

Slide 15

Slide 15 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. v2 特徴的な機能 • 非同期クライアント • HTTP/2対応 • Smart Configuration Defaults • 自動ページネーション • クライアントメトリクス • GraalVM Native Image サポート 15

Slide 16

Slide 16 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. 非同期クライアント v2 の非同期クライアントは HTTP 層までノンブロッキングになって おり、少数の固定スレッドで同時実行性が高くなります。 非同期クライアントは、応答が使用可能になるまでスレッドを ブロックするのではなく、応答の CompletableFuture を直ちに返し ます。 例外は、クライアントのメソッドコールでスローされるのではなく、 Future を通して処理がされます。 16

Slide 17

Slide 17 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. 非同期/同期クライアント実装例 // 2.x 同期クライアント ProxyConfiguration.Builder proxyConfig = ProxyConfiguration.builder(); ApacheHttpClient.Builder httpClientBuilder = ApacheHttpClient.builder().proxyConfiguration(proxyConfig.build()); ClientOverrideConfiguration.Builder overrideConfig = ClientOverrideConfiguration.builder(); DynamoDbClient client = DynamoDbClient.builder() .httpClientBuilder(httpClientBuilder) .overrideConfiguration(overrideConfig.build()) .build(); // 2.x 非同期クライアント NettyNioAsyncHttpClient.Builder httpClientBuilder = NettyNioAsyncHttpClient.builder(); ClientOverrideConfiguration.Builder overrideConfig = ClientOverrideConfiguration.builder(); ClientAsyncConfiguration.Builder asyncConfig = ClientAsyncConfiguration.builder(); DynamoDbAsyncClient client = DynamoDbAsyncClient.builder() .httpClientBuilder(httpClientBuilder) .overrideConfiguration(overrideConfig.build()) .asyncConfiguration(asyncConfig.build()) .build(); 17

Slide 18

Slide 18 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. 非同期プログラミング例 CompletableFuture response = client.listTables(ListTablesRequest.builder() .build()); CompletableFuture> tableNames = response.thenApply(ListTablesResponse::tableNames); tableNames.whenComplete((tables, err) -> { try { if (tables != null) { tables.forEach(System.out::println); } else { // Handle error err.printStackTrace(); } } finally { // Lets the application shut down. Only close the client when you are completely done with it. client.close(); } }); tableNames.join(); 18 Future完了時に行われる処理 テーブル一覧の非同期取得

Slide 19

Slide 19 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. スレッドプールを使った非同期プログラミング例 S3AsyncClient clientThread = S3AsyncClient.builder() .asyncConfiguration( b -> b.advancedOption(SdkAdvancedAsyncClientOption .FUTURE_COMPLETION_EXECUTOR, Executors.newFixedThreadPool(10) ) ) .build(); // ThreadPoolExecutorを使った最適化 ThreadPoolExecutor executor = new ThreadPoolExecutor(50, 50, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10_000), new ThreadFactoryBuilder() .threadNamePrefix("sdk-async-response") .build()); executor.allowCoreThreadTimeOut(true); // ThreadPoolExecutorを使った最適化 S3AsyncClient clientThread = S3AsyncClient.builder() .asyncConfiguration( b -> b.advancedOption(SdkAdvancedAsyncClientOption .FUTURE_COMPLETION_EXECUTOR, executor ) ).build(); 19

Slide 20

Slide 20 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. v2 特徴的な機能 • 非同期クライアント • HTTP/2対応 • Smart Configuration Defaults • 自動ページネーション • クライアントメトリクス • GraalVM Native Image サポート 20

Slide 21

Slide 21 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. HTTP/2対応 • HTTP/2対応のClientを提供 • 使用中のサービスでサポートされている場合、自動的に HTTP/2 が利用される • Kinesis Data Streams や TranscribeではHTTP/2 の Event Streaming に対応した実装が可能 21 https://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/examples-kinesis-stream.html

Slide 22

Slide 22 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. v2 特徴的な機能 • 非同期クライアント • HTTP/2対応 • Smart Configuration Defaults • 自動ページネーション • クライアントメトリクス • GraalVM Native Image サポート 22

Slide 23

Slide 23 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. Smart Configuration Defaults 一般的なSDKの使用パターンに合わせて事前定義された SDKのデフォルト値のセットが利用可能 23 mode 特徴 legacy SDK によって異なり、defaults前に存在していたデフォルト設定を利用する standard ほとんどのシナリオで安全に実行できるデフォルト値 in-region standard モードに基づいて構築され、リージョン内のアプリケーションに合わ せてカスタマイズした最適化が行われている cross-region standardモードに基づいて構築され、クロスリージョンのリクエストをするア プリケーションに合わせてカスタマイズした最適化が行われている mobile standard モードに基づいて構築され、モバイルアプリケーション向けにさらに 最適化が行われている auto SDKがランタイム環境を検出して、適切な設定を自動的に決定しようとします。

Slide 24

Slide 24 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. v2 特徴的な機能 • 非同期クライアント • HTTP/2対応 • Smart Configuration Defaults • 自動ページネーション • クライアントメトリクス • GraalVM Native Image サポート 24

Slide 25

Slide 25 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. 自動ページネーション 多くの AWS API は結果を複数の「ページ」のレスポンスで分割しま す。(e.g. S3のオブジェクト一覧等) v1 では、レスポンスの各ページにアクセスするために、複数の手動 リクエストを行う必要がありました。 v2 では、これを SDK が自動的に処理します。 25

Slide 26

Slide 26 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. 自動ページネーション実装の違い // 2.x ページネーション DynamoDbClient client = DynamoDbClient.create(); client.listTablesPaginator() .tableNames() .forEach(System.out::println); // 1.11.x ページネーション AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient(); ListTablesRequest request = new ListTablesRequest(); ListTablesResult result; do { result = client.listTables(request); result.getTableNames() .forEach(System.out::println); request.setExclusiveStartTableName(result.getLastEvaluatedTableName()); } while (request.getExclusiveStartTableName() != null); 26

Slide 27

Slide 27 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. v2 特徴的な機能 • 非同期クライアント • HTTP/2対応 • Smart Configuration Defaults • 自動ページネーション • クライアントメトリクス • GraalVM Native Image サポート 27

Slide 28

Slide 28 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. クライアントメトリクス SDK使用時のパフォーマンスメトリクスを収集することが可能。 [メトリクス例] • API呼び出しの成功/失敗 • API呼び出しの再試行回数 • API呼び出し時間(全体、認証情報の取得、マーシャリング) • Backoff時間 28

Slide 29

Slide 29 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. クライアントメトリクスの利用 CloudWatchへの送信する場合は 1. cloudwatch-metric-publisher のライブラリをdependencyへ追加 2. クライアント作成時にメトリクスのパブリッシャーを設定する 29 // Publisherの作成 CloudWatchMetricPublisher cloudWatchMetricPublisher = CloudWatchMetricPublisher.create(); S3Client s3 = S3Client.builder() .overrideConfiguration( o -> o.addMetricPublisher(cloudWatchMetricPublisher) ) .build(); ※メトリクスを他のシステムへ送信したい場合はMetricPublisherを継承したカスタムPublisher の実装が必要

Slide 30

Slide 30 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. v2 特徴的な機能 • 非同期クライアント • HTTP/2対応 • Smart Configuration Defaults • 自動ページネーション • クライアントメトリクス • GraalVM Native Image サポート 30

Slide 31

Slide 31 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. GraalVM Native Image サポート GraalVM Native Imageへの対応を利用して実行可能なバイナリファ イルの作成が可能 そうすることで、起動時間の高速化やメモリ使用量の削減をする 例えばLambdaやコンテナ環境(ECS/EKS等)での起動の高速化や リソース利用の効率化を行うことが可能 31

Slide 32

Slide 32 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. アプリ起動 + S3へGetObjectRequest 実行時間 32

Slide 33

Slide 33 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. アプリ起動 + S3へGetObjectRequest実行でのメモリ使用量 33

Slide 34

Slide 34 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. GraalVM + Lambdaにご興味ある方は builders.flashにChatworkさま寄稿の記事も参考になりますので 是非こちらのブログもご確認ください 34 https://aws.amazon.com/jp/builders-flash/202110/jvm-lambda-function/

Slide 35

Slide 35 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. v2 特徴的な機能 • 非同期クライアント • HTTP/2対応 • Smart Configuration Defaults • 自動ページネーション • クライアントメトリクス • GraalVM Native Image サポート • etc.. 35 v2の機能を知ることで 適切な実装、効果的な実装を 進めていきましょう !

Slide 36

Slide 36 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. © 2022, Amazon Web Services, Inc. or its affiliates. JVMでは他にも… 36

Slide 37

Slide 37 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. AWS SDK for Kotlin (Developer preview) Kotlin 向けの SDK が開発者プレビューとして公開 Apache Licence 2.0 のOSS として Github で公開中 Kotlin ならではの Coroutine サポートや DSL を使った記述が可能 Java 8 以降の環境をサポート 37

Slide 38

Slide 38 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. コードサンプル val client = DynamoDbClient { region = "us-east-2" } val resp = client.listTables { limit = 10 } suspend fun downloadAllS3Objects(bucketName: String) { val s3 = S3Client.fromEnvironment() val listReq = ListObjectsV2Request { bucket = bucketName } s3.listObjectsV2Paginated(listReq) .flatMapConcat { it.contents?.asFlow() ?: flowOf() } .filter { it.size > 0 } .collect { obj -> val getReq = GetObjectRequest { bucket = bucketName key = obj.key } s3.getObject(getReq) { val path = Paths.get(System.getProperty("java.io.tmpdir"), obj.key) path.parent.createDirectories() it.body?.writeToFile(path) } } } 38 Coroutine での suspend 関数 Kotlin DSLでの記述 Kotlin での型定義/型推論への対応 ※GA時とは異なる可能性があります

Slide 39

Slide 39 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. まとめ • AWS SDK for Javaはv1, v2が提供中 • 特に理由がなければv2の利用が推奨 • v2特有の機能や追加されており、実装方式や開発者体験が向上し ている • 非同期プログラミング、ページネーション、HTTP/2、 クライアントメトリクス、GraalVM Native Image • AWS SDK for Kotlin もDeveloper Previewで公開中 39

Slide 40

Slide 40 text

NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon Web Services, Inc. or its affiliates. Thank you! © 2022, Amazon Web Services, Inc. or its affiliates. ポール @bulbulpaul