fly.ioへspring bootアプリケーションをデプロイする


はじめに

Qiitaのアドベントカレンダーをいつも見ていて、いつか参加してみたいと思ってました。 はじめてのアドベントカレンダーという企画があることを知ったので、今回始めて参加してみようと思います。

何がしたかったのか?

子供のために、復習用の計算プリントをランダム生成するアプリケーションを作ってみた。
これはspring bootで作成した画面を持つWebサービスですが、なんとか無料で子供のタブレットから使えないかと、良い感じに転がす場所を探した結果 fly.io というサービスを見つけた。
デプロイまでに少しハマったので、この手順を記述した。

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コマンドをインストール

flyctlのインストール

fly.ioはローカルからコマンドでコントロールすることができる。

このコマンドは2種類存在しており、 flyflyctl が存在する。

どう使い分けるのか、正直良くわからない(ぇ

> 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を用意してデプロイを行った。

こちらについても別途記載をしたい。