REST API
EMQXはOpenAPI(Swagger)3.0仕様に準拠したHTTP管理APIを公開しています。
EMQX起動後、http://localhost:18083/api-docs/index.html にアクセスするとAPIドキュメントを閲覧でき、Swagger UIから管理APIを実行できます。デフォルトでは、Dashboardの設定で swagger_support が true に設定されており、Swagger UIが有効であることを示しています。これにより、インタラクティブなAPIドキュメントの生成など、Swagger関連機能がすべて有効になります。無効化したい場合は false に設定してください。詳細はDashboard設定を参照してください。
本節ではEMQX REST APIの利用方法を紹介します。
基本パス
EMQXのREST APIはバージョン管理されており、EMQX 5.0.0以降のすべてのAPIパスは /api/v5 から始まります。
HTTPヘッダー
ほとんどのAPIリクエストでは Accept ヘッダーに application/json を設定する必要があり、指定がなければレスポンスはJSON形式で返されます。
HTTPレスポンスステータスコード
EMQXはHTTPレスポンスステータスコードの標準に準拠しています。主なステータスコードは以下の通りです。
| コード | 説明 |
|---|---|
| 200 | リクエスト成功。返却されるJSONデータに詳細が含まれます。 |
| 201 | 作成成功。新規オブジェクトがBodyに返されます。 |
| 204 | リクエスト成功。通常は削除や更新操作で、Bodyは空です。 |
| 400 | 不正なリクエスト。リクエストボディやパラメータのエラー。 |
| 401 | 認証エラー。APIキーが期限切れまたは存在しません。 |
| 403 | 禁止。オブジェクトが使用中、または依存関係の制約があります。 |
| 404 | 見つかりません。Bodyの message フィールドで理由を確認可能。 |
| 409 | コンフリクト。オブジェクトが既に存在するか、数の上限超過。 |
| 500 | サーバ内部エラー。Bodyやログで原因を確認してください。 |
認証
EMQXのREST APIは主にAPIキーを用いたBasic認証とBearerトークン認証の2種類をサポートしています。
APIキーを用いたBasic認証
この方法では、APIキーとシークレットキーをそれぞれユーザー名とパスワードとしてAPIリクエストを認証します。EMQXのREST APIはHTTP Basic Authenticationに準拠しており、これらの認証情報が必要です。EMQX REST APIを利用する前にAPIキーを作成してください。
注意
セキュリティ上の理由から、EMQX 5.0.0以降はDashboardユーザーの認証情報でREST APIを認証できません。代わりにAPIキーを作成し、認証に使用してください。
APIキーの作成
Dashboardの System -> API Key から手動でAPIキーを作成できます。詳細はSystem - API Keysを参照してください。
また、ブートストラップファイル方式でAPIキーを作成することも可能です。以下の設定ファイルでファイルパスを指定します。
api_key = {
bootstrap_file = "etc/default_api_key.conf"
}指定ファイル内に複数のAPIキーを以下の形式で改行区切りで記述します。
{API Key}:{Secret Key}:{?Role}- API Key:任意の文字列でキー識別子
- Secret Key:ランダムな文字列をシークレットキーとして使用
- Role(任意):キーのロールを指定
例:
my-app:AAA4A275-BEEC-4AF8-B70B-DAAC0341F8EB
ec3907f865805db0:Ee3taYltUKtoBVD9C3XjQl9C6NXheip8Z9B69BpUv5JxVHL:viewer
foo:3CA92E5F-30AB-41F5-B3E6-8D7E213BE97E:publisherこの方法で作成したAPIキーは無期限で有効です。
EMQX起動時にファイル内のデータがAPIキーリストに追加され、既存のAPIキーがあればSecret KeyとRoleが更新されます。
ロールと権限
REST APIはロールベースアクセス制御を実装しています。APIキー作成時に以下の3つの定義済みロールのいずれかを割り当てられます。
- Administrator:すべてのリソースにアクセス可能。ロール指定がない場合のデフォルト。ロール識別子は
administrator。 - Viewer:リソースやデータの閲覧のみ可能。REST APIのすべてのGETリクエストに対応。ロール識別子は
viewer。 - Publisher:MQTTメッセージのパブリッシュ専用。メッセージパブリッシュ関連APIのみアクセス可能。ロール識別子は
publisher。
APIキーを用いた認証方法
APIキーとシークレットキーを用いてリクエストを認証します。APIキーがユーザー名、シークレットキーがパスワードとしてBasic認証に利用されます。
各言語での例:
Bearerトークンを用いた認証
APIキー認証の代替として、Bearerトークンを使った安全かつプログラム的なEMQX REST APIアクセスが可能です。Bearerトークンは以下のログインAPIエンドポイントにリクエストを送信して取得します。
Bearerトークンの取得
以下のログインAPIエンドポイントにHTTP POST リクエストを送信してください。
POST http://your-emqx-address:8483/api/v5/loginヘッダー:
Content-Type: application/json
リクエストボディ:
{
"username": "admin",
"password": "yourpassword"
}your-emqx-addressはEMQXノードのアドレスまたはIPに置き換えてください。"admin"と"yourpassword"はEMQX Dashboardの認証情報に置き換えてください。
レスポンスにBearerトークンが含まれ、APIリクエストの認証に利用できます。
Bearerトークンを用いた認証方法
Bearerトークンを取得したら、APIリクエストの Authorization ヘッダーに以下のように含めてください。
--header "Authorization: Bearer <your-token>"ページネーション
大量データを扱う一部APIではページネーション機能が提供されています。データの特性に応じて2種類のページネーション方式があります。
ページ番号方式
ページネーション対応APIの多くは、page(ページ番号)と limit(ページサイズ)パラメータで制御します。最大ページサイズは 10000 です。limit 指定がない場合はデフォルトで 100 となります。
例:
GET /clients?page=1&limit=100レスポンスの meta フィールドにページネーション情報が含まれます。EMQXは検索条件付きリクエストの総件数を予測できないため、meta.hasnext フィールドで次ページの有無を示します。
{
"data":[],
"meta":{
"count":0,
"limit":20,
"page":1,
"hasnext":false
}
}カーソル方式
データが急速に変化し、ページ番号方式が非効率な一部APIではカーソル方式を採用しています。
position または cursor(開始位置)パラメータでデータの開始位置を指定し、limit(ページサイズ)パラメータで開始位置から取得する件数を指定します。最大ページサイズは 10000 です。limit 指定がない場合はデフォルトで 100 となります。
例:
GET /clients/{clientid}/mqueue_messages?position=1716187698257189921_0&limit=100レスポンスの meta フィールドにページネーション情報が含まれ、meta.position または meta.cursor に次ページの開始位置が示されます。
{
"meta": {
"start": "1716187698009179275_0",
"position": "1716187698491337643_0"
},
"data": [
{
"inserted_at": "1716187698260190832",
"publish_at": 1716187698260,
"from_clientid": "mqttx_70e2eecf_10",
"from_username": "undefined",
"msgid": "000618DD161F682DF4450000F4160011",
"mqueue_priority": 0,
"qos": 0,
"topic": "t/1",
"payload": "SGVsbG8gRnJvbSBNUVRUWCBDTEk="
}
]
}この方式はデータ変動が激しいシナリオで連続性と効率性を確保します。
エラーコード
HTTPレスポンスステータスコードに加え、EMQXは特定のエラーを識別するためのエラーコード一覧を定義しています。
エラー発生時はBodyにJSON形式でエラーコードが返されます。
# GET /clients/foo
{
"code": "RESOURCE_NOT_FOUND",
"reason": "Client id not found"
}| エラーコード | 説明 |
|---|---|
| WRONG_USERNAME_OR_PWD | ユーザー名またはパスワードが間違っています |
| WRONG_USERNAME_OR_PWD_OR_API_KEY_OR_API_SECRET | ユーザー名&パスワードまたはキー&シークレットが間違っています |
| BAD_REQUEST | リクエストパラメータが不正です |
| NOT_MATCH | 条件が一致しません |
| ALREADY_EXISTS | リソースが既に存在します |
| BAD_CONFIG_SCHEMA | 設定データが不正です |
| BAD_LISTENER_ID | リスナーIDが不正です |
| BAD_NODE_NAME | ノード名が不正です |
| BAD_RPC | RPC失敗。クラスター状態および対象ノードの状態を確認してください |
| BAD_TOPIC | トピックの構文エラー。トピックはMQTTプロトコル標準に準拠する必要があります |
| EXCEED_LIMIT | 作成リソースが最大または最小制限を超えています |
| INVALID_PARAMETER | リクエストパラメータが不正または境界値を超えています |
| CONFLICT | リクエストリソースに競合があります |
| NO_DEFAULT_VALUE | リクエストパラメータにデフォルト値が使用されていません |
| DEPENDENCY_EXISTS | リソースが他のリソースに依存しています |
| MESSAGE_ID_SCHEMA_ERROR | メッセージIDの解析エラー |
| INVALID_ID | IDスキーマが不正です |
| MESSAGE_ID_NOT_FOUND | メッセージIDが存在しません |
| NOT_FOUND | リソースが見つかりません |
| CLIENTID_NOT_FOUND | クライアントIDが見つかりません |
| CLIENT_NOT_FOUND | クライアントが見つかりません(通常はMQTTクライアントではない) |
| RESOURCE_NOT_FOUND | リソースが見つかりません |
| TOPIC_NOT_FOUND | トピックが見つかりません |
| USER_NOT_FOUND | ユーザーが見つかりません |
| INTERNAL_ERROR | サーバ内部エラー |
| SERVICE_UNAVAILABLE | サービス利用不可 |
| SOURCE_ERROR | ソースエラー |
| UPDATE_FAILED | 更新失敗 |
| REST_FAILED | リセットソースまたは設定失敗 |
| CLIENT_NOT_RESPONSE | クライアントが応答しません |