この記事はMakuake Advent Calendar 2022の13日目の記事として登録していますが、書いているのは12/30です・・・!!
今年はニュース盛りだくさんのHerokuさん、自分は2013年から利用していたみたいです👀
業務で利用することはなかったですが、最小規模で使う分には無償で利用できるという、おもちゃみたいなサービスを作って遊ぶにはとても都合のいいサービスでした。
御存知の通りHeroku(のDyno, Redis, PostgreSQL)の無償プランというのは2022/11/28をもってなくなってしまいました。
(無償利用できるアドオンが全くなくなったわけではないです。これはありがたい・・・)
それに伴って、色んな人が「できるだけ低コストを維持できるようにHerokuから引っ越したい」というムーブメントがありましたね!
もちろん自分にも影響があるので、もう触らないだろうなと思われるようなものからシャットダウンしていきました。
最終的に20個くらいの過去の遺物を消し去り、2個だけ残りました。
話はちょっと飛びますが、自分は今「神山まるごと高専の先輩」というのもやらせてもらってます。
※来春開校が決まった「神山まるごと高専」を応援している人のうち、「Makuakeで特定のリターンを応援購入した人」のことを「先輩」と呼んでいます。
その「先輩」の活動の一環として、「色んな人が先輩になってるので、プロフィールを集めたサイトを作りましょう」というのの開発を担当させてもらっていて、前述のHeroku上に2個のこったサービスのうちの一つがそれです。
もう一つは、このサービスの中で使うように作った「OGPをいい感じに返してくれるAPI」です。
さて、前置きが長くなりましたが、今回取り扱う「小規模サービス」とは、この「OGPをいい感じに返してくれるAPI」になります。
Herokuからの乗り換え先は色んな人がいろんな観点で述べられてますが、今回CloudRunへの乗り換えを決めた理由は以下のとおりです。
- ゆるめの集まりのためのふんわりサービスなので、高トラフィックを予定してない
- 宣伝とかもしないし
- ゆるめの集まりのためのふんわりサービスなので、パフォーマンス(レスポンススピード)要求が低い
- コールドスタートOK
- ↑の感じなら 無料枠で耐えられそう
GCPは無料枠の設定が多くて助かる・・・
なお、10月頃に同じような用途の小規模サービスをWebに置きたくて、でもHerokuは無償化やめるってわかってるし・・・ということで、同じ理由でCloudRunを触ってはいました・・・!
いろいろ説明するためにリポジトリをpublicにしました!
https://github.com/yu0819ki/ogp-tools
Redisでキャッシュして外部サイトへのリクエストを減らす機能もつけたので、アプリケーションとRedisの2コンテナが動くように Docker Compose
を利用しています。
https://github.com/yu0819ki/ogp-tools/blob/main/docker-compose.yml
また、ソースコード変更の追従は nodemon
を使ってます。
https://github.com/yu0819ki/ogp-tools/blob/main/dev-startup.sh
Heroku上では、コンテナで稼働してる意味合いも薄かったので、 npm start
で起動するようにしています。
https://github.com/yu0819ki/ogp-tools/blob/main/Procfile
Redisは Heroku Data for Redis
のminiプラン。
最小構成 $3/month なので実はめちゃくちゃ安く利用開始できるんですよね。。。
AWSやGCPの最小構成は思ったより高かったです(高かったことしか覚えてないw)
一応、まだサービス停止してないのでHeroku版のURL載せておきます。
https://ogp-tools.herokuapp.com/parse?url=https://yahoo.co.jp
今回の対応用の差分は以下になります。
https://github.com/yu0819ki/ogp-tools/compare/d9c24972fb...2826e8a547
やったのは
- DockerイメージをCloudRunで使えるようにするために、ArtifactRegistoryにPushするActionを追加
- 起動時にRedisにつなぎに行ってたので勝手に繋がないようにした
くらいのものです。
あとなんかこっそり動かなくなってたとこ直したり。
Herokuの項にも書きましたが、Redis使おうとすると結構高いので、アプリケーションでキャッシュするんじゃなくてCDNでキャッシュさせようかなと思い、Redisに繋がなくていいようにしました。
なのでキャッシュ機構ができるまでCloudRun版のURLは非公開にしておきます・・・😇
コード上の作業量は上述のGit差分のとおり、大したことなかったんですが、それでもハマるときはハマるという。。。
選定理由の最後の方に書いた
10月頃に同じような用途の小規模サービスをWebに置きたくて
のやつでもArtifactRegistoryにPushするGithubActionを書いていたので、ワークフローのymlをコピペしてきて、 ところどころ ogp-tools
に書き換えました。
横展系の作業でよくやるやつだと思うんですが、これをやったら権限がないって怒られたんですよね・・・
IAMとか一通りみたし、強権持ったロールをサービスアカウントに紐付けてみたりしても駄目で、ここで数時間吹っ飛びました😇
最終的なymlを見てもらったらわかるんですけど、 プロジェクトIDって重複してたら自動で採番したサフィックスがつく んですね・・・!!!
他所の人のプロジェクトIDを見てたのでそりゃ権限ないですね。。。
Terraform使ってればこんなことも起きなかっただろうに、サボったせいで数時間飛んだのでやっぱりIaCは正義✨
個人的な好みの話で、今回も koa を使ってるんですが、最初はミドルウェアのところでキャッシュ機構を読み込まないようにしたらいいのかなと思ったんですね。
if (キャッシュします) {
app.use(***)
}
↑こういう感じ。
でも この差分 の通り、元のコードだと require
した時点Redis繋ぎに行っちゃってたので、これも気づくのちょっと遅れました。
単純にコーディング能力がアレ。
そんな感じで、振り返るとやったことは多くないのに、思ったより時間がかかった、という結果になりました。
キャッシュ機構のところは宿題になっているし・・・
こうやってやってみると 某skebさんの即日乗り換え は普段からDocker使ってて〜〜とかどころじゃなくて、普段からAWSなりGCPなりを触って鍛錬している人がいたんだろうなぁ、と思いますね。
シンプルにすごいしえらい。
あ、日付変わった。