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

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

# 以下は MB_DB_CONNECTION_URI を設定するだけでもいいかもです
ENV MB_DB_TYPE mysql
ENV MB_DB_DBNAME ${DB_NAME}
ENV MB_DB_USER ${DB_USER}
ENV MB_DB_PASS ${DB_PASS}
ENV MB_DB_HOST 127.0.0.1
ENV MB_DB_PORT ${DB_PORT}

ADD https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 /usr/local/bin/cloud_sql_proxy
RUN chmod +x /usr/local/bin/cloud_sql_proxy

ADD http://downloads.metabase.com/v0.30.4/metabase.jar /app/metabase.jar

CMD cloud_sql_proxy -instances={CloudSQL の設定} & java -jar /app/metabase.jar

CloudSQL への接続は Socket 経由で行えるともっとスッキリいくんだと思うんですが、Metabase の設定がうまくいかず、ひとまず cloud_sql_proxy を使ってしまっています。

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

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

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