やる気がストロングZERO

やる気のストロングスタイル

GKEからHerokuに引越したまとめ

実験・練習としてnekone.loveというtwitterに投稿されてる猫画像をひたすら表示しているサイトを運用している。
以前、k8sの使用感とかの確認のためにGKEを使って運用してたが、今回Herokuに移行したのでその時の作業メモなどを書く。

k8s(GKE)はなんだかんだで難しく規模の大きなシステム向き

k8sを触りたくてk8sで運用してたけど、わかったのはk8sはなんだかんだで難しいということだった。
「相当な専門性を持ってあたらないと、とても片手間で制御しきれるものではない」という印象だった。

たぶん、k8sを使う事でメリットの方が大きくなるのは、ある程度大きい規模のネットワーク構成によって構成されているシステムの場合だと思った。

k8sでこれを組んでいれば、デプロイの仕組みや、監視、ネットワーク構成を含めたシステムまるごとがk8sで提供され、特定のホスティングサービスにロックインされない。(全てk8sが提供する機能なのでk8sが動くならどこでも動く。ただし実際はちょっとそうでもない部分もあるっぽい)
各々サーバーの設定や関連についてもコードで管理されるので「どういう設定になっているか不明」のような事にもならないし、基盤の移行もやりやすくなる。

ただし、k8sでプロダクションで使えるようにシステムを組むには、もともとインフラ畑でやってきた人のノウハウが必須であると感じた。
例えばログに関しても、何もしなければ消えていってしまうのでfluentdなどを使って永続化する仕組みを作らないといけないし、監視についても検討構築する必要がある。

このあたりの情報はデファクトスタンダードのようなものもあまりなさそうで、アプリケーションを主戦場にしている僕ではベストな選択はまだ出来そうもなかった。

個人レベルのサービスならHerokuがちょうどよかった

僕はアプリケーションエンジニアなので、インフラ周りの知識が薄い。
漠然と 「DBはレプリケーションしてほしい・定期的にバックアップをとってほしい」 「負荷があがったときはwebサーバーがスケールしてほしい」
くらいの知識はあるが、それを実現するための細かい設定や、気をつけるポイントなどはあまり知らない。

Herokuを初め、Paasを使えばこのあたりをまるっと提供してくれているのでアプリケーション構築に集中できるし、自分が不足した知識で構築するよりも信頼性が高い。 (paasがそういう物なのでそらそうだという感じだが、、)

Paasを使うことでロックインの危険もあるが、スケーリングや監視などの主要な機能はどのPaasも提供してくれているし(設定をし直す必要はあるが、、)、そもそも個人レベルの規模の小さいアプリケーションなら問題は少ない。
アプリケーションもDockerコンテナで動くように意識して作っていればある程度のモビリティもキープできる印象だった。

金額

GKEだとプリエンプティブのインスタンスを3つ使った構成で3700円(税込み)くらいだった。 なんかロードバランサーの金額が一番高かった。

herokuだと、Hobbyのdynoで$7(自動更新ssl使う為)、postgresで$9(データ量が10Mを超えた為)

Herokuへの載せ替え

アプリケーションコードgitのディレクトリで作業する

・heroku Cliのインストール

The Heroku CLI | Heroku Dev Center

・アプリ作成

$ heroku apps:create nekonelove

・git remoteにherokuを登録

$ heroku git:remote

・Procfileの用意

$ vim Procfile

web: bundle exec rails s -e production -p $PORT

・デプロイ(postgresqlアドオンかってに設定された)

$ git push heroku master

マイグレーション実行

$ heroku run bash // ログイン

// heroku実行環境内にて
$ bundle exec rails db:migrate

・dbデータをインポート

$ heroku pg:psql < dump.sql

・cron設定
アドオン[Heroku Scheduler]を追加して設定

・カスタムドメイン設定

$ heroku domains:add nekone.love

// dns target 確認
$ heroku domains

// この後、DNSをこのdns targetに向ける

ssl設定

$ heroku certs:auto:enable