

# CloudWatch Logs へログを送信する DaemonSet として Fluent Bit を設定する
<a name="Container-Insights-setup-logs-FluentBit"></a>

以下のセクションでは、Fluent Bit をデプロイして、コンテナから CloudWatch Logs にログを送信する方法について説明します。

**Topics**
+ [Fluent Bit の設定](#Container-Insights-FluentBit-setup)
+ [複数行ログのサポート](#ContainerInsights-fluentbit-multiline)
+ [(オプション) Fluent Bit からのログボリュームの縮小](#ContainerInsights-fluentbit-volume)
+ [トラブルシューティング](#Container-Insights-FluentBit-troubleshoot)
+ [ダッシュボード](#Container-Insights-FluentBit-dashboard)

## Fluent Bit の設定
<a name="Container-Insights-FluentBit-setup"></a>

コンテナからログを収集するように Fluent Bit を設定するには、「[Amazon EKS および Kubernetes の Container Insights のクイックスタートセットアップ](Container-Insights-setup-EKS-quickstart.md)」のステップを実行するか、このセクションのステップを実行します。

どちらの方法でも、クラスターノードにアタッチされた IAM ロールに十分なアクセス許可が必要です。Amazon EKS クラスターの実行に必要なアクセス許可の詳細については、*Amazon EKS ユーザーガイド*の「[Amazon EKS IAM ポリシー、ロール、アクセス許可](https://docs.aws.amazon.com/eks/latest/userguide/IAM_policies.html)」を参照してください。

以下のステップでは、CloudWatch Logs へログを送信する daemonSet として Fluent Bit を設定します。このステップを完了すると、Fluent Bit は、次のロググループを作成します (まだ存在していない場合)。

**重要**  
Container Insights で既に FluentD を設定しており、FluentD DaemonSet が期待どおりに実行されない場合 (`containerd` ランタイムを使用していると発生する場合があります)、Fluent Bit をインストールする前にアンインストールして、Fluent Bit が FluentD エラーログメッセージを処理しないようにする必要があります。それ以外の場合は、Fluent Bit が正常にインストールされたらすぐに FluentD をアンインストールする必要があります。Fluent Bit のインストール後に Fluentd をアンインストールすることで、この移行プロセス中のログ記録の継続性が確保されます。ログを CloudWatch Logs に送信するには、Fluent Bit または FluentD のいずれか 1 つのみが必要になります。


| ロググループ名 | ログソース | 
| --- | --- | 
|  `/aws/containerinsights/Cluster_Name/application`  |  `/var/log/containers` のすべてのログファイル  | 
|  `/aws/containerinsights/Cluster_Name/host`  |  `/var/log/dmesg`、`/var/log/secure`、および `/var/log/messages` からのログ  | 
|  `/aws/containerinsights/Cluster_Name/dataplane`  |  `/var/log/journal`、`kubelet.service`、および`kubeproxy.service` に対する `docker.service` のログ。  | 

**Fluent Bit をインストールしてコンテナから CloudWatch Logs にログを送信するには**

1. `amazon-cloudwatch` という名前の名前空間がまだない場合は、次のコマンドを入力して作成します。

   ```
   kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
   ```

1. 次のコマンドを実行して、クラスター名とログを送信するリージョンを持つ `cluster-info` という名前の ConfigMap を作成します。*cluster-name* と *cluster-region* をクラスターの名前とリージョンに置き換えます。

   ```
   ClusterName=cluster-name
   RegionName=cluster-region
   FluentBitHttpPort='2020'
   FluentBitReadFromHead='Off'
   [[ ${FluentBitReadFromHead} = 'On' ]] && FluentBitReadFromTail='Off'|| FluentBitReadFromTail='On'
   [[ -z ${FluentBitHttpPort} ]] && FluentBitHttpServer='Off' || FluentBitHttpServer='On'
   kubectl create configmap fluent-bit-cluster-info \
   --from-literal=cluster.name=${ClusterName} \
   --from-literal=http.server=${FluentBitHttpServer} \
   --from-literal=http.port=${FluentBitHttpPort} \
   --from-literal=read.head=${FluentBitReadFromHead} \
   --from-literal=read.tail=${FluentBitReadFromTail} \
   --from-literal=logs.region=${RegionName} -n amazon-cloudwatch
   ```

   このコマンドでは、プラグインメトリクスをモニターリングするための `FluentBitHttpServer` がデフォルトでオンになっています。無効にするには、コマンドの 3 行目を `FluentBitHttpPort=''` (空の文字列) に変更します。

   また、デフォルトでは、Fluent Bit はテールからログファイルを読み取り、デプロイ後に新しいログのみを取得します。逆をご希望の場合は、`FluentBitReadFromHead='On'` を設定することで、ファイルシステム内のすべてのログが収集されます。

1. 次のいずれかのコマンドを実行して、Fluent Bit daemonset をクラスターにダウンロードしてデプロイします。
   + Linux コンピュータ用の Fluent Bit 最適化設定が必要な場合は、このコマンドを実行します。

     ```
     kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit.yaml
     ```
   + Windows コンピュータ用の Fluent Bit 最適化設定が必要な場合は、このコマンドを実行します。

     ```
     kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit-windows.yaml
     ```
   + Linux コンピュータを使用しており、より Fluentd に似ている Fluent Bit の設定が必要な場合は、このコマンドを実行します。

     ```
     kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit-compatible.yaml
     ```
**重要**  
Fluent Bit デーモンセットの設定では、デフォルトでログレベルが INFO に設定されるため、CloudWatch Logs の取り込みコストが高くなる可能性があります。ログの取り込み量とコストを削減したい場合は、ログレベルを ERROR に変更すると削減できます。  
ログの量を減らす方法の詳細については、「[(オプション) Fluent Bit からのログボリュームの縮小](#ContainerInsights-fluentbit-volume)」を参照してください

1. 次のコマンドを実行してデプロイを検証します。各ノードには、**fluent-bit-\$1** という名前の 1 つのポッドが必要です。

   ```
   kubectl get pods -n amazon-cloudwatch
   ```

上記の手順を実行することにより、クラスターに次のリソースが作成されます。
+ `Fluent-Bit` 名前空間の `amazon-cloudwatch` という名前のサービスアカウント。このサービスアカウントは、Fluent Bit daemonSet を実行するために使用されます。詳細については、Kubernetes Reference の[サービスアカウントの管理](https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/)を参照してください。
+ `Fluent-Bit-role` 名前空間の `amazon-cloudwatch` という名前のクラスターロール。このクラスターロールは、ポッドログの `get`、`list`、`watch` の各アクセス許可を `Fluent-Bit` サービスアカウントに付与します。詳細については、Kubernetes Reference の [API の概要](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#api-overview/)を参照してください。
+ `Fluent-Bit-config` 名前空間の `amazon-cloudwatch` という名前の ConfigMap。この ConfigMap には、Fluent Bit によって使用される設定が含まれています。詳細については、Kubernetes Tasks ドキュメントの「[Configure a Pod to Use a ConfigMap](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/)」を参照してください。

Fluent Bit の設定を検証する場合は、次の手順を実行します。

**Fluent Bit 設定の検証**

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

1. ナビゲーションペインで、**[Log groups]** (ロググループ) を選択します。

1. Fluent Bit をデプロイしたリージョンにいることを確認してください。

1. リージョン内のロググループのリストを確認します。次のように表示されます。
   + `/aws/containerinsights/Cluster_Name/application`
   + `/aws/containerinsights/Cluster_Name/host`
   + `/aws/containerinsights/Cluster_Name/dataplane`

1. これらのロググループのいずれかに移動し、ログストリームの [**Last Event Time**] (最終のイベント時刻) を確認します。Fluent Bit をデプロイしたときと比べて最近のものである場合は、設定が検証されます。

   `/dataplane` ロググループの作成にわずかな遅延が生じることがあります。Fluent Bit がそのロググループのログ送信を開始したときにのみ、これらのロググループが作成されるため、これは正常です。

## 複数行ログのサポート
<a name="ContainerInsights-fluentbit-multiline"></a>

複数行ログで Fluent Bit を使用する方法については、Fluent Bit のドキュメントの次のセクションを参照してください。
+ [複数行の解析](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/multiline-parsing)
+ [複数行とコンテナ (v1.8)](https://docs.fluentbit.io/manual/pipeline/inputs/tail#multiline-and-containers-v1.8)
+ [複数行コア (v1.8)](https://docs.fluentbit.io/manual/pipeline/inputs/tail#multiline-core-v1.8)
+ [tail 入力で常に複数行を使用する](https://github.com/aws/aws-for-fluent-bit/blob/mainline/troubleshooting/debugging.md#always-use-multiline-the-tail-input)

## (オプション) Fluent Bit からのログボリュームの縮小
<a name="ContainerInsights-fluentbit-volume"></a>

デフォルトでは、Fluent Bit アプリケーションログおよび Kubernetes メタデータを CloudWatch に送信します。CloudWatch に送信されるデータの量を減らす場合は、これらのデータソースが一方または両方の CloudWatch に送信されることを停止できます。このページの手順に従って Fluent Bit をセットアップした場合は、以前に実行した kubectl `apply` コマンドから Kubernetes マニフェスト YAML ファイルをダウンロードし、変更を加えて修正し、クラスターに再適用できます。または、Amazon CloudWatch Observability EKS アドオンまたは Helm チャートを使用している場合、アドオンの高度な設定または Helm チャートを使用して Fluent Bit 設定を管理する方法については、「[(オプション) その他の設定](install-CloudWatch-Observability-EKS-addon.md#install-CloudWatch-Observability-EKS-addon-configuration)」を参照してください。

Fluent Bit アプリケーションログを停止するには、`Fluent Bit configuration` ファイルから次のセクションを削除します。

```
[INPUT]
        Name                tail
        Tag                 application.*
        Path                /var/log/containers/fluent-bit*
        Parser              docker
        DB                  /fluent-bit/state/flb_log.db
        Mem_Buf_Limit       5MB
        Skip_Long_Lines     On
        Refresh_Interval    10
```

CloudWatch に送信されたログイベントに Kubernetes メタデータが追加されないように削除するには、Fluent Bit 設定の `application-log.conf` セクションに以下のフィルターを追加します。*<Metadata\$11>* および同様のフィールドを実際のメタデータ識別子に置き換えます。

```
application-log.conf: |
    [FILTER]
        Name                nest
        Match               application.*
        Operation           lift
        Nested_under        kubernetes
        Add_prefix          Kube.

    [FILTER]
        Name                modify
        Match               application.*
        Remove              Kube.<Metadata_1>
        Remove              Kube.<Metadata_2>
        Remove              Kube.<Metadata_3>
    
    [FILTER]
        Name                nest
        Match               application.*
        Operation           nest
        Wildcard            Kube.*
        Nested_under        kubernetes
        Remove_prefix       Kube.
```

## トラブルシューティング
<a name="Container-Insights-FluentBit-troubleshoot"></a>

正しいリージョンで確認しているが、これらのロググループが表示されない場合は、Fluent Bit daemonSet ポッドのログでエラーを確認します。

次のコマンドを実行してステータスが `Running` であることを確認します。

```
kubectl get pods -n amazon-cloudwatch
```

IAM アクセス許可に関連するエラーがログにある場合は、クラスターノードにアタッチされた IAM ロールを確認します。Amazon EKS クラスターの実行に必要なアクセス許可の詳細については、*Amazon EKS ユーザーガイド*の「[Amazon EKS IAM ポリシー、ロール、アクセス許可](https://docs.aws.amazon.com/eks/latest/userguide/IAM_policies.html)」を参照してください。

ポッドのステータスが `CreateContainerConfigError` である場合は、次のコマンドを実行して正確なエラーを取得します。

```
kubectl describe pod pod_name -n amazon-cloudwatch
```

## ダッシュボード
<a name="Container-Insights-FluentBit-dashboard"></a>

実行中の各プラグインのメトリクスをモニターリングするダッシュボードを作成できます。入力バイトと出力バイト、レコード処理レート、出力エラー、およびリトライ/失敗率のデータを表示できます。これらのメトリクスを表示するには、Amazon EKS と Kubernetes クラスターの Prometheus メトリクスコレクションを使用して CloudWatch エージェントをインストールする必要があります。ダッシュボードの設定方法の詳細については、「[Amazon EKS および Kubernetes クラスターに Prometheus メトリクスコレクションを使用して CloudWatch エージェントをインストールするAmazon EKS および Kubernetes クラスターに Prometheus メトリクスコレクションを使用して CloudWatch エージェントをインストールする](ContainerInsights-Prometheus-Setup.md)」を参照してください。

**注記**  
このダッシュボードを設定する前に、Prometheus メトリクスの Container Insights を設定する必要があります。詳細については、「[Container Insights の Prometheus メトリクスのモニターリング](ContainerInsights-Prometheus.md)」を参照してください。

**Fluent Bit Prometheus メトリクスのダッシュボードを作成するには**

1. 環境変数を作成し、次の行の右側の値をデプロイと一致するように置き換えます。

   ```
   DASHBOARD_NAME=your_cw_dashboard_name
   REGION_NAME=your_metric_region_such_as_us-west-1
   CLUSTER_NAME=your_kubernetes_cluster_name
   ```

1. 次のコマンドを実行して、ダッシュボードを作成します。

   ```
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/fluent-bit/cw_dashboard_fluent_bit.json \
   | sed "s/{{YOUR_AWS_REGION}}/${REGION_NAME}/g" \
   | sed "s/{{YOUR_CLUSTER_NAME}}/${CLUSTER_NAME}/g" \
   | xargs -0 aws cloudwatch put-dashboard --dashboard-name ${DASHBOARD_NAME} --dashboard-body
   ```