OTOBANK Engineering Blog

オトバンクはコンテンツが大好きなエンジニアを募集しています!

Metabase を Google App Engine で動かそう

こんにちは!@riaf です。

オトバンクでは、サービスの各種データの可視化に Metabase を利用しています。 また、主に Google Cloud を利用しているので、GCP で運用したく、現在は Google App Engine 上で Metabase を運用しています。

設定ファイルを書いておくだけでメンテナンスが非常に楽、というかほぼ必要ないのでとても良いのでオススメです。 (と書いてますが、挙動がおかしい時の調査とかは多少めんどくさい面もあります)

ちなみに、Metabase を GAE で動かそうとしている人たちは一応いるみたいで、検索するとそのような GitHub リポジトリが出てくるっちゃ出てくるんですが、最新のバージョンではそれだけで動かないものしか見つけられませんでした。

使用するのは

  • Google App Engine Flexible Environment
  • Google Cloud SQL

です。

app.yaml は以下のようにしました

runtime: custom
env: flex

manual_scaling:
  instances: 1

resources:
  cpu: 2
  memory_gb: 4

beta_settings:
  cloud_sql_instances: INSTANCE_CONNECTION_NAME=tcp:3306

Metabase は、複数インスタンスでの動作は非推奨ということなので、manual_scaling で 1 インスタンスのみ起動するようにしています。 その代わり、resources の所で必要なだけスケールアップしてあげるといいかなと思います。この例ではひとまずメモリを 4 GB にしておきました。割とメモリは食います。

CloudSQL を利用するため、INSTANCE_CONNECTION_NAME は各自環境に合わせて設定してください。

次に Dockerfile を用意します。例えばこんな感じです。 (弊社の環境ではもう少し複雑なイメージを作っていますが、おそらく最低限にするとこうなると思います)

FROM gcr.io/google-appengine/openjdk:8

RUN \
 apt-get -q update \
 && apt-get -y -q --no-install-recommends install \
    openjdk-8-jre=8'*' \
 && apt-get clean \
 && rm /var/lib/apt/lists/*_*

# GAE は 8080 に繋ぎます
ENV MB_JETTY_PORT 8080

# GAE Flexible で TCP 接続するために 172.17.0.1 に接続します ( `beta_settings.cloud_sql_instances` と対応してます)
ENV MB_DB_CONNECTION_URI mysql://{DB_USER}:{DB_PASSWORD}@172.17.0.1:3306/{DB_NAME}?charset=utf8mb4

ADD http://downloads.metabase.com/v0.30.4/metabase.jar $APP_DESTINATION

ちょっとだけ補足すると、GAE に用意されている gcr.io/google-appengine/openjdk:8 では、OpenJDK の Headless 版がインストールされているので、そのままでは Slack への通知でエラーが発生します。それを回避するために Headless じゃない JRE のインストールをしています。

公式では Heroku へのセットアップがボタン一つで済むようになっていたりもするので、この機会にぜひ皆さんも Metabase を試してみてください!そして、便利な活用方法あればぜひ教えていただけると ;D

それにしても、GAE + IAP (記事で触れてない!!) の組み合わせは本当にいいですね。次は Crowi を GCP に乗せたいなあ!