[Azure] Azure Kubernetes Service (AKS) で作るお手軽 BI 環境

データ分析基盤の重要性は近年増す一方ですが、その分析基盤要素の一つにデータ可視化ツール、いわゆる BI ツールがあります。
あらゆる BI ツールの中で、その見た目と使いやすさから __Metabase__ という OSS BI ツールに注目しました。

https://www.metabase.com/

Metabase の素敵さについては、以下記事のリンクを張らせていただきます。

https://qiita.com/acro5piano/items/0920550d297651b04387

今回は AKS 上に簡単な Metabase 環境を構築してみたいと思います。

## 構成図
![AKS_metabase_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/b089d33c-2c53-643e-a335-91b5533fb87b.png)

本記事では上図の環境を構築したいと思います。
Metabase は Docker Hub に[公式イメージ] (https://hub.docker.com/r/metabase/metabase)があるので、それを AKS 上で動かします。
ユーザは Azure Load Balancer (Kubernetes Service) 経由で Pod に http アクセスします。

Metabase ではユーザ情報などの設定情報を外部のデータベース (アプリケーション DB) に格納できます (これがないと Pod が削除されるたびに設定が初期化されてしまいます)。
そのアプリケーション DB として、Azure Database for PostgreSQL を作成します。
また、Pod から PostgreSQL へセキュアに接続するために、Private Endpoint 経由で接続するように構成します。

https://docs.microsoft.com/ja-jp/azure/postgresql/overview

https://docs.microsoft.com/ja-jp/azure/private-link/private-endpoint-overview

それでは、構築していきましょう。 


## AKS の作成
まずは AKS を作成します。
公式ドキュメントのクイックスタートを参考に Azure Portal から作成しました。

https://docs.microsoft.com/ja-jp/azure/aks/kubernetes-walkthrough-portal#create-an-aks-cluster

今回作成した Kubernetes バージョンは 1.20.9 です。
なお、今回は試してみることが目的なので、`プリセット構成` および プライマリノードプールの `ノード数` は以下の通りとしています。

- プリセット構成：Dev/Test
- ノード数 : 1

その他の項目は、デフォルトで作成しました。

## Azure Database for PostgreSQL の作成
続いて、Metabase の設定情報を格納するアプリケーション DB として、Azure Database for PostgreSQL を作成します。
こちらも公式ドキュメントのクイックスタートを参考に作成します。

https://docs.microsoft.com/ja-jp/azure/postgresql/quickstart-create-server-database-portal#create-an-azure-database-for-postgresql-server

ただし、`コンピューティングとストレージ` 項目では __Basic 以外__ を選択してください。
Basic では次の手順であるプライベートエンドポイント接続の設定ができません。今回は`汎用目的`を選択します。

## プライベートエンドポイント接続の設定
AKS の仮想ネットワークから PostgreSQL にセキュアに接続するために、プライベートエンドポイント接続の設定を行います。
こちらは以下の公式ドキュメントを参考に設定しました。

https://docs.microsoft.com/ja-jp/azure/postgresql/howto-configure-privatelink-portal#create-a-private-endpoint

## マニフェストファイルの作成
Metabase 環境を AKS 上に構築するためのマニフェストファイルを作成します。
コンテナの環境変数定義 (`env`) にはアプリケーション DB となる PostgreSQL の情報を設定します。
`MB_DB_DBNAME` には PostgreSQL の初期データベースである `postgres` を指定しました。
`MB_DB_USER` `MB_DB_HOST` は Azure Database for PostgreSQL のリソース概要画面にて確認可能です。
![2021-11-08_09h47_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/72f21d15-68e5-cbd4-17e6-6451205ab06a.png)

~~~yaml:metabase.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: metabase-deployment
  labels:
    app: metabase
spec:
  replicas: 3
  selector:
    matchLabels:
      app: metabase
  template:
    metadata:
      labels:
        app: metabase
    spec:
      containers:
      - name: metabase
        image: metabase/metabase:latest
        env:
        - name: MB_DB_TYPE
          value: postgres
        - name: MB_DB_DBNAME
          value: postgres
        - name: MB_DB_PORT
          value: "5432"
        - name: MB_DB_USER
          value: <管理者ユーザ名>
        - name: MB_DB_PASS
          value: <パスワード>
        - name: MB_DB_HOST
          value: <サーバー名>
        ports:
        - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: metabase
spec:
  type: LoadBalancer
  selector:
    app: metabase
  ports:
  - port: 3000
    targetPort: 3000
~~~

もちろん本来は、ポッドのリソース要求・制限の設定や設定情報の外出しなどが必要ですが、今回は試してみることが目的なので上記は必要最小限の設定にとどめています。

## デプロイ
いよいよ AKS へのデプロイです。
[Azure Cloud Shell] (https://shell.azure.com/) を使うと AKS (Kubernetes) を扱うためのツールがインストールされているので簡単です。

https://docs.microsoft.com/ja-jp/azure/cloud-shell/overview

次のコマンドでアクセス資格情報を取得し、AKS クラスターへ接続します。

```shell
az aks get-credentials --resource-group <リソースグループ名> --name <AKS 名>
```
その後、先ほど作成したマニフェストファイルを現在のディレクトリに格納し、以下コマンドを実行します。

```shell
kubectl apply -f metabase.yaml
```
これで環境が構築できました。
デプロイが完了したら、以下コマンドなどで Service の 外部 IP を確認し、ポート番号 3000 に http アクセスします。

```
kubectl get service metabase
```

![2021-11-06_14h47_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/e4e49f62-31f2-c83b-bf16-0edc87088bba.png)
アクセスできました！
初期設定後、実際に使い始められます。
![2021-11-08_10h59_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/49fda363-733f-372a-de91-4d018606a406.png)


また、アプリケーション DB として PostgreSQL を接続しているので、例えば以下コマンドで Pod を消したとしても、設定情報は残ったままです。

```shell
kubectl delete pod <Pod 名>
```

## 最後に
AKS のノードや PostgreSQL、Private Endpoint などで課金が発生し続けるので、不必要になったらリソースはすべて削除しましょう。

## 参考資料

https://www.metabase.com/docs/latest/operations-guide/running-metabase-on-docker.html