JetBrains × Amazon Elastic Beanstalk でKotlinアプリをデプロイしてみた
これは「AIエージェント機能で進化したJetBrainsの開発体験をシェアしよう by JetBrains AdventCalendar 2025」の13日目の投稿です。
大学2年生のSuisanです。
寡聞にして、JetBrains社がKotlinの開発元であることを知りませんでした。
- 新しいIDE使ってみよ〜
- 今度インターンでKotlinやりそうだし、せっかくだから触っておくか
- ちょうどアドカレやってるし、JetBrainsにしよう
という奇跡の思考の連鎖により、今回の記事・アプリ開発が生まれています。
IntelliJ IDEAをダウンロードする
まずはJetBrainsの代表的なIDEであるIntelliJIDEAを導入しました。
やったことはシンプルです。
- JetBrainsの公式サイトからIntelliJ IDEAをダウンロード
- インストーラに従ってインストール
- 学生ライセンスを申請して有効化
学生ライセンスのおかげで、遠慮なくUltimateを触れたのはかなり大きかったです。
なぜKotlinアプリを作ったのか
もうすぐインターンで使いそうだから、簡単に予習しておこうと思いました。
アプリの概要
今回作ったのは「時給×タイマー」をベースにした、給料可視化アプリです。
リンクを踏んで実際にアプリを使うことができます。
イメージとしてはこんな感じです。
まあカスの家計簿みたいな感じですね。
- 時給を入力する
- タイマー開始ボタンを押す
- 秒単位で「いま何円稼いでいるか」がリアルタイムで増えていく
- 勤務ごとの「開始時刻・終了時刻・金額」を記録する
- カレンダーで「何日にいくら稼いだか」をざっくり振り返れる
技術的には、バックエンドはKtor、フロントはシンプルなWeb UIの想定で作っています。
今回はまず「JetBrainsの開発体験を味わうこと、とにかくKotlinで動くものを作ること」を主目的にしました。
仕様書駆動開発×JetBrainsのAIエージェント
私は普段から、まず仕様書をきちんと書いてから実装に入る「仕様書駆動開発」を好んでいます。
今回も最初に仕様をある程度文章化してから手を動かしました。
- ChatGPTに仕様書を書かせる
- その仕様書をJetBrainsのAIエージェント(Junie)に渡す
Junie 側には、ざっくりこんな感じで指示を投げました。
本当に大したことないので詳細は割愛しますが、
- この仕様書に沿ってKotlin+Ktorでバックエンドを組んでほしい
- 必要に応じて設計の補足やエンドポイントの提案をしてほしい
- 私が読んで理解できるレベルでコメントや説明も添えてほしい
最初にChatGPTを介しているのは、JetBrainsのAIエージェントのクレジットを無駄に消費しないためです。
IntelliJ IDEAの開発体験メモ
良かった点をまとめていきます。
① GitまわりのUIがかなり快適
これ、Cursorより格段にいいなと思った点です。
コマンド操作が苦手な人間には非常にありがたいです。
プルリクめっちゃ見やすくて感激
コミット・プッシュもかなり有機的
② JetBrains Toolboxで複数プロジェクトをいい感じに管理できる
途中でJetBrains Toolboxの存在に気づきました。
- 別のプロジェクト
- 今回のKotlin給料タイマー
- その他の試作
これらを、IDEごとに分けつつ管理できるのが非常に助かりました。
いままではCursor一本でリポジトリを切り替えていたので、
「プロジェクト単位できれいにまとまっている」感覚がちょっと新鮮でした。
③ CursorとのUI差をあまり感じなかった
設定を引き継げたこともあり、UI/UX的なギャップはそこまで大きくありませんでした。

- エディタ部分のレイアウト
- タブやファイルツリーの挙動
このあたりで「あまりにも違いすぎてつらい」ということがなかったので、乗り換え・併用のハードルは思ったより低かったです。
デプロイしてみる(Kotlin + Ktor + Elastic Beanstalk)
今回、バックエンドをAWS Elastic Beanstalk(以下EB)にデプロイしました。
Java系はまだそこまで慣れていないのですが、
とりあえず見様見真似でやってみました。
Fat JARを作る(Gradle Shadow Plugin)
KtorアプリをEBで動かすために、まずはFatJAR(依存関係込みのJAR)を作ります。
プロジェクト直下で次を実行します。
./gradlew shadowJar
これで、例えば以下のようなJARが生成されます。
build/libs/xxx-all.jar
この1ファイルを持っていけば、依存を全部含んだ形で起動できます。
main関数とポート指定
Ktor の起動部分はこんなイメージです。
fun main() {
val port = System.getenv("PORT")?.toIntOrNull() ?: 5000
// Database.init() などの初期処理(必要なら)
embeddedServer(Netty, port = port) {
configureSerialization()
configureRouting()
}.start(wait = true)
}
- ローカルではPORTが未設定なので5000で起動
- EB上では環境変数PORTが設定される(5000を想定)
- 結果として、Nginx→127.0.0.1:5000→Ktorの流れになる
ここを適当に8080固定にしていると、
EB側のNginxが5000番に取りにいっても何もいなくて、502 Bad Gateway になる、という罠がありました。
当たり前のことですけどね。
Procfileを用意する
EBに「どう起動すればいいか」を伝えるためにProcfileを作ります。
中身はシンプルです。
web: java -jar app.jar
デプロイ用 ZIP の構成
app.zip
├ app.jar
└ Procfile
プロジェクト直下にて、次のように作りました。
cp build/libs/Kotlin_memo-all.jar app.jar
echo "web: java -jar app.jar" > Procfile
zip app.zip app.jar Procfile
このapp.zipをEBの「アプリケーションコード」としてアップロードします。
環境は以下のような感じで作成しました。
- プラットフォーム:Java(Amazon Correttoベース)
- インスタンスタイプ:t2.micro/t3.microなどの小さいもの
- VPC:デフォルトVPCをそのまま利用
- データベース:今回はなし(アプリ内部のみ)
起動後、EBコンソール上で環境のURLが払い出されます。
つまずきポイントと学び
いちばんハマったのはポートでした。
Nginxは127.0.0.1:5000にプロキシする設定になっている
⇩
しかしアプリが8080にバインドしていた
⇩
結果として、Nginxからは「5000には誰もいない」と見えて502が出される
という状態に陥ったのですが、ログを読んで「ポートの問題ね〜」と気付きました。
問題に気づいてからは、
System.getenv("PORT")で環境変数を読むように修正し、
Fat JARを作り直し、再デプロイして解決しました。
今後の発展の可能性
今回のゴールはあくまで、
- JetBrainsの開発体験を味わう
- Kotlinに触れてみる
- 自作アプリを一度クラウドに出してみる
の3点でした。
とはいえ、アプリ自体ももう少し育てたい気持ちはあります。
- バグの解消
- カレンダーUIを整える
- ログイン機能を足して、ユーザーごとに履歴を分ける
- データ永続化(RDSや別のストレージ)
- Androidアプリとして仕立て直す
時間を見つけて少しずつ進めたいと思っています。
おわりに
今回、JetBrainsのIntelliJ IDEAとAIエージェント(Junie)を使いながら、
Kotlin+Ktorアプリを作り、Elastic Beanstalkへデプロイするところまで進めました。
普段使っている環境とは違うのに、特に大きなストレスを感じることもなくスムーズに開発できたと思います。
Kotlin、JetBrains製IDEともに、触り始めたばかりですが
「とりあえず動くものができて、外からアクセスできるようにな った」のは大きな一歩だと感じています。
ここまで読んでくださり、ありがとうございました。
