🏃‍♂️

Cloud Run で Metabase を起動してみた

2024/04/19に公開

事の始まり

とある金曜日の夕方...
上司「来週、各部署の人集めて BI 勉強会をやることになったんやけど Metabase 間に合う?」
ワイ「来週のいつかによりますが...とりあえず、本日中に Cloud Run で動くようにします!」

ということで、サクッと Metabase 環境を構築することになりました。

Metabase について

OSS の BI ツールです。
SQL を使わずにヴィジュアライズしたり、自動でグラフ生成ができたりするそうです。
Google 認証はもちろん、LDAP 認証も使えるので、Azure AD でユーザの一元管理もできそう。
細かい仕様は公式や他のサイトを参照くださいませ。

https://www.metabase.com/

Metabase 環境構築


以下の Google Cloud サービスを利用します。

  • Cloud Shell
  • Artifact Registry
  • Cloud Run
  • Cloud SQL

Docker コンテナは Cloud Run で実行します。
Cloud Run は Docker Hub に対応していないため、Artifact Registry でイメージを管理します。
Docker イメージの Pull / Push は Cloud Shell を利用します。

また、Metabase の設定はデフォルトだと コンテナ内の H2 データベースに保存されますが、
コンテナを停止すると設定情報も揮発してしまうため、Cloud SQL で PostgreSQL を構築し、
そちらに設定情報を保存します。

Cloud SQL はグローバル IP を付与せず Direct VPC Egress を利用して Cloud Run から直接プライベート接続する構成にします。

Docker イメージを Artifact Registry に Push

Docker イメージの Pull / Push は Cloud Shell を利用します。
Cloud Shell は Glogle Cloud コンソールから起動できるターミナル環境です。
gcloud コマンドはもちろん Docker などの一般的な開発ツールがプリインストールされており、セットアップせずに Docker イメージの Build や Push が可能です。

  1. Web コンソール 右上の「Cloud Shell をアクティブにする」をクリックし Cloud Shell を起動

  2. Docker イメージを Pull

mr_x@cloudshell:~ (test-pj)$ docker pull metabase/metabase:latest
latest: Pulling from metabase/metabase
4abcf2066143: Pull complete
a21a63612cbe: Pull complete
668502a76337: Pull complete
919534ee2eac: Pull complete
1edf177bf3cb: Pull complete
b5a952cc5738: Pull complete
fafdddbf6210: Pull complete
Digest: sha256:e4a1109e09916f11fd40d142660371bc2d974575dc07ff9ff4aa6dc77e94b2f9 Status: Downloaded newer image for metabase/metabase:latest docker.io/metabase/metabase:latest
mr_x@cloudshell:~ (test-pj)$ docker image ls
REPOSITORY           TAG       IMAGE ID        CREATED       SIZE
metabase/metabase    latest    aebcc2bc6c60    2 days ago    640MB
  1. タグ付け
    Dockerイメージにリポジトリ名をタグ付けすると、イメージを特定の場所にpushするように docker push コマンドが構成されます。今回の例ではホストの場所は asia-northeast1-docker.pkg.dev です。
mr_x@cloudshell:~ (test-pj)$ docker tag metabase/metabase:latest asia-northeast1-docker.pkg.dev/test-pj/metabase/metabase:latest
mr_x@cloudshell:~ (test-pj)$ docker image ls
REPOSITORY                                                 TAG       IMAGE ID       CREATED      SIZE
asia-northeast1-docker.pkg.dev/test-pj/metabase/metabase   latest    aebcc2bc6c60   2 days ago   640MB
metabase/metabase                                          latest    aebcc2bc6c60   2 days ago   640MB
  1. Artifact Registry に Push
mr_x@cloudshell:~ (test-pj)$ docker push asia-northeast1-docker.pkg.dev/test-pj/metabase/metabase:latest
The push refers to repository [asia-northeast1-docker.pkg.dev/test-pj/metabase/metabase]
6d1570eb48eb: Pushed 
42e622490b6b: Pushed 
82392b6c7856: Pushed 
04bd46435138: Pushed 
2a6baf0cd3fe: Pushed 
8700812eabac: Pushed 
d4fc045c9e3a: Pushed 
latest: digest: sha256:e4a1109e09916f11fd40d142660371bc2d974575dc07ff9ff4aa6dc77e94b2f9 size: 1790
  1. イメージ確認
    Web コンソールで「Artifact Registry」に遷移し、Push したイメージを確認できます。

Cloud SQL インスタンス作成

Metabase の設定保持用データベースの Cloud SQL インスタンスを構築します。
今回の目的は勉強会なので Metabase が最低限動作するスペック・構成で構築します。

  1. Cloud SQL のコンソールを開き「インスタンスの作成」をクリック
  2. データベースエンジンは「PostgreSQL」を選択
  3. インスタンス ID は metabase とし、パスワードは「生成」をクリックしてランダムなパスワードを生成
  4. Cloud SQL エディションは「Enterprise」を選択
  5. エディションプリセットは「サンドボックス」を選択
  6. リージョンは「asia-northeast1 (東京)」を、ゾーンの可用性は「シングルゾーン」を選択
  7. マシンシェイプは「共有コア」の「1vCPU、1.7 GB」を選択
  8. 接続 > インスタンス IP の割り当ての「プライベートIP」にチェックし、ネットワークは「default」を選択

    ネットワークの設定がされていない場合は、プライベート サービス アクセスの設定を行います。
  9. 接続 > Google Cloud サービスの承認の「プライベート パスを有効にする」にチェック
  10. 画面最下部の「インスタンスを作成」をクリック
  11. 数分後にインスタンス作成が完了していることを確認

データベース作成

Metabase の設定を保持するアプリケーションデータベースを構築します。
テーブルは Metabase 初回起動時に自動で作成されます。

  1. 前項で作成したインスタンス詳細画面の「データベース」メニューを開き「データベースの作成」をクリック
  2. データベース名を「metabase」とし「作成」をクリック

Cloud Run サービス作成

Artificate Registry に Push した Docker イメージを Cloud Run にビルドします。
こちらも Metabase が最低限動作するスペック・構成で構築します。

  1. Web コンソールで「Cloud Run」に遷移し「サービスを作成」をクリック
  2. 「既存のコンテナイメージから〜」を選択、コンテナイメージの URL は Artificate Registry に Pushしたものを選択
  3. 設定を以下の通り入力
項目名 入力内容
サービス名 metabase
リージョン asia-northeast1 (東京)
認証 未認証の呼び出しを許可
CPU の割り当てと料金 リクエストの処理中にのみ CPU を割り当てる
インスタンスの最小数 1
上り (内向き) の制御 すべて
  1. コンテナ > 設定を以下の通り入力
項目名 入力内容
コンテナポート 3000
メモリ 2 GiB
CPU 1
  1. コンテナ > 変数とシークレットを以下の通り入力
項目名 入力内容
MB_DB_TYPE postgres
MB_DB_DBNAME metabase
MB_DB_PORT 5432
MB_DB_USER metabase
MB_DB_PASS metabase ユーザのパスワード
MB_DB_HOST Cloud SQL のプライベート IP アドレス

パスワードはシークレットに登録し、そちらを参照しています。

  1. リビジョンの自動スケーリングを以下の通り入力
項目名 入力内容
インスタンスの最小数 0
インスタンスの最大数 1
起動時の CPU ブースト True
  1. Cloud SQL 接続で前項で作成した Cloud SQL インスタンスを選択

  2. ネットワーキングを以下の通り入力

項目名 入力内容
アウトバウンド トラフィック用の VPC に接続する True
VPC に直接トラフィックを送信 True
ネットワーク default
サブネット default
プライベート IP へのリクエストのみを VPC にルーティングする True
  1. 作成をクリック

  2. デプロイが成功することを祈る🙏

動作確認

デプロイが成功したら以下のように URL が発行されるのでアクセス

「Metabase へようこそ」が表示されたら成功🎉

まとめ

実運用では利用しない ad-hoc な環境の構築だったので プレビュー機能である Direct VPC Egress を試しつつ、サクッと Metabase 環境が構築できました。

Metabase をチョット試したい方の参考になれば幸いです!


株式会社fundbookについてはこちらから

https://fundbook.co.jp/corporate/

M&Aサービスについてはこちらから

https://fundbook.co.jp/

株式会社fundbook

Discussion