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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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 パターンでの生成する方式に変更
    • イミュータブルに実装が可能に

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  18. 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完了時に行われる処理
    テーブル一覧の非同期取得

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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がランタイム環境を検出して、適切な設定を自動的に決定しようとします。

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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 の実装が必要

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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/

    View Slide

  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の機能を知ることで
    適切な実装、効果的な実装を
    進めていきましょう

    View Slide

  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

    View Slide

  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

    View Slide

  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時とは異なる可能性があります

    View Slide

  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

    View Slide

  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

    View Slide