InfluxDB の WebAPI エンドポイントに認証機能を追加してデータ取得まで行う

OS:Amazon Linux 2(Centos 7 互換) version: InfluxDB 1.6

InfluxDB 1.6 を install すると最初は、WebAPI エンドポイントが有効になっていない。 これを有効にするために設定ファイルを変更する必要がある。

/etc/influxdb/influxdb.conf

変更例

[http]
  # Determines whether HTTP endpoint is enabled.
  enabled = true

  # The bind address used by the HTTP service.
  bind-address = ":8086"

  # Determines whether user authentication is enabled over HTTP/HTTPS.
  auth-enabled = true

  # The default realm sent back when issuing a basic auth challenge.
  # realm = "InfluxDB"

  # Determines whether HTTP request logging is enabled.
  log-enabled = true
  ...

WebAPI エンドポイントを有効にするために [http] の項目で enabled = true にする。 バインドするポート番号 bind-address、認証機能を有効にするための auth-enabled = true , HTTP のリクエストのロギング有効化 log-enabled = true 等を設定する。 その他はお好きなように。(参考)Configuring InfluxDB OSS | InfluxData Documentation

設定を反映するために influxdb を再起動する

$ sudo systemctl restart influxdb

POST パラメータのq に influx QL を記述してエンドポイントを curl で叩く。認証機能を有効にして、admin ユーザが作られていない状況でエンドポイントを叩くと、最初に admin ユーザを作れと 403 Error になる。

$ curl -i -X POST http://localhost:8086/query --data-urlencode "q=SHOW USERS"
HTTP/1.1 403 Forbidden
Content-Type: application/json
Request-Id: d474184a-a854-11e8-8001-000000000000
X-Influxdb-Build: OSS
X-Influxdb-Error: error authorizing query: create admin user first or disable authentication
X-Influxdb-Version: 1.6.1
X-Request-Id: d474184a-a854-11e8-8001-000000000000
Date: Sat, 25 Aug 2018 10:51:32 GMT
Content-Length: 87

{"error":"error authorizing query: create admin user first or disable authentication"}

そのため、まずは admin ユーザを作成する(最初の admin ユーザの作成は認証しなくてもクエリが成功する)。

$ curl -X POST http://localhost:8086/query --data-urlencode "q=CREATE USER root WITH PASSWORD 'root' WITH ALL PRIVILEGES"

作成した admin ユーザの情報を用いて、エンドポイントを叩くことが可能になる。

$ curl -X POST http://localhost:8086/query -u root:root --data-urlencode "q=SHOW USERS"
{"results":[{"statement_id":0,"series":[{"columns":["user","admin"],"values":[["root",true]]}]}]}
$ 
$ curl -X POST http://localhost:8086/query?db=mydb -u root:root --data-urlencode 'q=SELECT * FROM cpu'
{"results":[{"statement_id":0,"series":[{"name":"cpu","columns":["time","host","region","value","value2"],"values":[["2018-08-25T03:12:37.911702475Z","serverA","us_west",0.64,null],["2018-08-25T03:13:44.479107406Z","serverB","us_east",0.1,null],["2018-08-25T03:14:13.822910528Z","serverB",null,0.1,null],["2018-08-25T03:34:49.405686775Z","serverB","us_east",0.1,"hoge"]]}]}]}