KotlinでAWSを痛苦なく書く方法:Javaレガシーからの解放
KotlinでAWS向けに開発したことがある開発者は、おそらくJava SDK v2を覚えているだろう。Kotlinプロジェクトでの使用は可能だが、CompletableFutureをコルーチンでラップ постоянно и долго、Javaの長いbuilder構文に我慢し、余計な依存関係をビルドにドラッグすることになる。AWSチームはこれを公式プロジェクトaws-sdk-kotlinで解決した — Kotlin向けにゼロから書かれたクライアントだ。
ネイティブKotlin SDKで何が変わるか
このライブラリの主な利点は、ネイティブコルーチンサポートとKotlin Flowだ。コールバックのスパゲッティ性やasyncラッパーは不要。S3、DynamoDB、Lambdaへの呼び出しは、Kotlinの他の非同期コードと同じ方法で書ける。
2番目の重要な点は、マルチプラットフォームのためのアーキテクチャ基盤だ。このライブラリはKotlinマルチプラットフォームをターゲットとし、複数のターゲットプラットフォームでそのまま動作する:
- JVM — KtorやSpringでのクラシックバックエンド用
- Android — モバイルアプリケーション用
- GraalVM Native Image — コンパイル済みバイナリの高速起動用
Smithyによるコード生成とターゲットビルド
AWSには数百ものサービスがある。すべてのサービスのクライアントを単一のライブラリにコンパイルしてパッケージすると、最終成果物のサイズが馬鹿馬鹿しいほど大きくなる。SDK авторы решили эту проблему через генерацию кода на основе декларативного языка Smithy.
リポジトリにはすべてのAWSサービスの事前生成コードは含まれていない。コードはプロジェクトビルド時に生成される。SDKをソースから自分でビルドする場合、アプリケーションで実際に必要なサービスのみを指定できる。
設定のフィルタリングはファイルlocal.propertiesで行われる:
ビルドから特定のサービスを削除する必要がある場合は、マイナス記号を使用する:
コード生成はGradleを通じてトリガーされる:
その後、生成されたモジュールは標準タスクでビルドされる:
このアプローチにより、個々のSDKモジュールのローカル開発とテストの時間が節約される。
Dokkaによるドキュメントビルド
コードのドキュメント化には、Dokka — KDoc形式に対応するJetBrainsの標準ツールが使用されている。
APIリファレンスをローカルで生成するために、リポジトリは以下のコマンドを提供している:
完成したHTMLドキュメントはディレクトリbuild/dokka/htmlMultiModuleに出力される。ブラウザで開くには、IntelliJ IDEAに組み込まれたものなど、シンプルなHTTPサーバーなら何でもよい:
Kotlin SDKへの移行は值得か
リポジトリにはGitHubで約500個のスターがある。この数字は比較的少ないが、プロジェクトが長い間アクティブ開発ステータスにあったことと、多くのチームが慣れたJava SDK v2を使用しているからだ。それでも、このライブラリはすでに本番対応であり、Amazonによって正式にサポートされている。
このライブラリは以下の4つのシナリオで役立つ:
- 重いJava依存関係をドラッグせずにAWSサービスへの直接アクセスが必要なAndroidアプリを作成している場合。
- コールドスタート速度が重要なGraalVM Native Imageコンパイルを伴うAWS Lambda用のKotlinサーバーレス関数を書いている場合。
- バックエンド全体がコルーチンとKtorで構築されており、一貫した非同期コードスタイルを維持したい場合。
- モバイルとサーバーのロジックを組み合わせたマルチプラットフォームモジュールを作成している場合。
古いJava SDKを使用したSpring Bootの大型レガシープロジェクトが既に存在する場合、急いで書き換える意味はない。しかし、Kotlinでの新しいサービスやアプリケーションには、このSDKが論理的な選択に見える。
関連プロジェクト