はじめに
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.py
とpull.py
がコマンドで残りはユーティリティクラスでした。
pullの機能については根性がなくて調べていません。
おわりに
AWSCLIはプラグインで機能を追加できるというのは初めて知りました。cwlogsを参考にプラグインを作るのもありかとおもいます。
参考
CloudWatch Logsエージェントの中身を(途中まで)調べてみた
CloudWatch Logs Agent の挙動について調べたことのまとめ