📈

Grafana + Cloudflare Tunnelでどこでもメトリクス監視

2024/12/14に公開

はじめに

  • Prometheus + Grafanaを使いたい
  • 外からでもメトリクス監視したい
  • ドメインは持ってるけど、グローバルIPを持っていない/安易に公開したくない
  • 見れる人に制限をかけたい

こんな人向けです

セットアップ

今回はProxmox VE上のUbuntu 22.04.5 LTSで作業します

Dockerのインストール

公式サイトを見ながらDocker Engineをインストールします

https://docs.docker.com/engine/install/
docker -vで正しくバージョンが出れば大丈夫です

$ docker -v
Docker version 27.4.0, build bde2b89

Cloudflareの設定

CloudflareのZero Trust設定ページに移動します

https://one.dash.cloudflare.com/

左側の[Networks]から[Tunnels]を選択し、[+ Create a tunnel]から新しいTunnelを作成します
Zero Trustのダッシュボード

作るトンネルの種類を選べと言われるので、左側のCloudflaredを選択します

Cloudflared を選択する

トンネルに名前をつけます。外からは見えないので、あとから見てわかりやすい名前にしておくと良いです

Tunnelの名前をつける

Cloudflare Tunnelを動かす環境を選べと言われるので、ここでDockerを選択します

Tunnelの接続設定

下にdocker run ...のコマンドが出てると思いますが、これの末尾にくっついているtokenをコピーして、このページは一旦このままにしておきます

compose.ymlの作成

Prometheus, Grafana, Cloudflare Tunnelをまとめて実行するためのDocker Compose用ファイルを作ります
PrometheusとGrafanaのPortsはこの方法では使わないのでコメントアウトしていますが、必要ならアンコメントしてください

compose.yml
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を作成します。

prometheus.yml
global:
  scrape_interval: 1m

scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 1m
    static_configs:
      - targets: ['localhost:9090']

Dockerの起動

compose.ymlprometheus.ymlがあるフォルダ内でdocker compose up -dします。
起動が完了したら、先ほどのCloudflare Tunnelの設定ページを見ます。
下のConnectorsにStatus: ConnectedのConnectorが出てきていたら成功です!

Connectorの作成

Applicationのポリシー設定

[Next]をクリックしていよいよドメイン設定…といきたいところですが、はじめにアクセスポリシーの設定をしておきます。
これをすることで自分しか見れないようにしたり、特定の組織内のメンバーしか見れないようにしたりできます。
トンネルのドメイン設定が終わると公開が始まってしまうので、事前にポリシーを設定しておくことで意図しない公開を防ぎます。

別タブを開き、先ほども開いたこのページに遷移します。
https://one.dash.cloudflare.com/

左側の[Access]から[Applications]を開き、Self-hostedを選択します。

Applicationの追加

Applicationの設定をします。
Application nameにはわかり易い名前をつけます。この名前は外から見られます。
Subdomainには任意のサブドメイン、DomainはCloudflareに登録したドメインの中から一つ選択します。
Warning: No DNS record found for this domain. The policy may not execute as expected.が出ると思いますが、これはまだトンネルの設定をしていないからなのでとりあえず無視します。

Applicationのドメイン設定

下へスクロールし、Identity providers (以下IdP)の設定をします。
デフォルトではOne-time PIN(とGoogleだったっけ?)があると思いますが、Azure ADやGitHub、Google Workspaceなど様々なIdPを追加できます。
例えばGitHubを追加したかったら公式ドキュメントのここらへんを参考にすると良いでしょう。
https://developers.cloudflare.com/cloudflare-one/identity/idp-integration/github/

ここではApplicationの認証に用いるIdPを自由に設定できます。ここはお好みでどうぞ。

IdPの設定

[Next]を押して、ポリシーの設定に移ります。

Policy nameには何でも良いのでポリシーの名前を入力します。ActionはAllowのままにします。

ポリシーの設定

次に、どのユーザが認証を通過するかの設定をします。
ここの説明はちょっと説明するには難しいので、ここを見てください。
https://developers.cloudflare.com/cloudflare-one/policies/access/

一人しか使わないなら、SelectorにEmails、Valueに(IdPから渡される)自分のメールアドレスを設定しておくと良いと思います。

ルールの設定

あとの設定はそのままにして、[Next]→[Add application]します。

そうしたら、トンネルを作成していたタブに戻ります。

トンネルの設定

さっき設定したのと同じサブドメインとドメインを設定します。

TypeにはHTTP、URLには<Grafanaのサービス名>:3000を指定します。
上の例で言えば、Grafanaのサービス名grafanaに相当します。

トンネルのドメイン設定

設定したら[Save tunnel]して、指定したドメインでアクセスできるか検証します。

Cloudflare Accessの認証要求が出てくると思うので、自分で設定した方法でログインします。

Cloudflare Accessの認証要求画面

初回ロードは時間がかかるかもしれませんが、Welcome to Grafanaが出てきたら成功です!
Welcome to Grafana

初期ユーザ名とパスワードはどちらもadminになっているので、ログインしてデフォルトパスワードを変更しておきましょう。

おまけ: GrafanaでOAuthログイン

GrafanaもGitHubログインとかにしたいな~って人向けです

基本的にはここから好きな認証方法を選んで設定すればいいのですが、ちょっとした落とし穴があります。
https://grafana.com/docs/grafana/next/setup-grafana/configure-security/configure-authentication/

Grafanaは自分自身がトンネルを通して公開されているのを知らないので、Callback URLがlocalhostになってしまいます
そこで、compose.ymlに一工夫をして正しい公開URLを教えてあげる必要があります。

compose.yml
  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