Fluentdのログを蓄積したい
複数サーバからFluentdでログを収集して分析する場合、ログの投入先としてはelasticsearchが鉄板だった。Fluentdでログを収集してelasticsearchに投入、Kibanaで可視化するEFKスタック。
これに対して最近ではGrafana Lokiという選択肢がある。Grafana Lokiはログの全文をインデキシングしないので、より低リソースで簡単に運用できるというメリットがある。とはいえ、ログの分析基盤を運用しようと思ったらそれなりに面倒だと考えていたら、Grafana LokiのマネージドサービスであるGrafana Cloudがあることを知った。Grafana Cloudはフリーアカウントもあり、毎月 10k metrics + 50GB logs + 50GB tracesまで無料で利用できる。個人利用であれば十分なリソースが使える。
このため、ログの収集分析の導入としてGrafana Cloudを利用する。
ログ転送にFluentdを選択する
Grafana LokiやGrafana Cloudにログ送信する場合、そのログ転送エージェントとしてPromtailが推奨されている。PromtailはGrafana LokiまたはGrafana Cloudにログ転送するためのエージェント。このため、Grafana LokiやGrafana Cloudを利用する場合は基本的にPromtailを選択すればよい。
一方で、PromtailはあくまでGrafana Lokiなどを想定しているため、それ以外のログ転送には利用できない。複数サーバから転送することなどを考えるとプラグインが豊富で自由なログ設定が可能なFluentdを選択したくなる。実際のところ、Grafana LokiはFluentd用のOutput Pluginが提供されているだけでなく、Fluent BitやLogstashもサポートされている。このため、まったくログ転送を行ったことがなければPromtailを選択すればよいが、過去の資産を流用したければそれらを継続することができる。
今回は既にFluentdを利用中なため、FluentdからGrafana Cloudにログ転送することを考える。
Fluentdのログ送信設定
Fluentdの設定は基本的にGrafana Lokiのドキュメントに従えばよい。ユーザごとに異なる設定としては、url、username、passwordがあり、ここを適切に設定する必要がある。
例えば、urlはGrafana Cloudのアカウントセットアップ時にどこのリージョンに環境構築したかによって変化する。また、Grafana Loki自体にはユーザ認証の機能はなく、nginx等でBasic認証の仕組みを構築する必要がある。Grafana CloudではBasic認証の仕組みを提供してくれており、Fluentdの設定としてusernameおよびpasswordを指定する場合はBasic認証を指定する。
urlやBasic認証情報はGrafana Cloud Portalから確認する。Lokiの詳細を確認するとurlやBasic認証が有効になっているかどうか、usernameやpasswordが確認できる。passwordはAPI keyを利用する仕組みになっており、この画面からでもAPI Keysの管理画面からでも新しく生成できる。権限としてはMetricsPublisher roleを指定すればよい。
ただし、ここでいうAPI keyとはGrafanaのAPI keyとは異なり、Grafana Stackで管理するAPI keyを指す。上記ドキュメントなどではGrafanaのダッシュボード上の操作を示しており、そちらでAPI keyを発行しても利用できないし、Grafana Cloud Portalで発行したAPI keyも確認できない。
これらを踏まえて、以下のような設定を行うことでGrafana Cloud上にログ転送できるようになる。
<match **>
@type loki
# シンガポールリージョンを選択したら以下のURLになった
url "https://logs-prod-011.grafana.net"
username "#{ENV['LOKI_USERNAME']}"
password "#{ENV['LOKI_PASSWORD']}"
flush_interval 10s
flush_at_shutdown true
buffer_chunk_limit 1m
extra_labels {"env":"dev"}
</match>