個人開発ではじめるDagsterを使用したデータパイプラインの構築とインフラ運用の自動化

2024/12/13に公開

こちらはTechCommit AdventCalendar2024の13日目の記事になります。

はじめに

データエンジニアとしてキャリアを積み、データ分析基盤の設計や構築、保守運用を行ってきました。そこで、一人でどこまでデータ分析基盤を作れるのか試してみたい、と思ったのがきっかけでした。この記事ではデータエンジニアリングの知識とスキルを活かしながらゼロからデータ分析基盤を構築したことをまとめました。

Dagsterによるデータパイプラインの構築

データ分析基盤にはデータを処理するパイプラインが必要です。Airflowなどいくつか存在しますが、費用の面から個人開発でも利用可能でモダンなものから選択しようと考えました。
そこでSelf Hostingで運用できること、コンテナとメタDBで簡単に構築できるDagsterを採用しました。構築における規模が小さいほど、インフラ費用を安く済ませられます。Pythonで処理を記述できたりコンテナで運用できるので、開発だけでなく保守運用も楽なのも助かりました。SaaS利用は個人開発ということもあり費用の面から選択肢にはありませんでした。

https://github.com/dagster-io/dagster

個人単位で保守運用ができるデータ分析基盤は、そもそもデータ分析基盤における各コンポーネント単位で簡単な保守運用で済ませられないと持続可能なシステムとはなりません。

Dagsterではデータの収集と整形し、計算処理を行い、最終的な出力をRDSへ格納する処理を行っています。RDSはDWH、Datamartとして使用しています。
RDSへ格納されたデータはMetabase(BI)ツールから参照して分析等を行います。

https://github.com/metabase/metabase

AWS ECSを基盤としたインフラ設計

インフラにはAWS ECSを採用しました。スケーラビリティや運用のしやすさに加え、個人開発においてリソース管理を効率化できるという点を考えたためです。ECSはEC2ベースで構築し、Auto Scaling Groupを活用することで、負荷に応じたリソースのスケーリングを行うようにしました。更に、EC2はSpot Instanceを使うことでコストを更に抑える工夫を行いました.

https://dev.classmethod.jp/articles/aws-ecs-cluster-auto-scaling/

ECSへはApplication Load Balancer(ALB)経由で外部アクセスを可能にしました。
加えて、Dagsterの管理画面やMetabaseのUIへのアクセスをセキュアにするために、ALBの前にAuth0で認証を行うようにしました。Auth0はterraform providerとして用意されていたのも採用のポイントでした。

https://registry.terraform.io/providers/auth0/auth0/latest/docs

Auth0含めAWSのインフラをTerraformを使ってコード管理し、すべてのリソースの設定を明確にしました。

CI/CDによる自動化と運用効率化

運用の効率化には、CI/CDが不可欠です。データ分析基盤にはGitHub Actionsを使用し、コードの変更に対してテストと本番環境に反映される仕組みを構築しました。Terraformのフォーマットチェックや適用プランの確認を自動化し、エラーや設定ミスを防ぐプロセスも含めました。

また、保守性を高めるためにRenovateを導入しました。これによりパッケージの更新があった場合PRを自動で作成し、マージ時に本番環境できる仕組みも実現できました。これでライブラリの更新漏れやセキュリティリスクも低減できました。

細かい話にはなりますが、Github Actions WorkflowからAWSはOIDCで接続できるようにしているため、セキュリティに関しても十分な構成となっています。

全体像

現在、このデータ分析基盤は投資ポートフォリオの管理に利用しています。

Tailscaleについては記事では触れなかったですが、踏み台をなくすために導入しました。これによりPrivate SubnetにあるEC2にtailscale sshで接続できるようになりました。
https://tailscale.com/kb/1193/tailscale-ssh

おわりに

データエンジニアとしての経験を活かしつつ、Dagsterといった新しい技術やアプローチを試す機会にもなりました。この経験が、同じように個人での開発に挑戦する方やデータエンジニアリングに興味を持つ方にとって何かの参考になれば嬉しいです。

Discussion