こんにちは、ice_soiです!
フリーランスエンジニアをしています。
以前、前日の天気情報を見ることができるWEBアプリ「きのうのてんき」をリリースしていました。
当時はVPSに環境を作ったのですが、いろいろあって今回はクラウドサービスに移行することにしました。
備忘もかねて、今回はVPS上で稼働していたWEBアプリケーションをRender + Railway + PlanetScaleというクラウドサービスに移行したかを残していこうと思います!
「きのうのてんき」について
「きのうのてんき」は地域を選択して前日の天気情報を見ることができるWEBアプリです。
例えば今日の服を考えるときに、昨日の天気なんだっけ・・・?といった時に情報を参考にできるように作りました。
天気情報は気象庁で発表している情報を利用しています。
VPSで動かしていて、Laravel9で画面はbladeの構成です。DBはMySQLでした。
移行した理由
今回移行したのは以下の理由でした。
- VPSの管理コストが意外とかかる
conohaのVPSを使っていましたが毎月1000円くらいかかっていました。
時間が経つにつれ結構な金額になってきたのでランニングコストのかからない方法にしようと思いました。 - 構成を変えたかった
「きのうのてんき」はfrontもbackendもLaravelだけで作っていて、画面はjQueryなどで制御するといった作り方をしていました。
機会があればfrontとbackendは分けたかったので、frontがNext.js + TypeScriptでbackendがLaravelという構成にしました。 - いろいろなクラウドサービスを使ってみたかった
これは単純に使ってみたかったというのがありました。笑
ちょうどいい機会なので使ってみようと思いました。
クラウドサービスの選定
クラウドサービスといってもいろいろあります。今回は下記の条件で考えました。
- Laravelが使える
- Gitと連携できる
- RDBが使える
下記の記事を参考に条件を満たしてよさそうなサービスをさがしました。https://zenn.dev/imah/articles/a41e889dbf54da
最初に考えたのはrenderに今のLaravelの環境をそのまま移植するといったものでした。
DBはPostgreSQLですが使えますしLaravelも動くので、VPSを止めれればコストはかからなくなることもあり、移行をしようと思いました。が・・・
デプロイする時にはrender用のdockerfileを使う必要がありました。
アプリはDockerコンテナを使って開発しており、立ち上げにはdocker-composerを使って起動していました。
いろいろ調べましたがdocker-composerでデプロイする方法がわからず、プロジェクトを作り直す必要がありました。
また、PostgreSQLの無料期間が90日だったのとDBの接続切替が大変だったので、この方法はあきらめることにしました・・・。
他にも候補にはRailwayがありましたが、こちらも同じくプロジェクト構成から作り直す必要がありました。
いろいろ考えましたが結局プロジェクトを作り直すなら、frontとbackendを分けてしまおうと思いました。LaravelをAPI化して画面はbladeなので、VueかReactで構成する。DBも別に切り出してしまうといった方針にしました。
その結果、下記の構成にすることにしました。
- front
Render - backend
Railway - DB
PlanetScale
frontは新しく作るので、Next.js + TypeScriptで構成して既存の画面を移植しました。
backendはそのままLaravelでAPIとして新しく構成しました。
DBのテーブルレイアウトはそのままいけそうだったのでそのまま移植することにしました。
元のソースはありましたが、プロジェクト作り直しだったのでまあまあ大変でした・・・
移行作業
プロジェクトを作り直して、それぞれのクラウドサービスにデプロイできる準備ができたら実際の移行作業です。
DBの接続があるので最初にPlanetScaleを設定しました。
あとは、backendのDBの向き先をPlanetScaleにしてGitにそれぞれpushします。
renderとRailwayそれぞれGitのリポジトリを指定してあげれば勝手にデプロイがされます。
自動でデプロイされるのはすごく楽ですね!
デプロイに成功したらちゃんと開くかどうか確認して・・・
ちゃんと動きました!
これで移行完了です!と言いたいのですが、
まだやらないといけないことがありました・・・
「きのうのてんき」は毎日気象庁の天気情報を取得してきます。
取得するためには定時取得処理を走らせないといけません。
いままではcronで取得処理を叩いていましたがRailwayではcronの設定ができず、renderではお金がかかるようでした。
いろいろ考えた結果、定時取得処理をAPIにしてAWSのLambdaでAPIを呼び出すようにしました。
そして、LambdaをAmazonEventBridgeのスケジューラで決まった時間に動かすことで解決しました。
これで、移行完了です!
まとめ
今回はVPS環境で動いていたWEBアプリをRender + Railway + PlanetScaleでWEBアプリを動かしてみました。
アプリを移行してみて、今のところコストもかからず動きも特に問題はなさそうです。また、インフラ周りとデプロイが楽になったので保守が非常に楽になりました。
しばらくはこの構成で行こうかなと思っていますが、サービスは今は無料ですがherokuのように無料プランがなくなる可能性もあるので、またどこかで移行する必要が出てくるかもしれないです。
そのときはまた備忘として記事にしようと思っています。
最後までお読みいただきありがとうございました。
追記
Railway
2023/8/1から無料のプランがなくなるようです・・・。