Upgrade to Pro — share decks privately, control downloads, hide ads and more …

あらためて、AWS SDK for Java 入門

あらためて、AWS SDK for Java 入門

nakanoshima.dev #28 で発表したAWS SDK for Javaに関する発表資料
https://nakanoshima-dev.connpass.com/event/252909/

BulBulPaul

July 27, 2022
Tweet

More Decks by BulBulPaul

Other Decks in Technology

Transcript

  1. 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
  2. NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon

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

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

    Web Services, Inc. or its affiliates. アジェンダ • AWS SDK for Javaとは • v1とv2の違い • v2の特徴/機能 • まとめ
  5. 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
  6. 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
  7. 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
  8. 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
  9. NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon

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

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

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

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

    Web Services, Inc. or its affiliates. 非同期プログラミング例 CompletableFuture<ListTablesResponse> response = client.listTables(ListTablesRequest.builder() .build()); CompletableFuture<List<String>> 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完了時に行われる処理 テーブル一覧の非同期取得
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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がランタイム環境を検出して、適切な設定を自動的に決定しようとします。
  24. 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
  25. NAKANOSHIMA.DEV #28 – AWS SDK FOR JAVA © 2022, Amazon

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

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

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

    Web Services, Inc. or its affiliates. アプリ起動 + S3へGetObjectRequest実行でのメモリ使用量 33
  34. 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/
  35. 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の機能を知ることで 適切な実装、効果的な実装を 進めていきましょう !
  36. 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
  37. 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
  38. 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時とは異なる可能性があります
  39. 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
  40. 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