OSSのBIツール「Matabase」をAWS Fargateでサクッと構築する
こんにちは!インフラ・データ分析チームのずやです!
弊社では2020年9月から「Carely Place」という新規サービスを提供開始しています。
「Carely Place」は、Carelyのお客様を対象にシステムに蓄積されたデータを分析して、可視化された組織の健康課題に対してソリューションを提供するサービスです。
本サービスにおいて間違いなく要になる部分がデータ分析ですが、その分析をするにあたってはMetabaseというBIツールを利用しています。
今回はこのMetabaseをAWSのECS(Fargate)で(サクッと)構築する手順を紹介したいと思います。
Metabaseとは
オープンソースのBIツールで、クエリの作成、グラフやダッシュボードによる可視化など基本的な機能が揃っています。
シンプルで見やすい画面と、SQLを書かなくてもデータの抽出・加工・可視化が行える点が特徴です。
(↓Metabaseのサンプルデータセットの自動生成されたダッシュボード画面)
なぜECS(Fargate)か
エンジニアのリソースが限られている中で、構築・運用コストを抑えるためです。
Metabaseは公式のDockerイメージが公開されているため、ECSのようなコンテナ環境があればすぐに動かすことができます。
また、Fargateを採用することでホストマシンの管理が不要になり、コンテナのメンテナンス・運用を行うだけでよくなります。
Metabaseの環境を構築する
本記事ではAWSコンソールを使って環境を構築していきます。
本番運用する際は、CloudFormationやTerraform等でコード管理することをお勧めします。
ECSクラスターを作成
手順
「Amzon ECS」 → 「クラスター」 → 「クラスターの作成」
テンプレートの選択では「ネットワーキングのみ」を選択します。
次の画面ではクラスター名を設定します。
ここで「VPCの作成」にチェックを入れると、CloudFormationスタックが裏で作られVPCや、サブネット、インターネットゲートウェイ等の各種ネットワークリソースが生成されます。
DBを作成
Metabaseの設定や作成したクエリ、ダッシュボードなどを保存するためにRDBが必要となります。
デフォルトではMetabaseのコンテナに組み込まれたH2というDBを使用するようになっています。
しかしこれではコンテナを削除したときにDBのデータも消えてしまいます。そのため、組み込みのH2 DBではなく外部に永続的なDBを用意して利用するべきです。
下記ドキュメントによると、対応しているDBエンジンはH2の他にPostgres、MySQL、MariaDBです。
https://www.metabase.com/docs/latest/operations-guide/configuring-application-database.html
対応しているDBエンジンであればどのようにDBを用意してもよいですが、今回はAWSで環境構築しているためAmazon RDSを利用することを推奨します。
RDSを利用する場合、ECSで使用するVPC内にインスタンスを作成するようにしてください。
またRDSのセキュリティグループでは、後述するECSサービスで作成するECSタスク用のセキュリティグループからのインバウンドアクセスを許可するように設定します。
ECSのタスク定義を作成
手順
「Amzon ECS」 → 「タスク定義」 → 「新しいタスク定義の作成」
起動タイプの互換性の選択で「FARGATE」を選択します。
次の画面でタスクとコンテナの定義の設定を行います。
必須の設定項目は「タスク定義名」、「タスクサイズ」、「コンテナの定義」です。
「タスクサイズ」はFargateの料金にも関わる項目で、ECSタスクで利用するCPUとメモリの値を設定します。
参考までに、弊社分析基盤で稼働しているECSタスクではCPU=0.5vCPU、メモリ=2GBで安定して動作しています。
「コンテナの定義」ではECSタスクで動かすコンテナの設定を行います。
「コンテナの追加」をクリックするとモーダルが表示されるので、ここでコンテナの設定を入力していきます。
イメージには、dockerhubにあるmetabaseの公式イメージを指定します。
今回の例では、記事執筆時点で最新のv0.37.2
のタグを指定しています。
metabaseイメージではデフォルトで3000番ポートをexposeしているため、ポートマッピングの項目では3000
を設定しておきます。
さらに、コンテナの設定で環境変数を設定します。
これらはいずれもDBへの接続設定となります。
- MB_DB_TYPE
- MB_DB_PORT
- MB_DB_HOST
- MB_DB_DBNAME
- MB_DB_USER
- MB_DB_PASS
他にも多々設定項目がありますが、今回はこれだけで大丈夫です。
「追加」をクリックしてコンテナを追加した後、「作成」クリックでタスク定義が作成されます。
ロードバランサー(ALB)を作成
インターネットを通じてECSで稼働しているMetabaseアプリケーションにアクセスするためにロードバランサーを作成します。
手順
「EC2」 → 「ロードバランサー」 → 「ロードバランサーの作成」
ロードバランサーの種類の選択では「Application Load Balancer」を選択します。
次にロードバランサーの基本設定を行います。
VPCはECSで利用するものと同じVPCを指定します(ECSクラスター作成時にVPCを作成した場合はそのVPC)。
セキュリティグループの設定では、下図のようにHTTPアクセスを許可するセキュリティグループを設定しておきます。
(あくまで例なので、適宜HTTPSにしたりIP絞ったりしてください)
最後にルーティングの設定というところでロードバランサーにターゲットグループを追加します。
ここで「ターゲットの種類」をIPに、「ポート」を3000に設定します。
次の画面でターゲットの登録がありますが、ここでは何もせずで大丈夫です。
「確認」 → 「作成」と進んでロードバランサーの準備は完了です。
ECSサービスを作成
手順
「Amzon ECS」 → 「クラスター」 → 作成したクラスターを選択 → 「クラスターの作成」 → 「サービス」 → 「作成」
まずはECSサービスで動かすECSタスクについての設定を行います。
タスク定義のファミリーの欄に作成したECSタスク定義の名前を選択します。
ECSタスク定義は設定を変更するたびにリビジョンが新しくなっていきます。作成したばかりであればリビジョンは1しかないですが、もしタスク定義を更新した場合は最新のリビジョン番号を選択してください。
タスク数はその名の通り起動するタスクの数です。リソースの負荷に応じてオートスケールさせることもできますが、今回その説明は省略します。
次にネットワーク構成の設定を行います。
「VPCとセキュリティグループ」でECSで使うVPCとサブネットを選択していきます。
セキュリティグループは「編集」をクリックすると下図のように設定を編集できます。
3000番ポートへのTCPアクセスを許可します。ソースの箇所にはロードバランサーに紐付けたセキュリティグループのIDを設定しています。
「ロードバランシング」に進んで、前ステップで作成したロードバランサーを指定します。
「ロードバランス用のコンテナ」において、「ロードバランサーに追加」をクリックするとロードバランサーのターゲットグループの設定が表示されます。
ここでは前ステップで作成したロードバランサーのターゲットグループを指定します。
最後に「サービスの作成」をして完了となります。
動作確認
ECSサービスを作成するとサービスで定義したECSタスクが起動します。
初回起動時にはDBのマイグレーション等の初期化処理が実行されるため、Metabaseにアクセスできるまで少し時間がかかります。
Metabaseにはロードバランサーのドメイン(下図参照)をURLとしてブラウザからアクセスすることが可能です。
こちらも適宜Route53等で独自ドメインをあててください。
それでは良きMetabaseライフを!
さいごに
今回はMetabaseをECS(Fargate)で動かしてみるということで、構築手順を紹介しました。
気付いたらMetabaseあまり関係なく、ただただECSのチュートリアルになってましたね(笑)
データ分析に関しては、Metabaseの導入だけではなくその裏側の分析基盤自体の新規構築も行ったので、その話も今後ブログで紹介できればなと思っています!