スクエニ ITエンジニア ブログ

忙しい人のための Fluent Bit スターター

こんにちは。未だに競馬で当たったことがないホシイです。
今日も、クラウド機能をお手軽に使ってみるお試しネタをひとつお届けします。

オンプレでも Cloud Logging を使いたい…

ふだん GCE や GKE を使っていると、非常にすんなり Cloud Logging に log が入ってくれるので、オンプレサーバーを扱っているときにもこれが欲しくなります。というか、なんで無いんだ!という気持ちになります。

たとえば httpd の log を Cloud Logging で見たい!だけなのに、一直線のサンプルが見つからなかったのでつくってみました。

container でお試しセットをつくる

いつも思うんですが、目的の最小構成がすぐに確認できる container image があると便利だと思うんです。 ということで、container でやってみます。 今回はオンプレで使っているちょっと古めのサービスを想定して、最近活躍を見る機会が減ってきた (個人の感想)、Apache2 httpd さんを使ってみましょう。

以下のように、Fluent Bit と Apache2 を入れた Dockerfile をつくります。

FROM ubuntu

RUN apt update && DEBIAN_FRONTEND=noninteractive apt -y install --no-install-recommends \
  sudo git netcat wget gnupg ca-certificates apache2 && \
  # Add user & group
  groupadd demo && \
  useradd demo -g demo -m -s /bin/bash && \
  echo "demo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
  echo "done."

# Install Fluent Bit
RUN wget -qO - https://packages.fluentbit.io/fluentbit.key | apt-key add - && \
  echo "deb https://packages.fluentbit.io/ubuntu/focal focal main" | tee /etc/apt/sources.list.d/td-agent-bit.list && \
  apt update && DEBIAN_FRONTEND=noninteractive apt -y install --no-install-recommends \
    td-agent-bit && \
  mkdir /var/lock/subsys && \
  echo "done."

いちおう一般ユーザーを追加して sudo を使えるようにしているのと、Fluent Bit の install で apt source の追加が必要なようでちょっと手間ですね。

以下、この container image を build し、起動して container 内で作業します。

Fluent Bit の設定を書く

標準では /etc/td-agent-bit/td-agent-bit.conf に存在するようです。そのまま動くようにサンプルも含まれていますが、既存の [INPUT] [OUTPUT] は # でコメントアウトしておき、以下を追加します。

[INPUT]
    name   tail
    path   /var/log/apache2/access.log
    db     /run/fluent-bit-messages.state
    tag    in_apache2_access

[INPUT]
    name   tail
    path   /var/log/apache2/error.log
    db     /run/fluent-bit-messages.state
    tag    in_apache2_error

[FILTER]
    name apache_parser
    match in_apapche2_*
    key_name log
    parser apache2
    parser apache_error

# https://docs.fluentbit.io/manual/pipeline/outputs/stackdriver
[OUTPUT]
    name      stackdriver
    match     *
    google_service_credentials /workspaces/demo-fluentbit/google_service_credentials.json
    location  asia-northeast1
    namespace demo-fluentbit
    node_id   97ca692d67ae
    resource  global
    # export_to_project_id [project_id]

Apache2 の access.logerror.log を [INPUT] に追加し、それを apache_parser で読むようにして stackdriver output に出力する、という設定です。
StackDriver! ずいぶん前に GCP では “Operations Suite” と呼ばれるようになって使われることが無くなった名称ですが、Fluent Bit 公式の document ではまだ (記事作成時点では) でかでかと Stackdriver と書かれています。固有名詞があったほうがぐぐりやすいですし、わたしはこちらのほうが好きですよ。

さて、上で設定していますように service account とその key file が必要です。GCE instance であれば instance の service account を使うのが楽そうですが、ここではオンプレ相当を想定するので、手動で用意しておきます。詳細はここでは省略しますが、“Logs Writer” role を付与した service account を用意し、json key を発行したら上記 td-agent-bit.conf 内に設定した場所に json file として置いておきます。参考までに、権限が不足していると以下のようなエラーを吐きます。

[2022/03/06 11:22:56] [ warn] [output:stackdriver:stackdriver.0] error
{
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  }
}

試す

Apache2 を起動します。

$ sudo service apache2 start

続けて、Fluent Bit を起動します。こちらも service で起動したかったのですが、そのままではうまくいきませんでした。心残りですが、今回の記事のスコープからははずします。以下のように手元で起動します。

$ sudo /opt/td-agent-bit/bin/td-agent-bit --config=/etc/td-agent-bit/td-agent-bit.conf

さて、log は GCP へ送られたでしょうか? しばらくおいて、以下のようにして確認します。

$ gcloud logging read "resource.type=global"
---
insertId: efnda7fbt9j92
jsonPayload:
  log: '[Fri Mar 04 19:32:13.209634 2022] [mpm_event:notice] [pid 23991:tid 139714730204224]
    AH00491: caught SIGTERM, shutting down'
logName: projects/<project_id>/logs/demo-fluentbit
receiveTimestamp: '2022-03-06T02:43:51.592344969Z'
resource:
  labels:
    project_id: <project_id>
  type: global
timestamp: '2022-03-06T02:43:48.838077500Z'
  :
  :

よさそうです。
(もちろん、同様に GCP web console でも確認できます)

request したときの log は送信されるでしょうか。何度か apache に request を送って確認してみましょう。
今回何度か試したとろこでは request してから数秒程度で GCP 側で確認ができましたが、Stackdriver さんの調子によってはもうすこしかかることもあるかもしれません。

まとめ

もっともシンプルに、Apache2 log を Fluent Bit で Cloud Logging に送る例を作成しました。これを元に、他のサービスの log や format を変えたものなどを扱う試行錯誤ができそうです。まだまだオンプレサーバーを扱うこともありそうですが、log が一箇所で便利に見れるととても効率的です。今回できなかった Fluent Bit の service 起動や structured log、Big Query への出力などはまた別の機会にやってみたいと思います。

この記事を書いた人

記事一覧
SQUARE ENIXでは一緒に働く仲間を募集しています!
興味をお持ちいただけたら、ぜひ採用情報ページもご覧下さい!