👏

SRE のタスクを時短化するツールを作った話し

に公開

課題感

私が担当している SRE のタスクの一つとしてリリースレビューがあります。毎日開発チームとリリースレビューを行い、リリースの内容、影響範囲、リスクを総合的にアセスメントし、問題がないか確認します。

*Azure の SRE については以前の記事をご参照ください。

https://zenn.dev/microsoft/articles/principles-and-practices-of-sre-supporting-azure

リリースレビューは別のチームが作ったリリース管理用の Web アプリを使います。その Web アプリには変更点やロールアウト日、ロールアウト対象のリージョン、テストの有無、ロールバックの有無、ロールバックにかかる時間、ロールバックのテスト有無など多くの情報が含まれています。リリースレビューは、これらの情報を確認して疑問があれば質問し、問題があれば差戻しや変更をリクエストします。

リリースレビューをしていると上述したような共通の確認ポイントがあり、なるべく自動化したりすぐに指摘できるようなことができたりしないかと考えていました。このWeb アプリに直接変更を加えることは少しハードルが高いため、クライアントサイドや別のツールとして実装することを前提としました。

作ったものその 1 : ブラウザ拡張機能

リリースレビューを行う Web アプリは情報が多く見た目もシンプルなため、視覚的に一目で確認できるようなものがあれば便利だと思いました。具体的には以下のようなものです。

  • 問題箇所に警告アイコンを表示
    • 過去の日付のロールアウト日やロールバック時間が未設定の場合に「❗」マークを表示
    • 特定のリージョンと環境設定の不一致を自動検出
  • ちょっとした便利機能
    • サービス名をタブタイトルに自動追加(複数タブで作業するときに便利!)
    • リージョン名を色分けして視認性アップ(日本は赤、米国は青など)
    • ツールボタンをつけて簡単に URL コピー

内部のツールなので全体像がお見せ出来ず非常に部分的になってしまうのですがこんな感じです:

  • 時間が過去日付の場合に「❗」マークを表示
    alt text
  • タブのタイトルにサービス名を追加
    例) 変更前: Release review tool # 1234
         変更後: Release review tool # 1234 | Azure Backup
  • URL コピー用のボタンを追加
    alt text
    コピーするとRelease review tool # 1234 | Azure Backupのような書式付きでタイトルとURLがコピーされます。チャットで連携するときに URL だけよりも親切です。
    alt text
  • CSS で見た目をきれいに
    デフォルトの見た目はかなりシンプルなので CSS を使って見た目を整えています。

拡張機能の設定画面はこんな感じです。
alt text
個人的にリージョンをカラーリングする機能は一目で確認できるので便利に使ってます。

実装

Web アプリは SPA で作られているので、DOM の監視に JavaScript の MutationObserver を使いました。初めて使ってみたのですが、setTimer でポーリングするよりも効率的に DOM の変更を検知できるので便利でした。

具体的に以下のようにすると、document.body 以下の DOM の変更があった場合にコールバックが呼ばれます。

this.observer = new MutationObserver(this.highlightPastDeploy.bind(this));
this.observer.observe(document.body, { childList: true, subtree: true });

要素は初め CSS セレクタを使って取得していましたが、パターンがいくつかあり静的な特定が難しかったので XPath を使うことにしました。

特に MutationObserver の実装については @horihiro さんの Chrome Extension for Azure portal のクラス設計を参考にさせて頂きました。

作ったものその 2 : AI エージェントによる仮想レビュー

リリースレビューの観点は社内の Wiki にかなり細かく公開されており、リリース情報が格納されたデータベースにもアクセスできるため、これらを組み合わせることで事前準備の削減やレビューの質を向上させることができるのではないかと考えました。

LangChain を使って仮想的なロールを作成し、そのロールがレビューをします。ロールは社内のロールに応じて、エンジニアのディレクターや SRE を想定しています。またそれらがレビューした結果を Vice President のロールが最終ジャッジをするようなフローを作ってみました。

仮想レビューのアウトプットは1つのロールごとに1つのMarkdownで出力します。
こんな感じ:
alt text

それぞれの仮想レビュアーは以下のように自分の役割を認識します。

# Your Role and Responsibility
As the Site Reliability Engineer (SRE) and representative of the R2D team, my role is to ensure the release adheres to safe deployment practices and aligns with the R2D objectives. Specifically, I am responsible for:

- Reviewing the release scope, testing coverage, and rollback plans.
- Ensuring the deployment follows Safe Deployment Practices (SDP) and complies with R2D principles.
- Verifying that risk mitigations are in place and the deployment is well-monitored.
- Providing feedback and identifying areas for improvement in deployment practices.
- Acting as a single point of contact for the franchise team to provide feedback and inputs.

項目はこのように出してくれます。
alt text

あえて出力のフォーマットを指定せずに柔軟に出力してもらうようにしているので毎回この項目とは限りません。

先ほどの拡張機能を入れると、タイトルの右側に出力した結果へのリンクのボタンを表示します。
alt text

実装

とりあえず使って見たかったという理由で LangChain / LangGraph を採用してみました。
LangGraph の部分は以下のようになってます。

graph_builder = StateGraph(ReviewState)
graph_builder.add_node("generate_personas", self._generate_personas)
graph_builder.add_node("conduct_review", self._conduct_review)
graph_builder.add_node("judge_review_by_vice_president", self._judge_review_by_vice_president)
graph_builder.add_edge(START, "generate_personas")
graph_builder.add_edge("generate_personas", "conduct_review")
graph_builder.add_edge("conduct_review", "judge_review_by_vice_president")
compiled_graph = graph_builder.compile()

最初にペルソナを作ってレビューをさせ、最終的に Approver である Vice President がレビューを行います。
ドキュメントの量から RAG は必要なさそうだったので使っていません。

このエージェント機能は、Azure Functions で動かしています。リリース情報のデータベースには直接アクセスできないため、Azure Functions を Power Automate から呼び出しています。

図にするとこんな感じです:

まとめ

これらのツールで個人的にはレビューが少し楽になりました。他のメンバーからの評判も良いです。

ブラウザの拡張機能に関しては Web アプリ側の実装の変更によってすぐに使えなくなってしまう(使う必要がなくなる)可能性はありますが、これも一つの解決方法としてありかと思います。
AI エージェントによる仮想レビューも連携できるデータが増えるとより正確なデータが取れます。

こういう隙間ツールを作るのはとても楽しいですし、実際に使ってもらえると嬉しいですね。

Microsoft (有志)

Discussion