# Azure SQL Database への MQTT データストリーム

[Azure SQL Database](https://azure.microsoft.com/en-us/products/azure-sql/database) は、Microsoft が提供するフルマネージドのリレーショナルデータベースサービスであり、高可用性、セキュリティ、スケーラビリティを備えた構造化データの管理を可能にします。EMQX Cloud と Azure SQL Database の統合により、MQTT データを信頼性高く構造化データベースに保存・管理でき、リアルタイム分析、レポーティング、下流処理を実現します。この統合により、EMQX は MQTT 対応デバイスと Azure SQL Database の間のブリッジとして機能し、IoT テレメトリをリレーショナルテーブルにシームレスに取り込みます。また、Power BI、Azure Synapse、Logic Apps などの他の Azure サービスとの連携も容易にし、高度な分析、可視化、自動化ワークフローをサポートします。

本ページでは、EMQX と Azure SQL Database の統合について包括的に解説します。Azure SQL Database コネクターの作成、ルールの設定、テスト方法を説明します。さらに、MQTT プロトコルを介してシミュレートされた温度・湿度データを EMQX Cloud に送信し、構成済みのデータ統合を通じて Azure Event Hubs に保存する方法も紹介します。

## 動作の仕組み

Azure SQL Database とのデータ統合は、EMQX Cloud の標準機能であり、EMQX のリアルタイムデバイス接続とメッセージ処理能力を Azure SQL Database の構造化ストレージおよびクエリ機能と組み合わせています。EMQX の組み込み[ルールエンジン](https://docs.emqx.com/en/cloud/latest/data_integration/rules.html)を使用することで、MQTT メッセージを複雑なコードを書くことなく変換、付加情報の追加、Azure SQL Database への保存が可能です。

全体の流れは以下の通りです：

1. **IoT デバイスがメッセージをパブリッシュ:** デバイスは MQTT プロトコルで EMQX に接続し、特定のトピックにテレメトリや状態更新、センサー情報をパブリッシュします。受信した各メッセージはルールエンジンをトリガーします。
2. **ルールエンジンがメッセージを処理:** EMQX の SQL ベースのルールエンジンが定義されたルールに基づきメッセージを評価します。メッセージはフィルタリング、変換、タイムスタンプやデバイスメタデータなどの付加情報の追加が行われてから保存されます。
3. **Azure SQL Database へのデータ書き込み:** ルール設定に基づき、処理済みメッセージは Azure SQL Database の特定テーブル・カラムに挿入または更新されます。SQL テンプレートによりメッセージフィールドとデータベースカラムの正確なマッピングが可能で、構造化かつ一貫した保存を保証します。
4. **データの保存と活用:** 保存された IoT データは即座にクエリ、レポート、分析に利用可能です。また、Power BI、Synapse Analytics、Logic Apps などの他 Azure サービスと連携し、可視化、自動化ワークフロー、高度な処理を実現します。

この統合を活用することで、リアルタイムデータ取り込み、構造化ストレージ、シームレスな分析を組み合わせたフルマネージドの IoT データパイプラインを構築でき、デバイスのテレメトリから迅速な洞察と運用インテリジェンスを得られます。

## 特徴と利点

EMQX Cloud と Azure SQL Database のデータ統合は、以下の機能とメリットを提供します：

**リアルタイム IoT データ取り込み:** EMQX は高頻度の MQTT メッセージを直接 Azure SQL Database に処理・転送でき、即時保存とリアルタイムでの監視、分析、運用ワークフローへの対応が可能です。

**構造化かつクエリ可能なストレージ:** Azure SQL Database はスキーマ、制約、インデックスを完全サポートするリレーショナルテーブルに IoT データを保存します。この構造により正確なクエリ、レポート、履歴分析が可能となり、デバイスデータから実用的なインサイトを得やすくなります。

**前処理とデータ変換:** EMQX の SQL ベースのルールエンジンにより、メッセージは Azure SQL Database に届く前にフィルタリング、付加情報追加、集約、再フォーマットが可能です。これにより関連性の高い整形済みデータのみを保存し、下流処理の複雑さを軽減します。

**スケーラブルで高性能:** EMQX と Azure SQL Database は水平・垂直スケーリングに対応しています。EMQX は数百万の MQTT 接続を処理可能であり、Azure SQL Database は増加するデータ量に応じてコンピューティングとストレージを自動的にスケールし、性能を維持します。

## はじめる前に

このセクションでは、Azure SQL Database データ統合を作成する前に必要な準備について説明します。まだ作成していない場合は Azure SQL Database インスタンスを作成し、SQL サーバーとネットワークアクセスルールを設定し、MQTT メッセージ保存用のデータベースとテーブルを用意してください。また、後で EMQX Cloud で使用するための接続情報も準備しておきます。

### 前提条件

- [ルール](https://docs.emqx.com/en/cloud/latest/data_integration/rules.html)の理解
- [データ統合](https://docs.emqx.com/en/cloud/latest/data_integration/introduction.html)の理解

### ネットワークの設定

<!--@include: ./network-setting.md-->

### Azure SQL Database のセットアップ

MQTT メッセージを保存するための Azure SQL Database インスタンスの作成方法を説明します。既にデータベースをお持ちの場合はこのステップをスキップし、プライベートエンドポイントの作成に進んでください。

1. Azure ポータルで **Azure SQL | SQL databases** サービスページに移動し、**作成** を選択します。
2. **SQL データベースの作成** フォームの **基本** タブで以下を設定します：
    - **サブスクリプション**：希望の Azure サブスクリプションを選択します。
    - **リソースグループ**：既存のリソースグループを選択するか、**新規作成** を選択します。
    - **データベース名**：後でコネクター作成時に使用する名前を入力します。本ガイドでは `emqx` を使用します。
    - **サーバー**：**新規作成** を選択し、フォームに入力します：
        - **サーバー名**：サーバーの名前を入力します。
        - **場所**：EMQX のデプロイと同じリージョンを選択します。
        - **認証方法**：**SQL 認証を使用** を選択します。
        - **サーバー管理者ログイン / パスワード**：Azure の要件を満たすユーザー名とパスワードを入力し、後で接続・コネクター作成時に使用できるよう控えておきます。
3. その他のオプションは必要に応じて設定してください。
4. **OK** を選択してサーバー作成を完了します。
5. **SQL データベースの作成** フォームに戻り、**次へ: ネットワーク** を選択して続行します。

### プライベートエンドポイントの作成

Azure SQL Database への安全なネットワークアクセスを有効にするため、プライベートエンドポイントを作成します。

- 既にデータベースがある場合は、**概要 → プロパティ → ネットワーク → プライベート → + プライベートエンドポイントの追加** に進みます。
- 前節でデータベースを作成した場合は、**ネットワーク** タブに直接 **+ プライベートエンドポイントの追加** ボタンがあります。
1. **プライベートエンドポイントの作成** フォームで、希望のサブスクリプション、リソースグループ、仮想ネットワーク、サブネットを選択します。
2. DNS 設定では、**プライベート DNS ゾーンと統合** を **はい** のままにし、デフォルトの **プライベート DNS ゾーン** をそのまま使用します。
3. **OK** を選択します。プライベートエンドポイントが作成されると、ステータスは **Succeeded** と表示されます。
4. **プライベートエンドポイント → 設定 → DNS 設定** から **IP アドレス** と **FQDN** を控えておきます。

### データベースとデータテーブルの作成

Azure SQL Database に接続し、MQTT データ保存用のテーブルを作成する方法を説明します。接続方法はいくつかありますが、ここでは Azure ポータルの **クエリエディター** を使用した手順を示します。

1. [こちらの Azure 公式ドキュメント](https://learn.microsoft.com/en-us/azure/azure-sql/database/design-first-database-tutorial?view=azuresql&tabs=queryeditor#create-a-server-level-ip-firewall-rule)に従い、サーバーレベルの IP ファイアウォールルールを作成します。
2. SQL データベースの **概要** ページで、左メニューから **クエリエディター (プレビュー)** を選択します。
3. サインイン画面でデータベース接続用の認証情報を入力します。
4. 以下の SQL コマンドを実行し、`temp_hum` テーブルを作成します。このテーブルはデバイスから報告される温度・湿度データの保存に使用します。

```sql
 CREATE TABLE temp_hum(
   client_id VARCHAR(64) NULL,
   temp NVARCHAR(100) NULL,
   hum NVARCHAR(100) NULL,
   up_timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
 );
 GO;
```

## Microsoft SQL Server コネクターの作成

データ統合ルールを作成する前に、Azure SQL サーバーにアクセスするための Microsoft SQL Server コネクターを作成する必要があります。

1. デプロイメントに移動し、左ナビゲーションメニューから **データ統合** を選択します。
2. 初めてコネクターを作成する場合は、**データパーシステンス** カテゴリの下にある **Microsoft SQL Server** を選択します。既にコネクターを作成済みの場合は、**新規コネクター** を選択し、続けて **データパーシステンス** カテゴリの下の **Microsoft SQL Server** を選択します。
3. **コネクター名**：システムが自動的にコネクター名を生成します。
4. 接続情報を入力します：
    - **サーバーホスト**：サーバーの IP アドレスとポート（デフォルトポートは 1433）。
    - **データベース名**：作成したデータベース名（例：`emqx`）。
    - **ユーザー名**：`username@FQDN` 形式で入力します。例：ユーザー名が `sa`、FQDN が `emqx-test.database.windows.net` の場合は `sa@emqx-test.database.windows.net` と入力します。
    - **パスワード**：SQL Server アカウントのパスワードを入力します。
    - **SQL Server ドライバー名**：EMQX Cloud にデフォルトでインストールされている `ODBC Driver 17 for SQL Server` を入力します。
5. **テスト** ボタンをクリックします。Microsoft SQL Server サービスにアクセス可能であれば成功メッセージが表示されます。
6. **新規作成** ボタンをクリックして作成を完了します。

## ルールの作成

次に、書き込むデータを指定し、処理済みデータを Azure SQL Database に転送するアクションをルールに追加します。

1. ルールエリアの **新規ルール** をクリックするか、作成したコネクターの **アクション** 列にある新規ルールアイコンをクリックします。

2. **SQL エディター** にルールマッチング用の SQL 文を入力します。以下の例は、`temp_hum/emqx` トピックに送信されたメッセージから報告時間 `up_timestamp`、クライアント ID、メッセージ本文（ペイロード）から温度と湿度を抽出します。

   ```sql
    SELECT 
      timestamp as up_timestamp, 
      clientid as client_id, 
      payload.temp as temp,
      payload.hum as hum
    FROM
      "temp_hum/emqx"
   ```

   ::: tip

   初心者の方は、**SQL Examples** をクリックし、**Try It Out** で SQL ルールを学習・テストすることをおすすめします。

   :::

3. **次へ** をクリックしてアクションを追加します。

4. **コネクター** ドロップダウンから先ほど作成したコネクターを選択します。

5. 使用する機能に基づいて **SQL テンプレート** を設定します。これは前処理済みの SQL なので、フィールドは引用符で囲まず、文末にセミコロンを付けないでください。

   ```sql
    INSERT INTO temp_hum(client_id, temp, hum)
    VALUES (
      ${client_id},
      ${temp},
      ${hum}
    )
   ```

   SQL テンプレート内でプレースホルダー変数が未定義の場合、**SQL テンプレート** 上部の **Undefined Vars as Null** スイッチでルールエンジンの動作を切り替えられます：

   - **無効**（デフォルト）：ルールエンジンは文字列 `undefined` をデータベースに挿入します。

   - **有効**：変数が未定義の場合、ルールエンジンは `NULL` を挿入します。

     ::: tip

     可能な限りこのオプションは有効にしてください。無効にするのは後方互換性確保のためのみです。

     :::

6. 詳細設定（任意）を行います。

7. **確認** ボタンをクリックしてルール作成を完了します。

8. **新規ルール作成成功** ポップアップで **ルールに戻る** をクリックし、データ統合設定の一連の流れが完了します。

## ルールのテスト

[MQTTX](https://mqttx.app/) を使って温度・湿度データの報告をシミュレートすることを推奨しますが、他の任意のクライアントでも構いません。

1. MQTTX を使ってデプロイメントに接続し、以下のトピックにメッセージを送信します。
   - トピック：`temp_hum/emqx`
   - ペイロード：

     ```json
     {
       "temp": "27.5",
       "hum": "41.8"
     }
     ```
2. メッセージが Azure SQL Database に転送されているか確認します。
3. コンソールで運用データを確認します。ルール一覧でルール ID をクリックすると、ルールの統計情報およびそのルール配下の全アクションの統計情報が表示されます。
