この記事は、 PLEX Advent Calendar 2024の8日目の記事です。
はじめに
こんにちは。コーポレートチームの山崎です。
とある社内向けプロジェクトの要件として Heroku 上で Rails を動かしつつ、DB は Cloud SQL を利用する必要がありました。
設定に手こずったので、備忘録がてら手順をまとめようと思います。
Heroku で Cloud SQL を利用するには
「Google Cloud SQL Proxy buildpack」というビルドパックを利用して実現できます。
仕組みとしては、Google が提供する Cloud SQL Auth Proxy
をビルド時にダウンロードし、プロキシ経由で Cloud SQL との通信が可能になるという感じです。
あくまで、有志によって作成されたビルドパックなので、調査・検証した上で利用することをお勧めします。
設定方法
README に手順が書かれていますが、若干の補足を加えて説明します。 github.com
BuildPacks の設定
- Settings の Buildpacks に
https://github.com/DanielZambelli/heroku-buildpack-cloud-sql-proxy
を追加
環境変数の設定
GCLOUD_INSTANCE
を追加し、Cloud SQL インスタンスの接続名を設定GCLOUD_CREDENTIALS
を追加し、base64 エンコードしたサービスアカウントキーを設定- サービスアカウントに必要な権限は下記ドキュメントを参照してください
# base64 エンコードの例 base64 -i path/to/key-file.json | pbcopy
- DB指定用の環境変数(
DATABASE_URL
等)としてpostgres://<username>:<password>@localhost:5432/<database-name>
を設定
起動時の設定
Web サーバー起動前にプロキシを起動させる必要があります。
起動コマンドの前に bin/run_cloud_sql_proxy &>null &&
を追加すれば OK です。
# Procfile の例 web: bin/run_cloud_sql_proxy &>null && bin/rails server
注意点
heroku run実行時
heroku run
コマンドやスケジューラは、アプリケーションの Web Worker とは異なる dyno 上で実行されます。
そのため、起動コマンドと同様にプロキシを実行させる必要があります。
# 例 heroku run 'bin/run_cloud_sql_proxy & rails db:seed' -a app-name
既存DBとのリプレイス
Heroku Postgres を設定した場合、DATABASE_URL
という環境変数が追加され、データベースのURLが設定されます。
アプリケーションに Heroku Postgres が存在する限り、DATABASE_URL
を書き換えることができないため、削除するか、他の環境変数を指定して利用する必要があります。
削除する場合は、必ずバックアップを取得しましょう!!!
The DATABASE_URL config var designates the URL of an app’s primary Heroku Postgres database. For apps with a single database, its URL is automatically assigned to this config var.
リージョン
Heroku では通常のCommon Runtimeの場合、USリージョンもしくはEUリージョンのみが利用可能です。
東京リージョンにするにはPrivate Spaces Runtimeを利用する必要があります。
Cloud SQL インスタンスを地理的距離が遠いリージョンに配置していると、許容できないほどの遅延が発生する可能性があるので注意しましょう。
まとめ
特殊な事情や要件がない限り、Heroku から Cloud SQL を利用するというパターンは珍しいかもしれませんが、同じ境遇の方々の参考になればと思います。
速度的な不満は特にありません。(管理は若干面倒)
さいごに
現在プレックスではソフトウェアエンジニア、フロントエンドエンジニア、UIデザイナーを募集しています。
とても働きやすい環境なので、一緒に働いてみたいと思った方がいましたら、是非ご連絡をお待ちしています!