[Firelens]検証環境の構築と設定

649
[Firelens]検証環境の構築と設定

前書き

次の様な取り組みを行いました。

  1. Firelens検証環境をAWSへ構築
  2. 1で構築した環境上にFirelens設定を追加
  3. 実際にログが出力されるのを確認

本記事では、まずFirelensについて簡単に説明し、その後今回の取り組みについて、解説します。

Firelensについて

Firelensとは?

詳解 FireLens – Amazon ECS タスクで高度なログルーティングを実現する機能を深く知る

Amazon ECS は FireLens によるカスタムログルーティングのサポートを発表しました。FireLens によって、人気の高いオープンソースのロギングプロジェクトである Fluentd や Fluent Bit を簡単に使用することができ、さまざまな AWS サービスやパートナーの宛先にログを送信することができます。

要するに、firelensは、fluentd、fluent bitをECSタスクで使いやすくしたものです。

FireLens の内部構造

タスクの中で、firelensのログドライバーを設定したApplicationコンテナ(例えば、ブログサイトが立ち上がっているWebサーバー)とFirelensコンテナを起動していておき、ApplicationのログをFirelensで受け取って、Cloudwatchなりにログを出力するという方式になっています。

今回の取り組み

Firelens検証環境構築


検証環境の概略図です。タスクとして、web、php、firelensコンテナを立ています。

  1. ALB経由でwebサーバーへアクセス
  2. webサーバーが提供する画面からログを出力するボタンをクリック
  3. バックエンドのphpサーバーがログを出力
  4. phpサーバーのログをfirelensが受け取る
  5. firelensがcloudwatchへログを出力する

となっています。

タスク定義

以下が、タスク定義となります。

[
    {
        "name": "web",
        "image": "<Webサーバーイメージ>",
        "essential": true,
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-region": "<Myリージョン>",
                "awslogs-stream-prefix": "web",
                "awslogs-group": "<webサーバー用のCloudwatchグループ>"
            }
        },
        "portMappings": [
            {
                "protocol": "tcp",
                "containerPort": 80
            }
        ]
    },
    {
        "name": "php",
        "image": "<phpサーバーイメージ>",
        "essential": true,
        "logConfiguration": {
            "logDriver": "awsfirelens",
            "secretOptions": null,
            "options": null
        },
        "portMappings": [
            {
                "protocol": "tcp",
                "containerPort": 9000
            }
        ]
    },
    {
        "name": "firelens",
        "image": "<Firelensイメージ>",
        "essential": true,
        "firelensConfiguration": {
            "type": "fluentbit"
        },
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-region": "<Myリージョン>",
                "awslogs-stream-prefix": "firelens",
                "awslogs-group": "<Firelensサーバー用のCloudwatchグループ>"
            }
        },
        "environment": [
            {
                "name": "aws_fluent_bit_init_s3_1",
                "value": "<設定設置s3バケット>/filter.conf"
            },
            {
                "name": "aws_fluent_bit_init_s3_2",
                "value": "<設定設置s3バケット>/output.conf"
            }
        ]
    }
]

次の2点に注目してもらいたいです。

  1. phpのlogConfiguration
    "logDriver": "awsfirelens"としています。これにより、phpサーバーにfirelensのログドライバーを設定します。
  2. firelensのenvironment
    environmentにおいて、実際のロギングのためのfirelensの設定の設置箇所を指定しています。今回は、firelensのinitイメージを使用しています。このイメージを用いると、設定をs3バケット経由で指定することができ、独自の設定を組み込むためにカスタムイメージをビルドし直すということをしなくても良くなります。

firelens設定

fluentbitでは、ログの取り扱いのために様々な機能、プラグインが用意されていますが、今回は簡単な設定で動作確認します。

  1. fileter.conf

    [FILTER]
        Name   rewrite_tag
        Match  *
        Rule   $log error error-log true

    ログのフィルタ設定です。
    上の設定は、phpから受け取ったログにタグをつけています。
    具体的には、ログの中からerrorという文字列を作成し、error-log-tagというタグをつけるという意味になります。

  2. output.conf

    [OUTPUT]
        Name   cloudwatch_logs
        Match  error-log-tag
        region <Myリージョン>
        log_group_name <出力先のロググループ>
        log_stream_prefix <ログストリームのプレフィックス>

    ログのアウトプット設定です。
    Matchで合致したタグを持つログをCloudwatchへ出力しています。今回は、error-log-tagというタグを持つログを出力します。

動作確認

ログ出力画面

画面へ上のようにボタンを配置して、phpへログが出力される様にしました。
たくさんボタンがありますが、ログレベル検証用なので、とにかくボタンが押されるんだなと思ってもらえればいいです。

cloudwatch確認

cloudwatchを確認すると、<出力先のロググループ><ログストリームのプレフィックス><タグ名>という形式でログストリームが作成され、ログが出ることが確認できます。

fluent-bit initイメージの注意点

今回使用したinitイメージですが、MULTILINE_PARSERのセクションがs3へ配置した設定ファイルからは使用できない不具合?があります。
詳細については、git issueに書かれています。
そのため、MULTILINE_PARSERを使いたい場合は、カスタムイメージを作成すれば、暫定的に対応できます。

まとめ

今回は、firelens検証環境の構築とfirelensでログを出力するまでを行いました。
ECSを立ち上げるまでのAWSリソースさえ揃えてしまえば、firelensの設定自体はとても簡単に行えました。
あとは、どの様なログを収集したいかの検討やfluentbit自体の設定の仕方の学習が残る形になると思います。

また、今回は、設定の容易さという管理面に焦点を当てましたが、

Container Dependency 機能でオーバーライドされない限り、FireLens コンテナが最初に起動し、最後に停止することを保証します。(より正確には、FireLens コンテナは awsfirelens ログドライバーを使用する全てのコンテナのよりも前に開始し、awsfirelens ログドライバーを使用する全てのコンテナのよりも後に停止します。)

と公式のドキュメントにあり、ログ損失的に優れているという結果もあリます。