auth0-deploy-cliとGithub ActionsでAuth0の設定が変わったことを手軽に検知する仕組み

こんにちは。CTO室の丸山です。某CTOからの無茶振りを捌いて初めて一人前と認めてもらえる(?)当CTO室ですが、気がつけば某CTO自身がもっとエラい人たちに無茶振りされてひぃひぃ言っております。

今回は某SaaSサービスの認証基盤として利用しているAuth0の変更検知の仕組みについて軽くご紹介できればと思います。

前置き

私が開発に携わっている某SaaSサービスでは、認証機能として二要素認証を提供すべしという要求があり、これを自前で実装するのは大変面倒&維持するにもコストがかかるという判断からAuth0を利用することになりました。(これはこれで色々と話せることがあるのですが、長くなるので追々...)

Auth0を採用したことで認証機能の作り込みの煩わしさからは解放されたのですが、その一方でSaaS特有の悩みとして、設定情報をどう管理し、意図しない設定変更をどう検知するかが新たな悩みの種となってきます。

設定変更は主に管理コンソールのWeb画面を通して行うわけですが、Auth0に限らず最近のSaaSはUIが直感的で操作がしやすい反面、意図せずにいつの間にか設定変更をしてしまっていた、などと言うことが稀に起きるためです。

ゆえに、設定が安易に変わらないこと、もしくは変わってもすぐにそれに気づけることが大事です。

幸いにもAuth0 には auth0-deploy-cli という強力なCLIツールが提供されていましたので、これを利用して手軽に変更検知の仕組みを実装してみました。

実装&運用方針

  • 管理画面のある時点の設定を正として、その時点の設定情報をyaml形式のファイルにエクスポートし、これをgit(Github)で管理する。
  • 定期的にコンソール上の現在の設定をエクスポートし、gitで管理しているファイルとの差分を確認する
  • 差分を検知したら、差分をもとにPRを作成し、Slackでエンジニアに通知する
  • エンジニアは差分の内容を確認して、それが問題のないものであるかを判断する。
    • 意図しない差分であれば、Auth0の管理コンソール上の該当設定をもとに戻してPRを破棄する
    • 意図した変更、あるいは受け入れ可能な変更であればPRをマージしてgitで管理する設定内容を更新する

実装例

上記の仕組みは Github Actions で実装しました。

まずは共通のアクションを作成し、

# shared-detect-diff.yml
name: Detect Differences In Auth0 Settings
on:
  workflow_call:
    inputs:
      env:
        type: string
        description: Environment to check diff (dev or prd)
        required: true
        default: dev

jobs:
  detect-diff:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    environment:
      name: ${{ inputs.env }}
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Get Auth0 Deploy CLI Tool
        run: npm i -g auth0-deploy-cli

      - name: Export Auth0 Settings
        run: a0deploy export --format=yaml --output_folder=exported/${{ inputs.env }}
        env:
          AUTH0_DOMAIN: "${{ vars.AUTH0_DOMAIN }}"
          AUTH0_CLIENT_ID: "${{ secrets.AUTH0_CLIENT_ID }}"
          AUTH0_CLIENT_SECRET: "${{ secrets.AUTH0_CLIENT_SECRET }}"
          AUTH0_ALLOW_DELETE: false

      - name: Create Pull Request if there is a difference
        uses: peter-evans/create-pull-request@v6
        with:
          title: Detect Auth0 Settings Difference (${{ inputs.env }})
          commit-message: Detect Auth0 Settings Difference (${{ inputs.env }})
          body: |
            ${{ inputs.env }} 環境のAuth0の設定に差分が発生しています。
            - 意図した変更によるものであれば、変更箇所について説明をコメントとして残した上で、このPRをマージしてください。
            - 意図しない変更によるものであれば、Auth0設定を元に戻した上でこのPRをクローズしてください。
            - Auto-generated by [create-pull-request][1]

            [1]: https://github.com/peter-evans/create-pull-request
          branch: create-pull-request/patch-${{ inputs.env }}
          base: 'main'
          reviewers: |
            tksmaru
            ...

管理するテナントごとにCIジョブを実装します(例は開発環境)

# check-dev.yml
name: Detect differences in Auth0 settings in the dev environment
on:
  schedule:
    - cron: '0 0 * * 1-5' # 平日9時(日本時間)に実行
  workflow_dispatch:

jobs:
  detect-diff:
    uses: ./.github/workflows/shared-detect-diff.yml
    with:
      env: dev
    secrets: inherit

これによって、意図しない設定変更が発生したとしても1日以内には気づける仕組みが出来ました。

なお、Slackへの通知には Slackの Github Appを使用しており、上記CIの実行、及びPRの作成を通知するように購読の設定を追加しています。

/github subscribe {repository-name} pulls,workflows:{event:“schedule”}

auth0-deploy-cliがエクスポートしない情報

CLIを使用すると大半の設定情報をエクスポートすることができますが、例外もあります。 私が確認出来た範囲では、以下の設定情報はエクスポートの対象外です。

  • デフォルトの設定値
    • 各設定項目のデフォルトの設定情報はファイルにエクスポートされません
    • ただし、設定項目の一部でも変更した場合は、その設定項目を含む関連の設定項目すべてが以降は明示的にエクスポートされるようになります
  • 気密性の高い情報
    • APIキーのような秘匿性の高い情報は、 ##KEY_NAME## という形式でプレースホルダに置き換えられてエクスポートされます
      • 例 SendGrid のAPIキー: ##SENDGRID_API_KEY##
  • 認証プロバイダとしてのAuth0が管理しているユーザー情報

結果

当初目論んでいた意図しない変更の他に、Auth0側の機能アップデートを検知できるようになりました。

例:PhoneProvidersに関連する機能がリリースされたとき

機能追加によってyamlファイルに項目が追加されるため、思わぬ副次的な効果として受動的にAuth0の機能追加に気づくことができるようになりました。

この記事がなにかのお役に立てば幸いです。