なになれ

IT系のことを記録していきます

いつの間にかデータ基盤が使えなくなるのを防ぐ GitHub ActionsによるDBマイグレーションに気づく仕組み

データエンジニアリングにおいて、初手の処理として、各システムからデータを抽出する処理があります。よく言われるETLやELTと呼ばれる最初のExtractの処理です。
そこから始まり、利用者にデータを使ってもらえるように可視化や分析のプロセスを構成するかと思います。

本記事は、データエンジニアリングにおいてデータを抽出する対象システムのデータ定義変更をどうやって事前に気づくかのTipsです。
最初のデータの抽出処理がエラーとなると、後続のデータフローが止まってしまうこともあるため、個人的には重要なトピックであると考えています。
今回の仕組みはGitHubやDBのマイグレーションファイルを管理するフレームワークを前提としたものになりますが、考え方は技術スタックが変わっても補える部分があるのではないかと思います。

課題

現在扱っているデータ基盤では、各種システムからデータの抽出を行いデータレイクに蓄積する部分と、データレイクからデータを分析、可視化するというデータ処理とがあります。
そのあたりの詳細は下記の過去記事にあります。

hi1280.hatenablog.com

データを抽出する各種システムの例の一つとして、自社サービスを構成するシステムがあるかと思います。
自社サービスのデータを分析することで、サービスの改善に繋げることが期待されるからです。
自社サービスのシステムは日々機能追加やリファクタリングを重ねながら作られていくものです。それに伴い、データ定義の変更が発生する可能性があります。
データエンジニアリング側でこれに気づかない場合、いつの間にかデータの処理がエラーになってしまうといったことがあり得ます。

また、サービスのシステムを開発するエンジニアにとっては、データ基盤のことなど知る由もなく、自分たちの必要に応じてデータ定義を変更している状態かと思います。
そのため、データ基盤はいつの間にか壊れる危険性があります。
一方でデータ基盤のことも気にしながら、開発するというのはサービスの改善スピードを妨げることにもなり、このようなアプローチは破綻すると考えます。
やはりサービスのシステムを開発するエンジニアにはそのシステムのことだけを考えて開発してもらう方が全体にとっては効果的なはずです。

解決策

これらの課題を踏まえて、データエンジニアリングの仕組みとしては、事前にデータを抽出するシステムでのデータ定義の変更に気づく必要があります。
幸い、現環境のサービスのシステム開発において、DBのマイグレーションを行う場合には、GitHubリポジトリマイグレーションファイルをコミットするプロセスになっていました。
そのため、このマイグレーションファイルのコミットを監視することができれば、データ定義の変更に気づくことができると考えました。

実際の実装内容としては次の例のように、GitHub Actionsのワークフローファイルを作成しました。
内容はとてもシンプルで、マイグレーションファイルが配置されるディレクトリ配下のファイルを対象としたPRが作られた場合にSlackに通知するといった仕組みです。

.github/workflows/db-migration-notice.yml

name: database migration notice
on:
  pull_request:
    branches:
      - main
    paths:
      - "src/migration/**"
jobs:
  build:
    runs-on: ubuntu-20.04
    steps:
      - name: Post to a Slack channel
        id: slack
        uses: slackapi/slack-github-action@v1.19.0
        with:
          channel-id: 'XXXXXXX'
          payload: |
            {
              "text": "Database migration notice: <${{ github.event.pull_request.html_url || github.event.head_commit.url }}|${{ github.event.pull_request.title }}>",
              "blocks": [
                {
                  "type": "section",
                  "text": {
                    "type": "mrkdwn",
                    "text": "Database migration notice: <${{ github.event.pull_request.html_url || github.event.head_commit.url }}|${{ github.event.pull_request.title }}>"
                  }
                },
                {
                  "type": "context",
                  "elements": [
                    {
                      "type": "mrkdwn",
                      "text": "Author: <https://github.com/${{ github.event.sender.login }}|${{ github.event.sender.login }}>"
                    }
                  ]
                }
              ]
            }
        env:
          SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} 

Slackに通知する処理はSlackアプリを作成して実行しています。以下の内容が参考になります。
qiita.com

通知の様子は以下のようになります。PRの詳細はメッセージ内のリンクを開くことで分かるようになっています。

このように、データ定義の変更を事前に分かっていなくても各サービスの開発プロセスに組み込む形でデータ定義の変更を検知することができます。
もちろん、全てのデータ定義の変更がデータ基盤に影響するわけではないので、そこは人がチェックするしかないです。
このあたりは現状どうしようもなく、いつの間にかデータ基盤が使えなくなってしまうリスクを考えると許容できる運用かと思います。

まとめ

GitHub Actionsを使って、データエンジニアリングで起こるであろうデータ抽出の問題をある程度解決しました。
データ基盤はサービスのシステムがあってのものです。サービスのシステム開発に影響がない形で仕組みを作る必要があると思います。
今回はそれを踏まえて、現実的な解決策を実現できたのではないかと考えています。