Amazon EKS で Fluent Bit を使用してコンテナログを CloudWatch Logs に送信する手順

お疲れ様です。
 

今回は、Fluent Bit を使用して EKS のコンテナログを CloudWatch Logs に送信する手順についてご紹介します。

 

Fluent Bit とは

Fluent Bit(フルエントビット)は、C言語で書かれたクラウド及びコンテナ環境に適した、ログの収集、配布を行うオープンソースのログプロセッサツールです。

Fluent BitはFluentd傘下のCNCFサブプロジェクトで、2014年に組み込みLinuxやゲートウェイなどの制約のある環境向け軽量ログプロセッサとしてTreasure Data社のFluentdチームにより開発され、Fluentdエコシステムの一部として、Fluent Bitと名付けられました。
 

引用 OpenStandia 公式サイト

 

 

前提条件

インターネットに接続できるサーバーを経由して、kuectlコマンドを使用します。

  • EKSクラスター作成済み
  • kubectlインストール済み
  • AWS CLIインストール済み
  • インターネットに接続できるサーバーに EKS を操作するポリシーを付与したIAMロールをアタッチしている
  • OIDCプロバイダー作成済み
    ※参考 AWS公式ドキュメント
  • EKSクラスターとOIDCプロバイダー連携済み
    ※参考 AWS公式ドキュメント

 

 

1. CloudWatch Container Insights セットアップと Namespace 作成

 
EKS クラスターに CloudWatch Container Insights をセットアップすると、【amazon-cloudwatch】 という名前の Namespace が作成されます。
 

また、自動的に以下の3つのロググループが作成されます。

ロググループ名 ログソース
/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 のログ。

 

CloudWatch Container Insights セットアップコマンド

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

 

 

2. IAMロール作成

 
①コンテナログを CloudWatch Logs に送信するための、ポリシーを付与した IAMロールを作成

CloudWatch Logs へのログ送信に必要なポリシーを追加してください。

・CloudWatchLogsReadOnlyAccess
・CloudWatchLogsFullAccess
 

②IAMロールの【信頼されたエンティティ】の設定

・信頼されたエンティティの例

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "【arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX】"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "【oidc.eks.AWS_REGION.amazonaws.com/id/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX】:sub": "system:serviceaccount:【SERVICE_ACCOUNT_NAMESPACE】:【SERVICE_ACCOUNT_NAME】",
          "【oidc.eks.AWS_REGION.amazonaws.com/id/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX】:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}

 
【"Federated"】 IDプロバイダのARN
【"StringEquals"】プロバイダ
【SERVICE_ACCOUNT_NAMESPACE】: Service Account を作成する Namespace名
【SERVICE_ACCOUNT_NAME】: 作成する Service Account名
 

3. Service Account 作成

 

先ほど作成したIAMロールを関連付けした Service Account を作成

IAMロールを定義した yaml を指定して Service Account 作成します。

・yaml の例

apiVersion: v1
kind: ServiceAccount
metadata:
  name: 【ServiceAccount名】
  namespace: 【Namespace名】
  annotations:
    eks.amazonaws.com/role-arn: 【IAMロールのARN】

 

Service Account 作成コマンド

kubectl apply -f 【xxxxx.yaml】

 

指定した namespace に作成されているか確認するコマンド

kubectl get sa -n 【Namespace名】

 

4. Fluent Bit 設定ファイル作成

 
Fluent Bit 設定ファイル (fluent-bit.conf)作成

設定ファイルの例
※要件によってカスタムしてください

[SERVICE]
    Flush        1
    Log_Level    info
    Daemon       off
    HTTP_Server  On
    HTTP_Listen  0.0.0.0
    HTTP_Port    2020

[INPUT]
    Name         tail
    Path         /var/log/containers/*.log
    Parser       docker
    Tag          kube.*
    Mem_Buf_Limit 5MB
    Skip_Long_Lines On
    Refresh_Interval 10

[FILTER]
    Name         kubernetes
    Match        kube.*

[OUTPUT]
    Name            cloudwatch
    Match           *
    region          ap-northeast-1
    log_group_name  /aws/containerinsights/Cluster_Name/application

 

設定ファイル作成コマンド

kubectl apply -f 【xxxxx.yaml】

 

5. ConfigMap 作成

 
クラスター名とログを送信するリージョンを持つ 【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

 

6. IAM ポリシーを作成しノードグループの IAMロール にアタッチ

 
Fluent Bit が CloudWatch Logs にログを送信するために必要な IAMポリシーを作成し、EKS クラスターのノードグループのIAMロールにアタッチ

自動作成されたロググループ【/aws/containerinsights/Cluster_Name/application】を指定しています。
 

・IAMポリシーの例


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:GetLogEvents"
            ],
            "Resource": "arn:aws:logs:ap-northeast-1:XXXXXXXXXXXX:log-group:/aws/containerinsights/Cluster_Name/application:*"
        }
    ]
}

 

7. Fluent Bit のデプロイ

Fluent Bit daemonset を EKS クラスターにダウンロードしてデプロイ

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 の DaemonSet が EKS クラスターにデプロイされます。

 

まとめ

 
EKS は Kubernetes を簡単にデプロイし、管理するためのマネージドサービスであり、Fluent Bit を使用することで、コンテナから生成されるログを簡単かつ効率的に収集し、Amazon CloudWatch Logs に送信できます。

この組み合わせは、EKS クラスター内のログ管理を強化し、システムのトラブルシューティングやセキュリティ向上に大きく貢献します。
 


関連記事

◆ EKSクラスター内のPODからkubectlコマンドを使用してS3コマンド実行
https://cloud5.jp/mk-kubectl-eks-pod-s3/
 

Last modified: 2024-02-15

Author