Heroku で Cloud SQL を利用する方法

Heroku で Cloud SQL を利用する方法

この記事は、 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 との通信が可能になるという感じです。
あくまで、有志によって作成されたビルドパックなので、調査・検証した上で利用することをお勧めします。

elements.heroku.com

cloud.google.com

設定方法

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> を設定

cloud.google.com

起動時の設定

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.

devcenter.heroku.com

リージョン

Heroku では通常のCommon Runtimeの場合、USリージョンもしくはEUリージョンのみが利用可能です。
東京リージョンにするにはPrivate Spaces Runtimeを利用する必要があります。
Cloud SQL インスタンスを地理的距離が遠いリージョンに配置していると、許容できないほどの遅延が発生する可能性があるので注意しましょう。

devcenter.heroku.com

cloud.google.com

まとめ

特殊な事情や要件がない限り、Heroku から Cloud SQL を利用するというパターンは珍しいかもしれませんが、同じ境遇の方々の参考になればと思います。
速度的な不満は特にありません。(管理は若干面倒)

さいごに

現在プレックスではソフトウェアエンジニア、フロントエンドエンジニア、UIデザイナーを募集しています。

とても働きやすい環境なので、一緒に働いてみたいと思った方がいましたら、是非ご連絡をお待ちしています!

dev.plex.co.jp