Kotlinは、Javaが少しずつ取り入れているものの完全には後付けできないモダンな言語機能を、最初から備えて設計されています。たとえば次のような機能です。
- 型推論
- ラムダ式
- パターンマッチング
- 非メソッド関数
- Null安全
- スマートキャスト
- …そのほか多数。
KotlinはJavaと容易に相互運用でき、豊富なライブラリ資産を最小限の移行コストで活用できます。
KotlinはAndroidの公式言語として知られていますが、汎用言語でもあります。Javaの経験がある私としては、Kotlinをクラウド上で——もちろんDockerコンテナで——使ってみたくなり、実際に試してみることにしました。
Javaの依存関係管理やビルドにはMavenのほうが慣れていますが、KotlinアプリのビルドではMavenよりもGradleがやや好まれているため、今回はGradleも併せて学んでみました。
その手順を以下にご紹介します。

コトリン島に浮かぶ雲
手順
- Dockerをインストールします。
- Gradleをインストールします。OSのパッケージマネージャーが便利です。Macなら
brew installで済みます。 - ここから先は、私のシンプルなプロジェクトをそのままコピーして使っていただいてかまいません。あるいは以下の手順に沿って進めてください。
- Gradle/Kotlinプロジェクトをセットアップします。Kotlin側のこのガイドと、Gradle側のこちらのガイドが参考になります。両者を組み合わせ、新規アプリをできるだけ簡単に立ち上げる方法をまとめます。
- ディレクトリを作成して移動します。例:
mkdir multicloud_pubsub && cd multicloud_pubsub。 gradle initを実行し、対話メニューで次のように入力します。2(application)、4(Kotlin)、1(no: アプリケーションプロジェクトは1つのみ)、1(ビルドスクリプトはGroovy)、続いてプロジェクト名とサンプルソースパッケージ名はデフォルトのままEnter、Enter。gradle runと入力すれば、見事な「Hello World!」が表示されます。- 独自のコードを追加する際は、GitHub上のこちらにあるサンプルプロジェクトを参考にしてください。これは、クラウドの不安定さに耐えられるよう、最大限の疎結合と堅牢性を狙って設計した非同期アプリの一部です。これについては近日中に別記事で取り上げる予定です。
- コードは
src/main/kotlin配下のパッケージ単位のサブディレクトリに配置し、src/main/kotlinとsrc/test/kotlinにあるサンプルコードは削除します。 build.gradleのサンプルguavaを削除し、必要な依存関係を追加します。記述するのはMavenと同じartifact識別子ですが、より読みやすい構文になっています。
compile 'com.google.cloud:google-cloud-pubsub:1.42.0'
compile 'com.google.cloud:google-cloud-storage:1.42.0'
compile 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
build.gradleのmainClassを編集します。今回は'com.doitintl.mulicloud.ProcessorKt'です。ファイル名末尾のKtサフィックスに注目してください。これはmain関数にアクセスするための合成クラスを示しています。build.gradleの末尾に以下を追加します。これにより、java -jar app.jarで実行できるオールインワンのjarファイルが生成されます。
jar {
manifest { attributes 'Main-Class': mainClass }
from { configurations.implementation.collect {
it.isDirectory() ? it : zipTree(it) } }
}
gradle clean runで動作を確認します。- いよいよクラウドへ。こちらの
Dockerfileをディレクトリに配置します。 - ビルド時には専用のGradleイメージを使うことで、ランタイムには軽量でクリーンなイメージを採用できる点に注目してください。
- ランタイムにはOpenJDKのJavaイメージを使用しています。Kotlinの標準ランタイムライブラリはアプリと一緒にビルドされるため、Kotlin専用のイメージは不要です。
- イメージをビルドします。末尾のドット(ビルドディレクトリの指定)を忘れずに。
docker build -t pubsubapp .
続いて実行します。
docker run pubsubapp
これで完了です。Dockerイメージは見事に自己完結しているので、他の技術スタックで培った知識はKotlinとGradleで構築したアプリにもそのまま通用します。あとは通例どおり、サービスアカウントの作成やロールの付与といった作業が残りますが、そのためのスクリプトも用意してあります(READMEをご覧ください)。