def yasuharu519(self):

日々の妄想

FireLens を利用した Fargate タスクのログルーティング

こんにちはこんにちは。FOLIO アドベントカレンダー 19日目の記事になります。昨日は @matsu_chara さんの ScaleCheck: A Single-Machine Approach for Discovering Scalability Bugs in Large Distributed Systemsを読んだ - だいたいよくわからないブログでした。

今回は AWS Fargate で出力したログが FireLens でだいぶ楽に管理できるようになったので、そのあたりの話をします。

これまでの Fargate のログ出力

Fargate ではログドライバーとして CloudWatch Logs しかサポートされていませんでした。そのため、Fargate タスクから出たログに対してフィルタリングなどの処理を行いたい場合、CloudWatch Logs の サブスクリプションフィルタを用いて AWS Lambda を追加で使用する必要がありました。

また、CloudWatch Logs のサブスクリプションフィルタは、ロググループに対して一つしか設定できません。そのため、複数の処理を行いたい場合は、Kinesis stream や AWS Lambda をハブとして使う必要がありました。

f:id:yasuharu519:20191219113656p:plain

もしくは、ログを出力するアプリケーションとサイドカーで用意した Fluentd とで volume の共有を行い操作を行うこともできましたが、標準出力で出力していたログをファイルに出力するなどの変更が必要でした。こちらもあまりシンプルな構成とは言えません。

f:id:yasuharu519:20191219114448p:plain

FireLens とは

aws.amazon.com

Firelens は Amazon ECS タスクで使用できるログルーティング機能です。ECS on EC2 でも ECS on Fargate でもどちらでも使用でき、Fluentd や 軽量版の Fluent Bit と組み合わせることで、より柔軟なログルーティング設定を行うことができるようになります。Fluent Bit は Fluentd と比較し、使用できるプラグインに制限があったりしますが、ログの sender として使うだけであれば、基本的にはフットプリントの軽い Fluent Bit を使用したほうが良い場合が多いように思います。

fluentbit.io

FOLIO では

  • アーカイブのためのログ保管
  • エラーのフィルタリングや通知

部分で既に Fluentd を使用していたため、既存の仕組みをそのまま使用できるようになりました。

また、fluent-bit では標準で datadog logs へ送信できるプラグインもついており、これも非常に便利なポイントです。

実際の設定例

FireLens の設定例については、example のリポジトリにていろいろな例がまとまっています。 github.com

実際に使用する場合は

  • ログを取得したいコンテナの logConfigurationawsfirelens に変更する
  • サイドカーとして Fluentd か Fluent Bit のコンテナを追加し、 firelensConfiguration の設定を行う

ことで使用可能です。ECSタスク定義を以下のように設定します。

{
    ...
    "containerDefinitions": [
        {
            "name": "<ログを出力するコンテナ>",
            "logConfiguration": {
                "logDriver": "awsfirelens"
            },
            ...
        },
        {
            "name": "fluentbit",
            "firelensConfiguration": {
                "type": "fluentbit"
             },
            ...
        }
    ]
}

firelensConfiguration について

firelensConfiguration では、 type として fluentd , fluentbit のどちらかを指定し、 options にて、追加設定ファイルの パスを指定できます。 追加設定ファイルのパスについては、

  • S3 上のパス
  • コンテナ上にあるファイルパス

のどちらかを選択可能となっています。

AWS がオフィシャルで公開しているのは https://github.com/aws/aws-for-fluent-bitリポジトリで公開されているものをベースにした Docker イメージで、もともとの Fluent Bit のイメージをベースに github.com

AWS 向けのプラグインが追加されたものになっています。が、 FireLens ではカスタムイメージの使用も可能なので、好きなプラグインを追加してカスタムイメージを作成し、それを使用することもできます。

logConfiguration について

ログを出力している側の logConfigurationoptions に設定を追加することで、動的に [OUTOPUT] レコードを追加してくれるようです。

例えば Fluent Bit の Datadog output プラグインをアウトプットとして使用する場合は

[OUTPUT]
    Name        datadog
    Match       *
    Host        http-intake.logs.datadoghq.com
    TLS         on
    dd_service  my-service

のような設定が必要ですが、

    "logConfiguration": {
        "logDriver":"awsfirelens",
            "options": {
                "Name": "datadog",
                "Host": "http-intake.logs.datadoghq.com",
                "TLS": "on",
                "dd_service": "my-service",
             },
        }
    }

のように logConfiguration を設定することで同じ設定が動的に生成されるようです。

FOLIO の場合は、Fluent Bit 経由で Datadog logs と Fluentd aggregator の両方に送る必要がありました。 2つの異なる output 設定を同時に設定することは難しそうであったため、どちらの [OUTPUT] も設定した config を用意し、カスタムイメージに入れるように設定しました。

extra.conf

[OUTPUT]
    Name   forward
    Match  *
    Host   <転送先ホスト名>
    Port   24224
    Require_ack_response True
    Retry_Limit False


[OUTPUT]
    Name        datadog
    Match       *
    Host        http-intake.logs.datadoghq.com
    TLS         on
    apikey      <datadog api key>
    dd_service  <サービス名>
    dd_source   fluentbit
    dd_tags     <datadog tags>
    Retry_Limit False

Dockerfile

FROM amazon/aws-for-fluent-bit
COPY extra.conf /fluent-bit/etc/extra.conf

のような2つのファイルを用意し、

    "firelensConfiguration": {
        "type": "fluentbit",
        "options": {
            "config-file-type": "file",
             "config-file-value": "/fluent-bit/etc/extra.conf"
        }
    },

のように設定を行うことで、

  • Fluentd の aggregator
  • Datadog Logs

の両方に送信を行うことができるようになっています。

まとめ

今までは、Fargate でできない制限がいくつかあったため、運用を考えたときに少し困ることがありましたが、Fargate も機能拡充を繰り返してきて、制限もだいぶなくなってきたように思います。 Fargate Spot や、 Saving plan などもあり、Fargate で困ることもだいぶ減ってきた気がするので、今後も Fargate 利用も検討していきたいと思います。