はじめに
前回の記事では、Azure Data Factory (ADF)を使って「手動」でデータをコピーする手順を紹介しました。 今回はそれを発展させ、「Blob Storage に CSV を置くだけ」 で自動的にパイプラインが起動し、SQL Database へ取り込む仕組み(イベントトリガー)を構築します。
- 「ファイルを置くだけ」 で動く自動化パイプラインの構築
- ADF イベントトリガー(Blob Created)の設定手順
- ファイル名を動的に受け渡す パラメータ設定 の方法

全体アーキテクチャ
構成は以下のとおり前回と同じです。

ユーザーが Blob Storage の raw/inbox/ にファイルを配置
ADF の「Storage Event Trigger」がファイルの作成を検知
ADF がデータをコピーし、SQL Database(サーバーレス)へ追記
Power BI(DirectQuery)で最新データを表示
導入手順
ストレージ(ADLS Gen2)の準備
まずはデータレイクとなるストレージを作成し、テストデータを配置します。
Azure ポータルから「ストレージアカウント」を作成します。「階層型名前空間(HNS)」の有効化が重要です。
- リソースグループ:
rg-lake-demo - アカウント名:
stlakedemo01 - リージョン: Japan West
- 詳細設定: 階層型名前空間(HNS)を「有効」 にする
- その他: Standard / LRS
リソース作成後、CSV を格納するフォルダを作成します。
- 作成したストレージを開き、左メニュー「コンテナー」へ
- 「+ コンテナー」 で名前
rawを作成(アクセスレベル: 非公開) rawコンテナの中に、サブフォルダinboxを作成します。
raw/
└── inbox/

ユーザーの運用は、この inbox フォルダにファイルをアップロードするだけです。これをトリガーに自動処理が走ります。
SQL Database(サーバーレス)の準備
データの格納先を用意します。コストを抑えるため「サーバーレス」を選択します。
Azure ポータルから「SQL データベース」を作成します。
- DB 名:
sqlauto - サーバー: 新規作成
sqlsrv-auto01(Japan East) - コンピューティング: サーバーレスを選択
- 自動一時停止: ON(1時間)


ADF や自分の PC から接続できるようにします。
- 概要ページ上部の「サーバーのファイアウォールの設定」をクリック。
- 「Azure サービスおよびリソースがこのサーバーにアクセスすることを許可」 を ON にします。
- 「現在のクライアント IP を追加」もクリックして保存します。


「クエリエディター」を開き、以下の SQL を実行してテーブルを作成します。
CREATE TABLE dbo.TableTennisDemo (
Rally INT,
[Server] NVARCHAR(50),
Winner NVARCHAR(50),
ServeType NVARCHAR(100),
Outcome NVARCHAR(100),
Axis NVARCHAR(50),
SpinClass NVARCHAR(50),
[Length] NVARCHAR(50),
Course NVARCHAR(50),
Contact NVARCHAR(50) NULL,
SetNumber INT,
match_id NVARCHAR(50),
created_at DATETIME2,
player NVARCHAR(50),
opponent NVARCHAR(50)
);

テーブルが作成されたか確認します。
SELECT COUNT(*) AS cnt FROM sys.tables WHERE name = 'TableTennisDemo';結果の cnt が 1 ならOKです。
Data Factory の構築
ここからパイプラインを作成します。今回は「パラメータ」を使ってファイル名を動的に扱う点がポイントです。
Azure ポータルから「Data Factory」を作成し、ADF Studio(管理画面)を開きます。
- 名前:
adf-lakedemo - リージョン: Japan East
- Azure Data Lake Storage Gen2
- 名前:
ls_adls - アカウント:
stlakedemo01
- 名前:
- Azure SQL Database
- 名前:
ls_sqlauto - サーバー:
sqlsrv-auto01.../ DB:sqlauto
- 名前:
ここが重要です。ファイル名をパラメータ化します。
- 「データセット」新規作成 → Azure Data Lake Storage Gen2 (DelimitedText)
- 名前:
ds_raw_csv/ コンテナ:raw - 「パラメータ」タブで以下を追加:
folder(String)file(String)
- 「接続」タブに戻り、ファイルパスの入力欄で「動的なコンテンツ」を選び、以下を設定します。
Directory = @{dataset().folder}
File = @{dataset().file}

- 「データセット」新規作成 → Azure SQL Database
- 名前:
ds_sql_tennis - テーブル:
dbo.TableTennisDemoを選択
- 新規パイプライン
pl_inbox_to_sqlを作成 - キャンバスの空白部分をクリックし、「パラメータ」タブで以下を追加
p_folder(String)p_file(String)
- 「Copy data」アクティビティを配置し、設定します。
- ソース:
ds_raw_csv - データセットプロパティ:
- folder =
@pipeline().parameters.p_folder - file =
@pipeline().parameters.p_file
- folder =
- ソース:
- シンク:
ds_sql_tennis
- Copy data の「マッピング」タブを開く。
- 「スキーマのインポート」をクリックし、パラメータに仮の値を入力して読み込む。
p_folder→inboxp_file→demodata.csv
- 列が表示されたら、
Set列をSetNumberに紐付け直します。 - 最後に左上の「すべて発行」をクリックします。


イベントトリガーの設定
最後に、ファイルが置かれたらパイプラインが動くように設定します。
「管理」→「トリガー」→「+ 新規」をクリックします。
- 名前:
trg_inbox_to_sql - 種類: ストレージイベント(Blob created)
- コンテナ:
raw - Blob パス末尾:
.csv
「次へ」進み、実行するパイプラインに pl_inbox_to_sql を選択します。 パラメータの設定画面で、トリガーからファイル情報を受け渡す記述を行います。
- p_file:
@{triggerBody().fileName} - p_folder:
@{triggerBody().folderPath}
環境によっては folderPath に raw/ が含まれてパスがズレる場合があります。その場合は以下のように replace 関数を使います。 @{replace(triggerBody().folderPath, 'raw/', '')}
- トリガーを作成し、「すべて発行」します。
- トリガーの状態が「有効」になっていることを確認します。
- 実際に
raw/inbox/に新しい CSV をアップロードし、パイプラインが自動起動するか確認しましょう。
Power BI との連携
SQL Database に蓄積されたデータを、Power BI で可視化します。
今回はリアルタイム性を重視し、DirectQuery モードを使用します。
- Power BI Desktop を起動し、「データの取得」→「Azure SQL Database」を選択。
- 以下の情報を入力して接続します。
- サーバー:
sqlsrv-auto01.database.windows.net - データベース:
sqlauto - データ接続モード: DirectQuery


フィールド一覧に dbo.TableTennisDemo テーブルが表示されます。 これらをキャンバスにドラッグ&ドロップして、グラフや表を作成します。


- 手動更新: Power BI Desktop 上部の「更新」ボタンを押すと最新化されます。
- Auto page refresh: Premium 機能などを使い、数分ごとに自動更新させることも可能です。
- Import + スケジュール: DirectQuery ではなく「インポート」モードを選んだ場合は、Power BI Service 上で1日8回などのスケジュール更新が設定できます。
動作確認
実際に新しいファイルを置いて、全自動で反映されるかテストします。
Storage Explorer や Azure ポータルを使い、raw/inbox/ フォルダに新しいファイル(例:demodata_new.csv)をアップロードします。
参考: demodata_new.csv の中身
Rally,Server,Winner,ServeType,Outcome,Axis,SpinClass,Length,Course,Contact,Set,match_id,created_at,player,opponent
1,Alice,Alice,Forehand,Winner,Right,Topspin,Short,Forehand,None,1,M001,2025-09-30 10:00:00,Alice,Bob
2,Bob,Alice,Backhand,Error,Left,Backspin,Long,Backhand,Edge,1,M001,2025-09-30 10:01:00,Alice,Bob
3,Charlie,Charlie,Reverse sidespin serve,Service ace,Right,Topspin,Half-long,Middle,,2,M002,2025-10-01 09:00:00,Charlie,Dana
4,Dana,Charlie,Vertical-spin serve,Rally won,Left,Non-backspin,Long,Forehand,,2,M002,2025-10-01 09:05:00,Charlie,Dana

ADF Studio の「Monitor(監視)」タブを開きます。 ファイルのアップロードを検知してパイプラインが自動起動し、ステータスが Succeeded になっていることを確認します。


SQL Database 側に行数が増えていることをクエリで確認するか、Power BI の「更新」ボタンを押してグラフが変化することを確認します。


データ削除(クリーンアップ)について
検証を繰り返すとデータが重複してしまいます。 データをリセットしたい場合、以下の2つの方法があります。
Azure ポータルの「クエリエディター」から SQL を実行して削除します。
全件削除: テーブルを空にし、ID の連番もリセットします。
TRUNCATE TABLE dbo.TableTennisDemo;条件削除: 特定の日付以前のデータのみ削除します。
DELETE FROM dbo.TableTennisDemo
WHERE created_at < '2025-09-30';ファイルを取り込む前に、自動的に既存データを消す設定です。
ADF パイプラインの「Copy Data」アクティビティの前段に、Script Activity を追加し、以下のクエリを設定します。
TRUNCATE TABLE dbo.TableTennisDemo;これを組み込んでおくと、常にクリーンな状態で検証できるため、テスト環境では非常に便利です。
まとめ
今回の仕組みにより、ユーザー側は 「CSV をアップロードするだけ」 でデータが自動的に SQL に取り込まれ、Power BI で最新の可視化が可能になりました。メリットは以下のとおりです。
| 項目 | メリット |
|---|---|
| 運用コスト | ファイルを置くだけで OK。Functions 等と比較しても保守が容易 |
| 導入コスト | ほぼ GUI 操作のみで構築可能。コードレスで短期間導入できる。 |
| 拡張性 | フォルダ追加で他データにも対応可能。API 連携などでさらに高度化も。 |
以上、最後までお読みいただきありがとうございました。







