Datadog AgentでECS上のfluentdを監視する
はじめに
この記事はECS上で起動したfluentdをDatadogで監視する構成をテストしてみたので、そのメモです。
構成の概要
今回はECSで以下のような構成のクラスタを作成します。
- EC2ホスト上でDatadog Agentコンテナを起動する (DEAMON)
- 同ホスト上で fluentdコンテナを起動する
- Datadog AgentはAuto Discoveryを使用してfluentd コンテナを捕捉し監視を行う
Datadogを使ったECSの監視
Datadog Agentを使うとEC2ホスト上で起動するコンテナの情報を収集できます。基本的なセットアップに加えてAuto discoveryを使用することで監視対象のコンテナで動作するソフトウェアに応じたインテグレーションを有効化できます。今回はfluentd インテグレーションを有効化しました。
fluentd インテグレーションの設定
Auto discoveryを使ってインテグレーションを有効化するには対象のコンテナにラベルを設定します。ドキュメントを元に以下のラベルを設定します。
各インテグレーションのリファレンスに記載されている値そのままではなくてJSONリスト内に設定を入れる必要があります。
{ "containerDefinitions": [ { "name": "fluentd", "dockerLabels": { "com.datadoghq.ad.check_names": "[\"fluentd\"]", "com.datadoghq.ad.init_configs": "[{}]", "com.datadoghq.ad.instances": "[{\"monitor_agent_url\": \"http://%%host%%:24220/api/plugins.json\"}]" } ] }
fluentdコンテナのタスク設定
上記以外でもタスク定義において以下の設定が必要です。
- ポートマッピング
- fluentdは自身のメトリクスをHTTP APIとして公開します(24220 tcp) ※monitor agent plugin
- fluentdを集約サーバとして使用する場合は受信ポート(24224 tcp/udp)の設定が必要です
- FLUENT_UID環境変数
- ポートのリッスンやファイルアクセスのためにUID=0を設定します
{ "containerDefinitions": [ "environment": [ { "name": "FLUENT_UID", "value": "0" } ], "portMappings": [ { "containerPort": 24220, "hostPort": 24220, "protocol": "tcp" }, { "containerPort": 24224, "hostPort": 24224, "protocol": "tcp" }, { "containerPort": 24224, "hostPort": 24224, "protocol": "udp" } ] }] }
fluentdの設定
fluentdのメトリクスを公開するためにfluendの設定でmonitor_agent プラグインを有効化します。
<source> @type monitor_agent bind 0.0.0.0 port 24220 </source>
その他注意点
基本的なことですが以下の点にも注意が必要です。
- Datadog Agentコンテナとfluentdコンテナの通信ができるようにセキュリティグループを設定する
- Datadog AgentはメトリクスをSaaSに送信するためにインターネット接続できるように構成する
- fluentdで1つ以上のログ出力設定をしていないとDatadogのダッシュボードにメトリクスが現れません(動作確認時には注意) 2点目についてはEC2 上でawsvpcモードで起動したタスクではパブリックIPアドレスが付与されないので、Datadog Agentはhostおよびbridgeで起動するかNATを構成する必要があります。
まとめ
知らないと気づかない点がいくつかあったので苦労しましたがポイントを押さえるとAuto discoveryが非常に便利だと思います。