Azure上でデータパイプラインを運用していると、「障害対応やリリースに思った以上に工数がかかる」と感じる場面が多くなります。本記事では Azure Data Factory・Synapse・Databricks などのPaaSを組み合わせ、監視・復旧・CI/CD・無停止変更までを極力自動化するための設計と具体的な実装パターンを整理します。
Azureベースのデータフロー運用で目指す姿
まずゴールイメージを共有します。ここでいう「Azureベースのデータフロー運用が整った状態」とは、次のような状態です。
- すべてのパイプライン実行状況・性能・データ品質が Azure Monitor で一元可視化されている
- 障害が起きても、冪等な設計と自動リトライで「安全にやり直せる」
- 開発〜本番の流れが CI/CD と IaC(Infrastructure as Code)で自動化され、人手作業がほぼない
- 本番切り替えは Blue/Green やカナリア方式で無停止&即ロールバックが可能
この状態を Azure の各サービスでどう実現するかを、以降で分解して解説します。
登場する主なAzureサービスと役割
本記事で前提とする代表的な構成と、各サービスの役割を整理しておきます。
| レイヤ | 主なサービス | 役割 |
|---|---|---|
| オーケストレーション | Azure Data Factory(ADF)、Synapse パイプライン | バッチ/マイクロバッチ処理の制御、依存関係管理、トリガー |
| 処理エンジン | Azure Databricks、Synapse Spark、Azure Functions | ETL/ELT、ストリーミング、ビジネスロジックの実装 |
| データストア | Azure Data Lake Storage、Delta Lake、Synapse Dedicated SQL | Raw/Bronze/Silver/Gold の各レイヤ、クエリ用テーブル |
| 監視・ログ | Azure Monitor、Log Analytics、Application Insights | ログ集約、メトリクス監視、アラート、ダッシュボード |
| 運用オートメーション | Azure DevOps、GitHub、Logic Apps | CI/CD、承認フロー、運用チケット起票・通知 |
監視・メトリクス設計:Azure Monitorに集約する
診断ログをLog Analyticsに集約する
最初にやるべきことは、すべてのデータ系リソースで診断設定を有効化し、Log Analytics ワークスペースに集約することです。これをしておかないと、後からどれだけ工夫しても「過去に何が起きていたか」が追えません。
| サービス | 主な診断ログ | ポイント |
|---|---|---|
| ADF | ADFPipelineRun / ADFActivityRun / ADFTriggerRun | パイプライン成否、アクティビティ単位のステータス、トリガー実行履歴 |
| Synapse パイプライン | パイプラインラン、アクティビティラン | ADF とほぼ同様の粒度。Log Analytics に送って同様に KQL で集計 |
| Azure Databricks | 監査ログ、ジョブログ、クラスターイベント | 誰が何を実行したか、どのクラスターでいつ失敗したかを追跡 |
| Storage / Data Lake | 読み取り/書き込み要求ログ | 大量の404/403、スロットリング(429)を検知 |
| Azure Functions 等 | FunctionLogs、依存関係ログ | Application Insights と連携し、例外スタックトレースも確認 |
診断設定は、「新しいリソースを作ったら必ずテンプレートで有効化される」ように Bicep / ARM テンプレートに組み込んでおくと、抜け漏れを防げます。
Workbooksで運用ダッシュボードを作る
Log Analytics に集約したログは、Azure Monitor の Workbook で可視化します。単に「失敗件数」だけを見るのではなく、以下のような観点でダッシュボードを構成すると、運用チームが意思決定しやすくなります。
- パイプライン成功率(当日・過去7日・過去30日)
- ウィンドウトリガーごとの最新実行時刻と遅延分数
- パイプラインごとの平均実行時間・p95実行時間
- 1時間あたりの処理レコード数・ファイル数(簡易スループット指標)
- データ品質(レコード件数の急増/急減、NULL 率、重複件数など)
- IR/クラスターのスケールと実行時間の相関(コスト vs 性能)
| カテゴリ | 代表的なメトリクス | 用途 |
|---|---|---|
| 信頼性 | 成功率、失敗件数、リトライ件数 | 障害傾向の把握、SLO 達成状況の確認 |
| 遅延 | ウィンドウ遅延分数、最終成功ウィンドウ | バックログ発生の早期検知、SLA 逸脱アラートの根拠 |
| 性能・コスト | 実行時間、使用コア数、クラスターサイズ | オーバースペック/アンダースペックの可視化 |
| 品質 | 件数変動率、エラー行率、NULL率 | 上流システムの不具合や仕様変更の検知 |
アラート設計:KQLで「検知すべき事象」を定義する
アラートは「全て失敗したら鳴る」だけでは不十分です。ユーザー影響やSLAに直結する条件から優先度を付けて設計します。
- 重大障害:重要パイプラインの実行失敗(即時通知)
- SLA逸脱:ウィンドウトリガーが一定時間以上遅延(例:15分以上)
- 性能劣化:実行時間の急増、リトライ回数の増加
- コスト異常:クラスターが長時間アイドルで稼働し続けている
代表的な KQL クエリ例を示します。
失敗検知(5分バケット)
ADFActivityRun
| where Status == "Failed"
| summarize Failures = count() by PipelineName, bin(TimeGenerated, 5m)
バックログ/遅延監視(Tumbling Window トリガー)
ADFTriggerRun
| where TriggerName startswith "tw-"
| summarize LastCompletion = max(TimeGenerated) by TriggerName
| extend DelayMinutes = datetime_diff('minute', now(), LastCompletion) * -1
| where DelayMinutes > 15
これらのクエリを Log アラートとして保存し、メール・Teams・Ops ツールなどに通知することで、Azure Monitor を「フルマネージドな NOC のように」扱えます。
Application Insightsでアプリコードもトレースする
Azure Functions やカスタム検証ロジックなど、コードで書かれた部分は Application Insights でトレースし、依存関係や例外スタックを記録します。Application Insights のログも Log Analytics に統合すると、「どのパイプラインの、どの関数で、どんな例外が出たか」を KQL で一気に追えるようになります。
障害復旧:自動リトライ+冪等で「何度やり直しても安全」な設計
ADF/Synapseのリトライ機能を正しく使う
外部システムとの連携では一時的なネットワークエラーやスロットリングが頻発します。これらは「障害」ではなく「前提」として扱い、ADF アクティビティごとに適切な retry / retryIntervalInSeconds を設定します。
- 外部APIコール:3〜5回リトライ、指数バックオフ
- Blob コピー:一時的な 5xx や 429 を想定して複数回リトライ
- 永続的なエラー(認証失敗など):すぐ失敗させて運用介入へ
「全部とにかくリトライ回数を増やす」のではなく、外部要因で解消が期待できるものだけにリトライを使うのがポイントです。
Tumbling Window Triggerでバックフィルを簡単にする
日次・10分毎といった「時間窓」で処理するパイプラインでは、ADF の Tumbling Window Trigger が非常に有効です。
- ウィンドウ単位で成功/失敗を管理できる
- 依存関係(このウィンドウは前のウィンドウが成功してから実行)を自動で解決
- 過去期間のバックフィル(再処理)が GUI から簡単に実行できる
運用上は「どのウィンドウが失敗して、どこまでが成功しているか」が一目で分かるため、復旧時の判断スピードが大きく変わります。
冪等設計の基本:ウォーターマーク + MERGE(Upsert)
「再実行しても結果が壊れない」ためには、冪等(べきとう)な設計が必須です。典型的には以下のパターンを組み合わせます。
- 最後に処理したタイムスタンプやIDを記録する「ウォーターマーク」テーブルを持つ
- 書き込み先は Delta Lake などのテーブルに対して MERGE(Upsert)で更新する
- 集約テーブルは「全期間再計算」ではなく「ウィンドウ単位で差分再計算」する
| パターン | 実装イメージ | メリット |
|---|---|---|
| ウォーターマーク | 専用テーブルに source_name / last_processed_at を保存 | どこまで処理済みかが一目で分かる、再処理の範囲指定が容易 |
| MERGE(Upsert) | Delta Lake の MERGE INTO でキー重複時は更新、未存在ならINSERT | 二重取り込み・再実行でも結果が1件に収束する |
| スナップショット置換 | Gold テーブルを CTAS/INSERT OVERWRITE で丸ごと入れ替え | 集計結果の一貫性が保ちやすく、ロールバックもバージョン管理で簡単 |
Databricks Structured Streamingの復旧
ストリーミング処理では、Azure Databricks の Structured Streaming を利用すると、チェックポイントによって「Exactly-once 相当」の再開が可能です。
- checkpointLocation を必ず指定し、ジョブ再起動時に同じ場所を指定する
- 出力先は Delta Lake を利用し、idempotent な書き込みになるよう構成する
- 失敗時は「ストリーム停止 → 問題修正 → 同じチェックポイントで再起動」が基本パターン
チェックポイントと Delta のトランザクションログの組み合わせにより、「どこまで処理済みか」をフレームワークが覚えてくれるため、運用側は「いつ再起動するか」に集中できます。
運用Runbookの具体例
障害が起きたときに毎回ゼロから考えていると、対応の品質がブレます。あらかじめ以下のような Runbook(定型手順) を用意しておきます。
- 影響範囲の特定
- 失敗したパイプライン名・ウィンドウ・データセットを特定
- ダウンストリームシステム(BI、API)への影響有無を判定
- 原因切り分け
- 外部要因(上流システム停止、認証エラー、スロットリング)か
- 内部要因(コードバグ、スキーマ変更、容量不足)か
- 復旧方針の決定
- 一時的な外部要因:リトライ or 対象ウィンドウのみ再実行
- 内部要因:修正後に対象ウィンドウをバックフィル
- 再実行と検証
- Tumbling Window の Re-run 機能などを用いて対象ウィンドウのみ再実行
- MERGE / ウォーターマークにより重複が発生していないことを確認
| 障害種別 | 典型例 | 基本アクション |
|---|---|---|
| 外部システム停止 | 上流APIメンテナンス、DB接続不可 | 一時的にパイプラインを停止し、復旧後に対象ウィンドウのみ再実行 |
| スキーマ変更 | カラム追加・型変更 | スキーマ対応を実装し、再デプロイ後に問題ウィンドウをバックフィル |
| 性能劣化 | 処理時間の急増、タイムアウト | 一時的にスケールアップし、根本原因の分析後に設定見直し |
開発〜本番:CI/CDとIaCで「再現性」を担保する
Git連携とブランチ戦略
Azure Data Factory や Synapse パイプラインは、Git 統合を使うことで「どの時点でどの構成だったか」をコードとして管理できます。
- コラボレーションブランチ(例:
main)で基本構成を管理 - 開発者は機能ごとにフィーチャーブランチを作成し、PRでレビュー
- ADF は「Publish」操作で ARM/Bicep 相当のテンプレートを生成
GUI 上で直接本番を編集する運用は、再現性も監査性も失われるため避けましょう。あらゆる変更はGitのPRを経由することを原則にします。
Azure DevOpsのマルチステージYAMLパイプライン
CI/CD には Azure DevOps(もしくは GitHub Actions)を用い、YAMLベースのマルチステージパイプラインを定義します。代表的なステージ構成は次の通りです。
| ステージ | 主な処理 | ポイント |
|---|---|---|
| Build / Validate | Bicep/ARM テンプレートの検証、Lint、パイプライン定義の静的チェック | ここで失敗するものは Dev にも上げない |
| Dev デプロイ | Dev環境へのデプロイ、簡易結合テストの実行 | 接続先やSKUはパラメータで切り替え、Key Vault からシークレット取得 |
| Test / Staging | 本番相当データでの検証、負荷テスト、リグレッションテスト | ここで Blue/Green の新系を先に流して品質確認 |
| Prod リリース | 本番デプロイ、トリガー切り替え、監視強化 | 承認ゲートを必須にし、変更フリーズ期間のチェックも組み込む |
IaC(Bicep)で基盤をコード化する
インフラ構成(Data Factory、Synapse、Databricks、Storage、Key Vault など)は Bicep / ARM テンプレートでコード化します。環境ごとの違いはパラメータで吸収し、テンプレートは共通化します。
param env string
param keyVaultName string
param sinkConnectionStringSecretName string
// 環境に応じて SKU / 並列度 / 接続先をパラメータで出し分ける
// 例:if (env == 'prod') { 高スペック } else { 中スペック }
リソース種別ごとに Bicep モジュールを分割しておくと、増築やサービス追加にも対応しやすくなります。
テスト戦略:ユニット・結合・回帰
データパイプラインのテストは、次の3層に分けて考えると整理しやすいです。
- ユニットテスト:Databricks ノートブックや関数単位でのロジック検証(PySpark 単体テストなど)
- 結合テスト:ADF パイプライン単位で、サンプルデータを流して期待結果と比較
- 回帰テスト:代表的な本番データセットを用いて、「過去バージョンと指標が変わっていないか」を比較
PR 作成時にサンプルデータで自動検証し、Prod デプロイ前にはステージング環境で実データに近い形の回帰テストを走らせると、安全性が高まります。
バージョニングとロールバック
リリース単位で以下をセットで保存しておくと、「前の状態に戻す」が非常に簡単になります。
- Bicep/ARM テンプレート一式
- ADF/Synapse パイプライン定義(JSON)
- トリガー設定(有効/無効の状態含む)
事故時には「前リリースのアーティファクトをそのまま再適用し、トリガーを切り戻す」だけで済むようにしておきます。
無停止変更:Blue/Green・カナリア・ホットリロード相当の切り替え
Azure Data Factory/SynapseでのBlue/Green
ADF/Synapse のパイプラインは、実行中インスタンスの途中を書き換える「ホット編集」はできません。その代わりに、Blue/Green デプロイの考え方を使います。
- Blue:現在本番で動いているパイプライン群
- Green:新バージョンのパイプライン群(本番と同じ入力で影ながら実行)
実装の基本パターンは次の通りです。
- Green パイプライン&トリガーを、本番環境に「無効状態」でデプロイ
- 手動実行や限定パラメータで、Green の動作と処理結果を検証
- 問題がなければ、トリガーの有効/無効を切り替えて本番を Green にスイッチ
トリガー切替を Azure CLI で行う例です(Bash)。
# Green 有効化 / Blue 無効化(リリース最終ステップで実行)
az datafactory trigger start -g <resource-group-name> \
--factory-name <data-factory-name> \
--name <green-trigger-name>
az datafactory trigger stop -g
--factory-name
--name
このスクリプトをリリースパイプラインの最後に組み込み、ロールバック時には逆順で実行するようにしておくと、「1クリックで切り戻し」が実現できます。
カナリアリリース:一部だけ新系に流す
いきなり全データを新バージョンで処理するのが怖い場合は、カナリアリリースとして一部だけ新系に流します。
- 特定のウィンドウ(例:最初の1時間分)だけ Green で処理する
- 特定テナント・顧客・テーブルだけ Green にルーティングする
- Green と Blue のメトリクス(処理時間、件数、品質)を比較し、問題がなければ全量切替
これにより、未知のスキーマ変更や性能劣化を「一部のデータ」で検知し、本格展開前に修正できます。
Databricksストリーミングでの無停止切り替え
ストリーミング処理の無停止変更では、書き込み先を 2系統 用意しておき、ビューの参照先のみ切り替えるパターンが有効です。
- stream_v1:現行バージョンが書き込む Delta テーブル
- stream_v2:新バージョンが書き込む Delta テーブル
- ビュー view_stream:どちらか片方を参照(クエリや下流システムは常にビューを見る)
本番切替は次のような流れになります。
- 新しいストリーム(v2)を起動し、v1 と並行で動作させる
- v1/v2 のデータを比較し、品質・遅延・スループットを確認
- 問題なければビューの参照先を v2 に切り替え、v1 を段階的に停止
| 抽象化レイヤ | 実装例 | 切替方法 |
|---|---|---|
| SQLビュー | CREATE OR ALTER VIEW view_gold AS SELECT * FROM gold_v1; | ALTER VIEW で参照先を gold_v2 に変更 |
| メタストア | カタログ/スキーマでテーブルを管理 | テーブルの別名を付け替えることで切替 |
| アプリ設定 | 接続先テーブル名を Key Vault / Config に外出し | 設定値を書き換えて再起動 |
レイヤードアーキテクチャと標準運用フロー
データレイヤ(Bronze/Silver/Gold)の整理
Azure 上のデータレイクは、Raw/Bronze → Silver → Gold のような段階的なレイヤで整理します。
| レイヤ | 主な内容 | ポイント |
|---|---|---|
| Raw/Bronze | ソースデータをそのまま or 最小限の整形で保存 | 後からの再処理のため、できるだけ元データに近い形を保持 |
| Silver | クレンジング・正規化済みの中間テーブル | 主キー・外部キーを整備し、下流処理が書きやすい構造にする |
| Gold | ビジネスKPI・マート用の集約テーブル | BIツールやAPIから直接参照される「見られる顔」 |
監視・復旧・CI/CD もこのレイヤ構造を前提に設計すると、「どこで問題が起きているか」「どこから再処理すべきか」が判断しやすくなります。
標準的な運用フロー
本記事で紹介した要素を組み合わせると、次のような標準運用フローになります。
- 基盤展開
- Bicep で Azure リソース(ADF、Synapse、Databricks、Storage、Monitor 等)を自動展開
- 診断設定を全リソースに適用し、Log Analytics に集約
- 開発・テスト
- Git 上でブランチ運用し、PRベースでパイプライン・ノートブックを開発
- Dev/Stage 環境でユニット・結合・回帰テストを自動実行
- 本番リリース
- CI/CD パイプラインで本番へデプロイ(トリガーはまだ無効)
- Blue/Green の Green 側として影実行し、ダッシュボードとアラートで様子を見る
- 切替と監視強化
- トリガー切替スクリプトで一気に Green を有効化、Blue を無効化
- 数日〜数週間は監視を強化し、問題あれば即ロールバック
- 障害対応と継続的改善
- Runbook に沿って障害対応し、原因と再発防止策を記録
- 必要に応じてメトリクスやアラート、テストケースを拡充
すぐ使えるテンプレート集
失敗検知KQL(5分バケット)
ADFActivityRun
| where Status == "Failed"
| summarize Failures = count() by PipelineName, bin(TimeGenerated, 5m)
バックログ遅延検知(Tumbling Window)
ADFTriggerRun
| where TriggerName startswith "tw-"
| summarize LastCompletion = max(TimeGenerated) by TriggerName
| extend DelayMinutes = datetime_diff('minute', now(), LastCompletion) * -1
| where DelayMinutes > 15
トリガー切替スクリプト(Azure CLI イメージ)
# Green を有効化
az datafactory trigger start \
-g <resource-group-name> \
--factory-name <data-factory-name> \
--name <green-trigger-name>
# Blue を無効化
az datafactory trigger stop
-g
--factory-name
--name
環境差分吸収用Bicepパラメータ例
param env string
param keyVaultName string
param sinkConnectionStringSecretName string
// env に応じて接続先やSKUを切り替える
// 例)
// var sinkConnectionString = listSecret(
// keyVaultName,
// '2021-10-01'
// ).value[sinkConnectionStringSecretName]
運用チェックリスト
最後に、本記事の内容を踏まえたチェックリストを掲載します。自社環境に照らし合わせて、抜けている項目から着手すると効果が高いです。
| カテゴリ | チェック項目 |
|---|---|
| 監視 | すべてのデータ系リソースに診断設定を有効化し、Log Analytics に集約している |
| 監視 | パイプライン成功率・実行時間・遅延・データ品質を可視化した Workbook ダッシュボードがある |
| 監視 | 失敗・遅延・リトライ枯渇・スループット低下など、重大な事象のアラートが定義されている |
| 復旧 | 冪等実装(ウォーターマーク、MERGE/Upsert、スナップショット置換)が標準パターンとして定義されている |
| 復旧 | バックフィル手順(Tumbling Window 再実行など)と影響範囲の記録方法が決まっている |
| 復旧 | ストリーミング処理のチェックポイント・再起動手順が Runbook 化されている |
| CI/CD | ADF/Synapse/Databricks は Git 連携され、GUIからの直接本番変更は禁止されている |
| CI/CD | Dev → Test → Prod のマルチステージ CI/CD パイプラインがあり、承認ゲートが設定されている |
| IaC | Bicep/ARM で主要な Azure リソースがコード化されており、環境差分はパラメータで吸収している |
| リリース | Blue/Green とカナリアリリースの運用パターンが決まっており、トリガー切替スクリプトが標準化されている |
| リリース | ロールバック手順(前リリースへの切り戻し)が自動化され、定期的にリハーサルされている |
| プロセス | 障害対応の Runbook と、SLA/SLO(遅延・エラー率・データ品質指標)が定義されている |
まとめ:Azureだけで反復可能なデータ運用を実現する
ここまで見てきたように、Azure にはデータフロー運用を自動化・省力化するための仕組みが一通り揃っています。ポイントをあらためて整理します。
- すべてを Azure Monitor に集約して、ログ・メトリクス・アラートを一元管理する
- 冪等設計(ウォーターマーク・MERGE・スナップショット)で「何度やり直しても安全」なパイプラインにする
- IaC + マルチステージ CI/CDで、環境間の再現性と監査性を担保する
- Blue/Green とカナリアリリースで、本番を止めずに変更しつつ即ロールバックできるようにする
これらを一度に完璧に整える必要はありません。まずは診断設定と簡易ダッシュボードから着手し、その後 CI/CD や Blue/Green に広げていくことで、段階的に「壊れにくく、運用しやすい Azure データ基盤」を育てていくことができます。

コメント