fly.ioへspring bootアプリケーションをデプロイする
javaspringspring bootfly.iobuildpacks
… ⏲ Reading Time: 1 Minute, 9 Seconds
2023-12-06T00:00:00+0000
はじめに
Qiitaのアドベントカレンダーをいつも見ていて、いつか参加してみたいと思ってました。 はじめてのアドベントカレンダーという企画があることを知ったので、今回始めて参加してみようと思います。
何がしたかったのか?
子供のために、復習用の計算プリントをランダム生成するアプリケーションを作ってみた。
これはspring bootで作成した画面を持つWebサービスですが、なんとか無料で子供のタブレットから使えないかと、良い感じに転がす場所を探した結果 fly.io
というサービスを見つけた。
デプロイまでに少しハマったので、この手順を記述した。
fly.ioとは
herokuとかと同様にPaaS環境を提供してくれるサービスの一つで、herokuの無料利用分がなくなってしまったため、移行先として上がるサービスの一つ(らしい)。
このfly.ioは、herokuと同様にコンテナを起動することでアプリケーションを動作させるため、どんな言語のアプリケーションでも、最終的にはコンテナの中で動作する仕組みとなる。
公式ドキュメントでも触れられている通り、 Dockerfile によるデプロイが一番プレーンはデプロイ方法となり、標準で対応している言語はソースの自動判定により起動イメージを選択される。
実は、fly.ioではこの自動判定に含まれないJava(Spring Boot)でのイメージデプロイをpaketo buildpacksを利用してワンタッチで行えるため、この手順を試してみる。
まずは、ソースを用意する
プログラムは、 maine-coonというものを用意した。
これをクローンして試してみると良い。
ローカルで起動して、適切に動作するところまで実装をした。
> ./mvnw spring-boot:run
-> http://localhost:8080/
出来上がったらflyコマンドをインストール
fly.ioはローカルからコマンドでコントロールすることができる。
このコマンドは2種類存在しており、 fly
と flyctl
が存在する。
どう使い分けるのか、正直良くわからない(ぇ
> curl -L https://fly.io/install.sh | sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1735 0 1735 0 0 4131 0 --:--:-- --:--:-- --:--:-- 4140
######################################################################## 100.0%
set update channel to shell
flyctl was installed successfully to /home/vscode/.fly/bin/flyctl
Manually add the directory to your $HOME/.bash_profile (or similar)
export FLYCTL_INSTALL="/home/vscode/.fly"
export PATH="$FLYCTL_INSTALL/bin:$PATH"
Run '/home/vscode/.fly/bin/flyctl --help' to get started
fly.ioにログイン
事前にfly.ioでサインアップをしておく必要がある。
[!NOTE]
更に、これを試したとき(2023/12/03時点)では、無料利用においてもクレジットカード登録が必要な様子。
この上で、flyコマンドからログインを行う。
> fly auth login
failed opening browser. Copy the url (https://fly.io/app/auth/cli/XXXXXXXXXXXXXXXXXXX) into a browser and continue
Opening https://fly.io/app/auth/cli/XXXXXXXXXXXXXXXXXXX ...
Waiting for session...⣾
上記状況になった後、表示されたURLからブラウザでログインを行うと、コマンドのログインも完了する。
> fly auth login
failed opening browser. Copy the url (https://fly.io/app/auth/cli/XXXXXXXXXXXXXXXXXXX) into a browser and continue
Opening https://fly.io/app/auth/cli/XXXXXXXXXXXXXXXXXXX ...
Waiting for session... Done
successfully logged in as {{login user}}
アプリケーションの構築
まずは、fly.ioの自分の領域にアプリケーションのデプロイを行う場所を作成する。
> flyctl launch
以降、対話形式で諸々聞かれるため、必要に応じて設定する。
このやり取りが成功すると、カレントディレクトリに fly.toml
が作成される。
[!NOTE]
このfly.toml
が、デプロイを行うためのマニフェストファイルとなる。
ここに指示を記載することで、デプロイ後のセットアップをコントロールすることができる。
fly.tomlの編集
そのままではJavaはデプロイできないため、fly.tomlを編集する。
app = "maine-coon"
primary_region = "nrt"
[build]
builder = "paketobuildpacks/builder-jammy-base:0.4.252"
[build.args]
BPE_APPEND_JAVA_TOOL_OPTIONS = "-XX:ReservedCodeCacheSize=30M -Xss256k"
BPE_BPL_JVM_THREAD_COUNT = "10"
BPE_DELIM_JAVA_TOOL_OPTIONS = " "
BPE_SERVER_TOMCAT_THREADS_MAX = "2"
BP_JVM_VERSION = "21"
今回は、paketo buildpacksを用いて、javaのビルドとイメージ化を行い、ここで作成したイメージを起動することで fly.io 上でアプリケーションを動作させる。
ただし、 fly.io の無料分で利用できるコンテナのリソースは少なく、 256mb のメモリで動作させる必要があるため、調整を入れている。
デプロイ
準備ができたら、実際にデプロイを行う。
> fly deploy
これで、カレントに存在する fly.toml に従ってログインしているアカウントにデプロイが行われる。
:
:
-------
Updating existing machines in 'maine-coon' with rolling strategy
-------
✔ [1/2] Machine 32874dddae6348 [app] update succeeded
✔ [2/2] Machine 9185991c207383 [app] update succeeded
-------
正常に起動が行われた場合、デフォルトで2コンテナが起動し、自動で割り当てられたURLでルーティングが行われる。
この先
これで、とりあえず動作することはできるようになったが、ソースの編集をしたあとにデプロイするまでのコマンドを打つのが面倒なため、CIを用意してデプロイを行った。
こちらについても別途記載をしたい。