はじめに

CloudWatch Logsエージェントの中身を(途中まで)調べてみた の続きがきになる! ということで調べてみました。上のブログを読んだという前提で話を進めます。

結論

/var/awslogs/lib/python2.7/site-packages/cwlogs/push.py

が、監視対象のログを読み込み、CloudWatch Logsのサービスにイベントをプッシュするコードでした。1800行くらいのコードです。慣れない自分には結構よむのつらいですが、主要な処理はこのコード内で完結しているので読めば動作がわかります。FileEventsReader._run(self) が実際にログを読みこむ部分です

これから先は余談です。

awscliにlogsのコードは含まれていない

aws cliに含まれているんだということで、

/usr/lib/python2.7/dist-packages/awscli (awscliのインストール先ディレクトリ)
https://github.com/aws/aws-cli (awscliのgitリポジトリ)
https://github.com/boto/boto3/ (awscliが使っているライブラリ)

配下を散々さがしましたが、何もありませんでした。

cloudwatch logs agentの実行処理

方向をかえてcloudwatch logs agent の実行時オプションに注目しました。
/var/awslogs/bin/awslogs-agent-launcher.sh
をみると以下のようになっています。

/usr/bin/env -i \
HTTPS_PROXY=$HTTPS_PROXY \
HTTP_PROXY=$HTTP_PROXY \
NO_PROXY=$NO_PROXY \
AWS_CONFIG_FILE=/var/awslogs/etc/aws.conf \
HOME=/root \
/bin/nice -n 4 \
/var/awslogs/bin/aws logs push \
--config-file /var/awslogs/etc/awslogs.conf \
--additional-configs-dir /var/awslogs/etc/config \
--/var/log/awslogs.log 2  >&1

設定を消しつつ実際にこのコマンドを実行したところ、以下があれば動作しました

AWS_CONFIG_FILE=/var/awslogs/etc/aws.conf \
/var/awslogs/bin/aws logs push \
--config-file /var/awslogs/etc/awslogs.conf

AWS_CONFIG_FILEの中身をみると以下のようになっています。

$ cat /var/awslogs/etc/aws.conf
[plugins]
cwlogs = cwlogs
[default]
region = us-west-2

awscli プラグイン

おお。プラグイン! ということでpythonのパッケージを探すと
/var/awslogs/lib/python2.7/site-packages/cwlogs
が存在していて、以下のようなファイルがあります

filter.py
__init__.py
kvstore.py
parser.py
pull.py
push.py
retry.py
threads.py
utils.py

この中でpush.pypull.pyがコマンドで残りはユーティリティクラスでした。
pullの機能については根性がなくて調べていません。

おわりに

AWSCLIはプラグインで機能を追加できるというのは初めて知りました。cwlogsを参考にプラグインを作るのもありかとおもいます。

参考

CloudWatch Logsエージェントの中身を(途中まで)調べてみた
CloudWatch Logs Agent の挙動について調べたことのまとめ

元記事はこちら

CloudWatch Logs Agentの中身を探してみた