AWS FirelensでCloudWatch Logsにログを送信する

FirelensでFluentBitを用いてCloudWatch Logsにログを送る場合にはFluentBitのプラグインが利用可能です。

利用方法は簡単でOUTPUTセクションでNameにcloudwatchを指定して必要なパラメータを設定すればいいです。

[OUTPUT]
    Name cloudwatch
    Match   *
    region us-east-1
    log_group_name fluent-bit-cloudwatch-$(uuid)-$(tag)
    log_stream_name from-fluent-bit-$(pam['item2']['subitem'])-$(ecs_task_id)-$(ecs_cluster)
    auto_create_group true
https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit

ただ、aws-for-fluent-bit 2.29.0を利用した際に下記エラーに遭遇しました。

plugin 'cloudwatch' failed to initialize

調査したところcloudwatchというプラグインは旧プラグインで新しいプラグインはcloudwatch_logsという名称で提供されているようです。

cloudwatch_logsに変えるだけでOKとならない部分があります。
log_group_nameやlog_stream_nameで変数展開する機能が新プラグインでは下位互換性がない状態です。

READMEに旧プラグインについて記載があります。

Do you plan to deprecate this older plugin?
At this time, we do not. This plugin will continue to be supported. It contains features that have not been ported to the higher performance version. Specifically, the feature for templating of log group name and streams with ECS Metadata or values in the logs. While simple templating support now exists in the high performance plugin, it does not have all of the features of the plugin in this repo. Some users will continue to need the features in this repo.

https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit

ロググループ名、ログストリーム名についてECSのメタデータやログ内のデータを使ってテンプレート化する機能が含まれていないとのこと。
このテンプレート化という部分にはリンクが貼られていて遷移先にかかれているのが

Templating Log Group and Stream Names
A template in the form of $(variable) can be set in log_group_name or log_stream_name. variable can be a map key name in the log message. To access sub-values in the map use the form $(variable['subkey']). Also, it can be replaced with special values to insert the tag, ECS metadata or a random string in the name.

https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit

まさに前述したサンプルで記述のあった内容です。

今回、ログストリーム名をログ内の値を使った名前を設定したかったので直撃しました。
cloudwatch_logsプラグインでどうにかやる方法が確認できたので記載していきます。

log_stream_prefixというパラメータがあって指定した文字列をログストリーム名のprefixにつけてくれます。

このパラメータを指定するとログストリーム名はprefix+tagで作成されることがわかりました。
つまり、必要な値があればtagの時点でつけてしまえばいいのだと考えました。

FILTERセクションでrewrite_tagをするときに正規表現で必要な値をキャプチャしてnew_tagにつけることによって実現できました。

簡単な例

[FILTER]
  Name rewrite_tag
  Match *-firelens-*
  Rule $log (.*) new_tag.$1 false

AWS Firelensにカスタム設定を適応する方法

AWS FirelensはECSのタスク定義でログルーターの統合を有効にするだけで簡単に
FluentBitまたはFluentdのサイドカーコンテナをタスクに追加してログの操作を移譲できます。

バックエンドはFluentBitかFluentdが選択可能ですが今回はFluentBitを選択します。
Firelensで使用されるFluentBitのDockerイメージはaws-for-fluent-bitという名称でAmazon ECRやDocerHubで提供されています。

今回は、Firelensで動作するFluentBitコンテナに独自のカスタム設定を追加する方法をまとめます。

カスタム設定を書く場所

Dockerイメージを取得してコンテナを立ち上げてみると/fluent-bit/etc/fluent-bit.confに設定があります。

[INPUT]
    Name        forward
    Listen      0.0.0.0
    Port        24224

[OUTPUT]
    Name cloudwatch
    Match   **
    region us-east-1
    log_group_name fluent-bit-cloudwatch
    log_stream_prefix from-fluent-bit-
    auto_create_group true

このファイルはECSタスク起動時に差し替えられログルーターとして機能するようになっています。
その為、Dockerコンテナ上でいくらfluent-bit.confを編集しても最終的には差し替えられてしまうため別のファイルで作成することになります。

Fargateの場合には後述する制約があるのでコンテナから参照できる場所にファイルを配置することになります。
/fluent-bit/etc/xxxx.confのような。

カスタム設定適応方法

ECSタスク定義のコンテナの所でカスタム設定ファイルの定義を追加するとカスタム設定を適応できます。

         "firelensConfiguration":{
            "type":"fluentbit",
            "options":{
               "config-file-type":"s3 | file",
               "config-file-value":"arn:aws:s3:::mybucket/fluent.conf | filepath"
            }
         }
FireLens 設定を使用するタスク定義の作成 - Amazon ECS

Fargateで動作させる場合には制約があります。

AWS Fargate でホストされるタスクは、file 設定ファイルタイプのみをサポートします。

FireLens 設定を使用するタスク定義の作成 - Amazon ECS

EC2であればS3から参照することもできるようですがFargateなのでコンテナ内からファイルを参照できる必要があります。

あとはカスタム設定を記載した設定ファイルを内包したDockerイメージが作成できたらECRにアップロードして、
タスク定義のFirelens統合で指定されているコンテナイメージを自分で作成したものに変更すれば完了です。

Hisense 液晶テレビ 65U7F買ってました

Hisenseの65型液晶テレビ65U7Fを買ってから半年くらい経ちました。
価格はポイント還元など色々含めると実質45000円くらいです。
今の所、文句が特にないし画面がでかくなったのでいい買い物をしました。
ゲームの臨場感上げるために画面はデカければデカいほどいいと考えてはいましたが今は65インチが限界でした。


設置したての写真がこれ。今まで使っていたモニタは32インチなんですが相手にならんすね...

設置して少しの間は画面デカイなと感じていましたが、今となってはもう慣れてしまいました。
慣れって恐ろしいネ

テレビスタンドはこれです。スッキリ置けて満足しています。