オンプレ VM から Fluent Bit を使用して Cloud Logging へのログ送信

## はじめに
オンプレ環境のログを Cloud Logging に格納する方法として Fluent Bit を使用したのでその内容を記載する
Cloud Logging 自体と Fluentd を使用した方法は下記[別記事](https://qiita.com/suzuyui/items/a561f92639ab57639045)に書いている

https://qiita.com/suzuyui/items/a561f92639ab57639045

## Fluent Bit
[Fluent Bit](https://fluentbit.io/) は元々は [Treasure Data 社](https://www.treasuredata.co.jp/)が開発し、現在はベンターニュートラル/コミュニティ主導・Apache Licensev2.0 で開発が進めれている、軽量ログ/メトリクスコレクタ
CNCF の Fluentd 傘下のサブプロジェクトとして管理されている
パフォーマンスに重きを置いて開発され、実装には C 言語が使用され、fluentd と比較して軽量に動作する



### Google Cloud における Fluent Bit
Google Cloud では、従来の fluentd 拡張の Logging エージェントから、
Logging については Fluent Bit ベースになる [Ops エージェント](https://cloud.google.com/logging/docs/agent/ops-agent?hl=ja) へ置き換えが進めれている
また、[GKE に関しては、1.17 以降](https://cloud.google.com/stackdriver/docs/solutions/gke/managing-logs?hl=ja#defaults)ですでに Fluent Bit ベースに置き換えがされている

### Stackdriver output plugin 

Fluent Bit はデフォルトで DATAPLANE の OUTPUTS で [Stackdriver に対応](https://docs.fluentbit.io/manual/pipeline/outputs/stackdriver)しており、Cloud Logging へログ送付が可能となっている

https://docs.fluentbit.io/manual/pipeline/outputs/stackdriver

## 設定・実施 (オンプレ VM (CentOS)へインストール, Cloud Logging ログ送付テスト)
実際にオンプレ環境から Cloud Logging へのログ送付を行う
ここでのオンプレ環境の VM としては CentOS を使用している
設定には Ansible で実施したため task の yaml 例も合わせて記載する

### 前提条件
下記にログ送付先の Google Cloud プロジェクトのサービスアカウントのクレデンシャルキーを配置する ([参考](https://qiita.com/suzuyui/items/a561f92639ab57639045#%E3%83%AD%E3%82%B0%E7%94%A8%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E4%BD%9C%E6%88%90)) 
`/etc/google/auth/application_default_credentials.json`

### 実施順番
1. fluentbit install
1. fluentbit 設定
1. ログ転送確認

#### 1. fluentbit install
さまざまなプラットフォームへのインストールとして[パッケージが用意されている](https://docs.fluentbit.io/manual/installation/linux)
今回は [Yum 用の設定](https://docs.fluentbit.io/manual/installation/linux/redhat-centos#configure-yum)をしてインストールする

##### 1.1. パッケージ設定

手動で設定する場合と、Ansible で設定する場合の 2パターンを示す

手動の場合は、`/etc/yum.repos.d/`の下に、下記ファイルを設置する

```/etc/yum.repos.d/td-agent-bit.repo
[td-agent-bit]
name = TD Agent Bit
baseurl = https://packages.fluentbit.io/centos/7/$basearch/
gpgcheck=1
gpgkey=https://packages.fluentbit.io/fluentbit.key
enabled=1
```

ansible で設置する場合は、下記の通り

```yaml:/etc/ansible/roles/td-agent-bit/tasks/main.yaml(package箇所抜粋)
---
# https://docs.fluentbit.io/manual/installation/linux/redhat-centos
- name: Add td-agent repository
  yum_repository:
    name: td-agent-bit
    description: TD Agent Bit
    baseurl: https://packages.fluentbit.io/centos/7/$basearch/
    gpgkey: https://packages.fluentbit.io/fluentbit.key
    gpgcheck: yes
  become: true
  when:
    - ansible_distribution == "CentOS"
```

以上で YUM でのインストールができるようになる

##### 1.2. install

パッケージ設定を実施したので yum で install する

```sh
$ yum install td-agent-bit
```

Ansible で実施すると下記の通り

```yml:/etc/ansible/roles/td-agent-bit/tasks/main.yaml(install箇所抜粋)
- name: install td-agent-bit centos7 yum
  yum:
    name: "{{ packages }}"
    state: latest
  vars:
    packages:
      - td-agent-bit
  become: true
  when:
    - ansible_distribution == "CentOS"
    - ansible_distribution_major_version == "7"

- name: install td-agent-bit centos8 dnf
  dnf:
    name: "{{ packages }}"
    state: latest
  vars:
    packages:
      - td-agent-bit
  become: true
  when:
    - ansible_distribution == "CentOS"
    - ansible_distribution_major_version == "8"

- name: enabled and start td-agent-bit
  systemd:
    name: td-agent-bit
    state: started
    enabled: yes
  become: true
  when:
   - ansible_distribution == "CentOS"
```

fluent-bit (td-agent-bit) のインストール完了

#### 2. fluentbit 設定
fluentbitの設定を実施する
[マニュアル](https://docs.fluentbit.io/manual/pipeline/outputs/stackdriver)を参考に下記設定例

- SERVICE
    - 特にデフォルトから変えてはいない
- INPUT
    - ここでは試しに [tail](https://docs.fluentbit.io/manual/pipeline/inputs/tail) で `/var/log/messages` と `/var/log/secure` のログ収集をする
- OUTPUT
    - [stackdriver](https://docs.fluentbit.io/manual/pipeline/outputs/stackdriver) を利用する
    - google_service_credentials
        - サービスアカウントの認証キーの保存パス
        - 作成例: [別qiita記事](https://qiita.com/suzuyui/items/a561f92639ab57639045#%E3%83%AD%E3%82%B0%E7%94%A8%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E4%BD%9C%E6%88%90)
    - location
        - ロケーション名
    - namespace
        - 環境などの識別子
        - ここでは`my-home-onprem-lab`としている(適当)
    - node_id
        - ノードの識別子
        - ホスト名から取得するように `${HOSTNAME}` としている
    - resource
        - リソースタイプ
        - `generic_node` が指定可能
    - project_id
        - 指定しないとサービスアカウントのプロジェクトとなる(指定も可能)

```/etc/td-agent-bit/td-agent-bit.conf
[SERVICE]
    daemon       Off
    log_level    info
    parsers_file parsers.conf
    plugins_file plugins.conf
    ## Default
    # flush        5
    # http_server  Off
    # http_listen  0.0.0.0
    # http_port    2020
    # storage.metrics on

# https://docs.fluentbit.io/manual/pipeline/inputs/tail
[INPUT]
    Name   tail
    Path   /var/log/messages
    DB     /run/fluent-bit-messages.state
    Tag    messages

# https://docs.fluentbit.io/manual/pipeline/inputs/tail
[INPUT]
    Name   tail
    Path   /var/log/secure
    DB     /run/fluent-bit-secure.state
    Tag    secure

# https://docs.fluentbit.io/manual/pipeline/outputs/stackdriver
[OUTPUT]
    Name        stackdriver
    Match       *
    google_service_credentials /etc/google/auth/application_default_credentials.json
    location  asia-northeast1
    namespace my-home-onprem-lab
    node_id   ${HOSTNAME}
    resource  generic_node
    ## Defaults to the project ID of the google_service_credentials file, or the project_id from Google's metadata.google.internal server.
    # export_to_project_id [project_id]
```

上記設定ファイル(`td-agent-bit.conf`)を`/etc/td-agent-bit/`の下に設定して`td-agent-bit`のリスタートを実施する
Ansible で設定すると下記のような感じになる (files に上記の設定を置く)

```yml:/etc/ansible/roles/td-agent-bit/tasks/main.yaml(config配置restart箇所抜粋)
- name: set td-agent-bit config
  copy:
    src: "{{ item }}"
    dest: /etc/td-agent-bit/
    owner: root
    group: root
    mode: 0644
    backup: yes
  with_items:
    - td-agent-bit.conf
  become: yes
  register: td_agent_bit_conf

- name: restart td-agent-bit
  when: td_agent_bit_conf is changed
  systemd:
    name: td-agent-bit
    state: restarted
  become: yes
```

以上で、fluent bit の設定まで完了し、ログ転送開始

#### 3. ログ転送確認

ログエクスプローラでログが転送できていることを確認できる

`RESOURCE TYPE` は `Generic Node` で見れる
`LOG NAME` として転送した内容によって`messages`, `secure` などもわかる

![スクリーンショット 2021-08-09 22.32.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/5954f9f4-f360-4d16-5deb-ef3804e0e6fe.png)


resource.labels の詳細を見ると、設定した`location`, `namespace`, `node_id`, `project_id` (これは未設定の場合はサービスアカウントと同じプロジェクト) になっていることを確認できる

![スクリーンショット 2021-08-09 21.36.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/dadad290-a791-873c-746f-1e4efce0599a.png)

以上でオンプレ環境(Google Cloud 外)の VM から、Cloud Logging へログが転送できたことを確認できた

## おわりに
Fluent Bit でオンプレ環境(Google Cloud 外) から Cloud Logging へのログ送信ができることを確認できた
fluentd を使う方法より簡単で Google Cloud 側のログエージェント対応からも、こちらを使うのが良いと思われる

### その他. Opsエージェントインストール
Google Cloud 上の VM インスタンス (GCE) で、Opsエージェントを入れる方法も簡単に記載する

[ドキュメント](https://cloud.google.com/stackdriver/docs/solutions/ops-agent/installation?hl=ja#joint-install)を参照してインストール

```sh
curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh
sudo bash add-google-cloud-ops-agent-repo.sh --also-install
```

既存の Logging エージェント(google-fluentd)が入っている場合は、削除しないと上記がうまく行かないので uninstall する

```sh
sudo yum remove -y google-fluentd
```

## 参考

https://fluentbit.io/

https://github.com/fluent/fluent-bit-docs/blob/master/README.md

https://docs.fluentbit.io/manual/pipeline/outputs/stackdriver

https://cloud.google.com/logging/docs/agent/ops-agent?hl=ja

https://cloud.google.com/stackdriver/docs/solutions/gke/managing-logs?hl=ja#defaults