Skip to content

Instantly share code, notes, and snippets.

@yu0819ki
Last active December 30, 2022 15:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yu0819ki/4e108be9d41d1f8d026b8e533165e50c to your computer and use it in GitHub Desktop.
Save yu0819ki/4e108be9d41d1f8d026b8e533165e50c to your computer and use it in GitHub Desktop.
小規模サービスをHerokuからCloud Runにお引越しした話

小規模サービスをHerokuからCloud Runにお引越しした話

この記事は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用

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

CloudRun用

今回の対応用の差分は以下になります。
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は正義✨

Redisに繋がないでってお願いしても繋ごうとしてた

個人的な好みの話で、今回も koa を使ってるんですが、最初はミドルウェアのところでキャッシュ機構を読み込まないようにしたらいいのかなと思ったんですね。

if (キャッシュします) {
  app.use(***)
}

↑こういう感じ。

でも この差分 の通り、元のコードだと require した時点Redis繋ぎに行っちゃってたので、これも気づくのちょっと遅れました。
単純にコーディング能力がアレ。

おわりに

そんな感じで、振り返るとやったことは多くないのに、思ったより時間がかかった、という結果になりました。
キャッシュ機構のところは宿題になっているし・・・

こうやってやってみると 某skebさんの即日乗り換え は普段からDocker使ってて〜〜とかどころじゃなくて、普段からAWSなりGCPなりを触って鍛錬している人がいたんだろうなぁ、と思いますね。
シンプルにすごいしえらい。

あ、日付変わった。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment