Cloud Run で Metabase を起動してみた
事の始まり
とある金曜日の夕方...
上司「来週、各部署の人集めて BI 勉強会をやることになったんやけど Metabase
間に合う?」
ワイ「来週のいつかによりますが...とりあえず、本日中に Cloud Run
で動くようにします!」
ということで、サクッと Metabase 環境を構築することになりました。
Metabase について
OSS の BI ツールです。
SQL を使わずにヴィジュアライズしたり、自動でグラフ生成ができたりするそうです。
Google 認証はもちろん、LDAP 認証も使えるので、Azure AD でユーザの一元管理もできそう。
細かい仕様は公式や他のサイトを参照くださいませ。
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 が可能です。
-
Web コンソール 右上の「Cloud Shell をアクティブにする」をクリックし Cloud Shell を起動
-
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
- タグ付け
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
- 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
- イメージ確認
Web コンソールで「Artifact Registry」に遷移し、Push したイメージを確認できます。
Cloud SQL インスタンス作成
Metabase の設定保持用データベースの Cloud SQL インスタンスを構築します。
今回の目的は勉強会なので Metabase が最低限動作するスペック・構成で構築します。
- Cloud SQL のコンソールを開き「インスタンスの作成」をクリック
- データベースエンジンは「PostgreSQL」を選択
- インスタンス ID は metabase とし、パスワードは「生成」をクリックしてランダムなパスワードを生成
- Cloud SQL エディションは「Enterprise」を選択
- エディションプリセットは「サンドボックス」を選択
- リージョンは「asia-northeast1 (東京)」を、ゾーンの可用性は「シングルゾーン」を選択
- マシンシェイプは「共有コア」の「1vCPU、1.7 GB」を選択
- 接続 > インスタンス IP の割り当ての「プライベートIP」にチェックし、ネットワークは「default」を選択
ネットワークの設定がされていない場合は、プライベート サービス アクセスの設定を行います。 - 接続 > Google Cloud サービスの承認の「プライベート パスを有効にする」にチェック
- 画面最下部の「インスタンスを作成」をクリック
- 数分後にインスタンス作成が完了していることを確認
データベース作成
Metabase の設定を保持するアプリケーションデータベースを構築します。
テーブルは Metabase 初回起動時に自動で作成されます。
- 前項で作成したインスタンス詳細画面の「データベース」メニューを開き「データベースの作成」をクリック
- データベース名を「metabase」とし「作成」をクリック
Cloud Run サービス作成
Artificate Registry に Push した Docker イメージを Cloud Run にビルドします。
こちらも Metabase が最低限動作するスペック・構成で構築します。
- Web コンソールで「Cloud Run」に遷移し「サービスを作成」をクリック
- 「既存のコンテナイメージから〜」を選択、コンテナイメージの URL は Artificate Registry に Pushしたものを選択
- 設定を以下の通り入力
項目名 | 入力内容 |
---|---|
サービス名 | metabase |
リージョン | asia-northeast1 (東京) |
認証 | 未認証の呼び出しを許可 |
CPU の割り当てと料金 | リクエストの処理中にのみ CPU を割り当てる |
インスタンスの最小数 | 1 |
上り (内向き) の制御 | すべて |
- コンテナ > 設定を以下の通り入力
項目名 | 入力内容 |
---|---|
コンテナポート | 3000 |
メモリ | 2 GiB |
CPU | 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 アドレス |
パスワードはシークレットに登録し、そちらを参照しています。
- リビジョンの自動スケーリングを以下の通り入力
項目名 | 入力内容 |
---|---|
インスタンスの最小数 | 0 |
インスタンスの最大数 | 1 |
起動時の CPU ブースト | True |
-
Cloud SQL 接続で前項で作成した Cloud SQL インスタンスを選択
-
ネットワーキングを以下の通り入力
項目名 | 入力内容 |
---|---|
アウトバウンド トラフィック用の VPC に接続する | True |
VPC に直接トラフィックを送信 | True |
ネットワーク | default |
サブネット | default |
プライベート IP へのリクエストのみを VPC にルーティングする | True |
-
作成をクリック
-
デプロイが成功することを祈る🙏
動作確認
デプロイが成功したら以下のように URL が発行されるのでアクセス
「Metabase へようこそ」が表示されたら成功🎉
まとめ
実運用では利用しない ad-hoc な環境の構築だったので プレビュー機能である Direct VPC Egress を試しつつ、サクッと Metabase 環境が構築できました。
Metabase をチョット試したい方の参考になれば幸いです!
株式会社fundbookについてはこちらから
M&Aサービスについてはこちらから
Discussion