MetabaseをAzure Web App for Containersで動かしてみた

f:id:hawa9:20180126001854p:plain

Kibanaやre:dashなどデータを良い感じに可視化してくれるツールのなかで、Metabaseもいいぞという記事に目がとまりました。

OSSのデータ可視化ツール「Metabase」が超使いやすい - Qiita

MetabaseがRedashの苦労を吹き飛ばすくらい熱い - Qiita

ということで、早速試してみたいと思います。

インストール

インストールにはいくつか方法があるようで、

https://www.metabase.com/docs/latest/operations-guide/start.html#installing-and-running-metabase

今回はDockerで試してみます。Dockerはいいぞ。

Docker

Dockerインストール済みの環境なら一撃起動です。

$ docker run -d -p 3000:3000 -v ~/metabase-data:/metabase-data -e "MB_DB_FILE=/metabase-data/metabase.db" --name metabase metabase/metabase

コンテナーが起動したら http://localhost:3000 へのアクセスします。Metabaseに必要なDBもよしなに準備してくれます。安心してください、DBデータ永続化できますよ。

AzureにMetabaseをデプロイする

ローカル環境でMetabaseが動くことが確認できました。次はサーバーにデプロイします。AzureでDockerのWebアプリを動かすといえばこれ、Web App for ContainersをMetabaseのデプロイ先にします。

Web App for Containers

Cloud Shell便利ですね。

  1. リソースグループ作成
  2. Linux App Seriveプラン作成
  3. Web App for Container作成
$ az group create --name <resource-group> --location japaneast
$ az appservice plan create --name <plan-name> --resource-group <resource-group> --sku B1 --is-linux
$ az webapp create --resource-group <resource-group> --plan <plan-name> --name <webapp-name> --deployment-container-image-name metabase/metabase

次にWeb Appsへアプリケーション設定を行います。

  • DBデータを永続化したいので、Web Appsへ永続化を指定します。WEBSITES_ENABLE_APP_SERVICE_STORAGE=trueにして、/home配下をマウントします。
  • Metabaseイメージはポート3000を使用するので、WEBSITES_PORTでWeb Appsへ使用するポートを指定します。
$ az webapp config appsettings set --resource-group <resource-group> --name <webapp-name> --setting WEBSITES_ENABLE_APP_SERVICE_STORAGE=true MB_DB_FILE=/home/metabase-data/metabase.db WEBSITES_PORT=3000 

https://<webapp-name>.azurewebsites.net へのアクセスします。




アクセスできない(泣)

f:id:hawa9:20180126000508p:plain

App ServiceプランをB1とケチったせいですね。とりあえず札束で殴ってみます。

$ az appservice plan update --resource-group <resource-group> --name <plan-name> --sku S3

再度 https://<webapp-name>.azurewebsites.net へのアクセスを試みます。

f:id:hawa9:20180126000454p:plain

起動しました。

DBを外部参照へ変更

札束効果(スケールアップ)によりアクセスできるようになりましたが、お試しにしては懐に優しくない・・・。パフォーマンス改善のためMetabaseがローカルに持つDBを外部委託してみます。MetadabaはPostgresSQLが利用できるようなので、Azure Database for PostgresSQLに外部委託します。

Azure Database for PostgresSQL

Azure Database for PostgresSQLを作成します。

$ az postgres server create --resource-group <resource-group> --name <postgres-name> --admin-user <user> --admin-password <password> --performance-tier Basic --compute-units 50 --storage-size 51200 --version 9.6

次にAzure Database for PostgresSQLのファイアウォールを設定します。ファイアウォールにはWeb AppsのIPアドレスを指定したいのですが、Web AppsからOut方向のIPアドレスは固定できない?ようなので、今回は全解放で設定します(ご利用は計画的に)。

$ az postgres server firewall-rule create --resource-group <resource-group> --server <postgres-name> --name AllowAllIps --start-ip-address 0.0.0.0 --end-ip-address 255.255.255.255

構築したDBへpsqlやpgAdmin等で接続して、Metabase用のロールmetabaseとデータベースmetabaseを追加します。

key value
DBホスト <postgres-name>.postgres.database.azure.com
DBユーザー名 <user>@<postgres-name>
DBパスワード <password>

〜PostgresSQLへの追加手順省略〜

DB周りの作業が終わったのでMetabaseのDBをAzure Database for PostgresSQLへ変更します。

  1. マウント設定MB_DB_FILEを削除
  2. 接続文字列MB_DB_CONNECTION_URIを設定

PostgresSQLへSSL接続をするには、MB_DB_CONNECTION_URIで指定する必要があるようです。

Connecting to postgres metabase db over ssl · Issue #3296 · metabase/metabase · GitHub

$ az webapp config appsettings delete --resource-group <resource-group> --name <webapp-name> --setting-names MB_DB_FILE
$ az webapp config appsettings set --resource-group <resource-group> --name <webapp-name> --settings "MB_DB_CONNECTION_URI=postgresql://<postgres-name>.postgres.database.azure.com:5432/metabase?user=<user>@<postgres-name>&password=<password>&ssl=true"

https://<webapp-name>.azurewebsites.net へのアクセスできれば完了。

App Serviceプランを元に戻してみます。

$ az appservice plan update --resource-group <resource-group> --name <plan-name> --sku B1

f:id:hawa9:20180126000440p:plain

メモリ不足感はありますが、動いてくれてるのでOKとしましょう。

いくら?

実際Metabaseを構築するとしてもステージング環境などの空いてる所にMetabaseを同居させたりして、Metabase専用を作る機会は少なそう。

  • Web Apps S3サイズで約¥38,696/月
  • Web Apps B1サイズ + Azure Database for PostgresSQL Basicサイズで約¥9,821/月

Azure Database for PostgresSQLと組み合わせた方が安く上げられました。構築や運用の手間(コスト)、その辺を全部丸投げできるPaaSは楽ちんですね( ˘ω˘)

それではよい、Metabaseライフを。

Azureテクノロジ入門 2018

Azureテクノロジ入門 2018