Grafana + Cloudflare Tunnelでどこでもメトリクス監視
はじめに
- Prometheus + Grafanaを使いたい
- 外からでもメトリクス監視したい
- ドメインは持ってるけど、グローバルIPを持っていない/安易に公開したくない
- 見れる人に制限をかけたい
こんな人向けです
セットアップ
今回はProxmox VE上のUbuntu 22.04.5 LTSで作業します
Dockerのインストール
公式サイトを見ながらDocker Engineをインストールします
docker -v
で正しくバージョンが出れば大丈夫です
$ docker -v
Docker version 27.4.0, build bde2b89
Cloudflareの設定
CloudflareのZero Trust設定ページに移動します
左側の[Networks]から[Tunnels]を選択し、[+ Create a tunnel]から新しいTunnelを作成します
作るトンネルの種類を選べと言われるので、左側のCloudflaredを選択します
トンネルに名前をつけます。外からは見えないので、あとから見てわかりやすい名前にしておくと良いです
Cloudflare Tunnelを動かす環境を選べと言われるので、ここでDockerを選択します
下にdocker run ...
のコマンドが出てると思いますが、これの末尾にくっついているtokenをコピーして、このページは一旦このままにしておきます
compose.ymlの作成
Prometheus, Grafana, Cloudflare Tunnelをまとめて実行するためのDocker Compose用ファイルを作ります
PrometheusとGrafanaのPortsはこの方法では使わないのでコメントアウトしていますが、必要ならアンコメントしてください
networks:
monitoring:
driver: bridge
volumes:
prometheus_data: {}
grafana_data: {}
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--web.enable-lifecycle'
# ports:
# - '9090:9090'
networks:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
# ports:
# - '3000:3000'
volumes:
- grafana_data:/var/lib/grafana
networks:
- monitoring
tunnel:
image: cloudflare/cloudflared:latest
container_name: tunnel
restart: unless-stopped
command:
- tunnel
- --no-autoupdate
- run
environment:
- TUNNEL_TOKEN=<ここにさっきのtokenをペースト>
networks:
- monitoring
<ここにさっきのtokenをペースト>
部分に先ほどコピーしたtokenを貼り付けます。
prometheus.ymlの作成
Prometheusがどのデータを取得するかを定義するprometheus.ymlを作成します。
global:
scrape_interval: 1m
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 1m
static_configs:
- targets: ['localhost:9090']
Dockerの起動
compose.yml
とprometheus.yml
があるフォルダ内でdocker compose up -d
します。
起動が完了したら、先ほどのCloudflare Tunnelの設定ページを見ます。
下のConnectorsにStatus: ConnectedのConnectorが出てきていたら成功です!
Applicationのポリシー設定
[Next]をクリックしていよいよドメイン設定…といきたいところですが、はじめにアクセスポリシーの設定をしておきます。
これをすることで自分しか見れないようにしたり、特定の組織内のメンバーしか見れないようにしたりできます。
トンネルのドメイン設定が終わると公開が始まってしまうので、事前にポリシーを設定しておくことで意図しない公開を防ぎます。
別タブを開き、先ほども開いたこのページに遷移します。
左側の[Access]から[Applications]を開き、Self-hostedを選択します。
Applicationの設定をします。
Application nameにはわかり易い名前をつけます。この名前は外から見られます。
Subdomainには任意のサブドメイン、DomainはCloudflareに登録したドメインの中から一つ選択します。
Warning: No DNS record found for this domain. The policy may not execute as expected.
が出ると思いますが、これはまだトンネルの設定をしていないからなのでとりあえず無視します。
下へスクロールし、Identity providers (以下IdP)の設定をします。
デフォルトではOne-time PIN(とGoogleだったっけ?)があると思いますが、Azure ADやGitHub、Google Workspaceなど様々なIdPを追加できます。
例えばGitHubを追加したかったら公式ドキュメントのここらへんを参考にすると良いでしょう。
ここではApplicationの認証に用いるIdPを自由に設定できます。ここはお好みでどうぞ。
[Next]を押して、ポリシーの設定に移ります。
Policy nameには何でも良いのでポリシーの名前を入力します。ActionはAllowのままにします。
次に、どのユーザが認証を通過するかの設定をします。
ここの説明はちょっと説明するには難しいので、ここを見てください。
一人しか使わないなら、SelectorにEmails、Valueに(IdPから渡される)自分のメールアドレスを設定しておくと良いと思います。
あとの設定はそのままにして、[Next]→[Add application]します。
そうしたら、トンネルを作成していたタブに戻ります。
トンネルの設定
さっき設定したのと同じサブドメインとドメインを設定します。
TypeにはHTTP、URLには<Grafanaのサービス名>:3000
を指定します。
上の例で言えば、Grafanaのサービス名
はgrafana
に相当します。
設定したら[Save tunnel]して、指定したドメインでアクセスできるか検証します。
Cloudflare Accessの認証要求が出てくると思うので、自分で設定した方法でログインします。
初回ロードは時間がかかるかもしれませんが、Welcome to Grafanaが出てきたら成功です!
初期ユーザ名とパスワードはどちらもadmin
になっているので、ログインしてデフォルトパスワードを変更しておきましょう。
おまけ: GrafanaでOAuthログイン
GrafanaもGitHubログインとかにしたいな~って人向けです
基本的にはここから好きな認証方法を選んで設定すればいいのですが、ちょっとした落とし穴があります。
Grafanaは自分自身がトンネルを通して公開されているのを知らないので、Callback URLがlocalhostになってしまいます
そこで、compose.ymlに一工夫をして正しい公開URLを教えてあげる必要があります。
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
# ports:
# - '3000:3000'
volumes:
- grafana_data:/var/lib/grafana
+ environment:
+ - GF_SERVER_DOMAIN=SUBDOMAIN.example.com
+ - GF_SERVER_ROOT_URL=https://SUBDOMAIN.example.com
networks:
- monitoring
これで適切なCallbackを指定してくれます!
おわりに
初めて記事を書きました!
なにか間違ってる点があったらコメントで教えていただけると助かります🙏
Discussion