CloudWatch Logs Agentのインストールと設定

こんにちは。
システムデザイン部開発ユニットの前原です。

先日、EC2のログファイルをCloudWatch LogsにアップロードすることができるCloudWatch Logs Agentを導入してみました。

公式ドキュメントやWeb上の記事を参考にしましたが、それでもいくつかつまづいたポイントがあったので、自分の環境で成功したインストール方法、使い方と設定内容を紹介します。

 

CloudWatch Logs Agentとは?

– EC2にインストールして使用するためにawsが用意しているエージェントソフト(デーモン)です

– インストール方法: https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/QuickStartEC2Instance.html

– リファレンス: https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/AgentReference.html

– EC2上の特定のログファイルを監視して、CloudWatch Logsにアップロードしてくれます

EC2インスタンス上にのみログが保存されているという状況を防げます

– aws Summit 2018の Application Performance Management (APM) on AWS というセッションで知ったので導入しました

セッション内で、

– EC2上のアプリケーションに全く変更を加えなくていい (コード修正が不要)

と話されており、試してみてそのメリットを実感できました

– 導入のコスト(ハードル)も非常に低かったのでおすすめです

 

インストール方法

要点: インストール方法がいくつかあるので、ダメなら先にすべて試す

(以下読まなくても大丈夫です)

EC2の環境

OS: Ubuntu 16.04

システムPython: v2.7.12

追加インストールのPython3: v3.5.2

awsドキュメントにインストール方法がいくつか記載されています。

既存の Ubuntu Server、CentOS、Red Hat のインスタンスに CloudWatch Logs をインストールして設定するには

1) インターネットから直接実行するには、次のコマンドを使用してプロンプトに従います。

2) 前のコマンドが機能しない場合は、以下を試してください。

3) スタンドアロンをダウンロードして実行するには、次のコマンドを使用してプロンプトに従います。

上記のうち、1と2の方法は失敗しました。

*まっさらなUbuntu16.04環境(python-minimalのみインストール)では成功したので、Python3かPython3用のpipが干渉していたのかもしれません。

1のエラー内容

2のエラー内容

3の方法でインストールが成功しました。

 

インストールが問題なく進むと、対話型形式で設定を求められます。

(AWSのアクセス情報、アップロード対象ファイル、アップロード先CloudWatch Logsのグループ名など)

ヘルプを見ると、コマンドライン引数として --non_interactive--config_file を指定すれば対話型の設定をスキップできるようなので、シェルスクリプト経由でインストールを行う場合や設定ファイルを事前に用意してインストールしたい場合などはこちらがいいようです。

* Script Version: 1.4.3 時点の情報です

設定を変更するには

/var/awslogs/etc/awslogs.conf

を編集して、

sudo service awslogs restart

でデーモンを再起動させればいいです。

詰まった箇所

要点: ログ行の区切りを認識させるときは multi_line_start_pattern は {datetime_format} もしくは クォートなしの正規表現文字列 で設定すればOK

(以下読まなくても大丈夫です)

無事設定完了して、CloudWatch Logsに上がったログ内容を見てみると、ログ1つの単位がうまく認識されておらず、1ログが複数個に認識されていました。

( で始まる行のみをログ行の区切りとして認識させたかった)

デフォルトでは、行が正規表現 ^\s にマッチする場合 (行頭が空白文字でない場合) に新しいログ行とみなすようになっているためです。

対策として設定ファイルに multi_line_start_pattern という項目を追加すればいいとのことで、調べてみると {datetime_format} もしくは正規表現が使用できるとのこと。

今回のログファイルでは、ちょっとした理由で行頭を # 2018-06-28 00:00:00,000 のように を付けてしまっていたので、

multi_line_start_pattern = {datetime_format}

が使用できず、正規表現を使いました。

最初にクォートで囲んで '^#\s' と書きましたが、なぜかログ行区切りの切れ目がうまく認識されません。

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

でログファイルの処理をしているようなので見てみると、内部ではPythonのconfigparserで設定ファイルを読み込んでおり、文字列にクォートは不要でした。

(他の行もクォートを使っていないので、気づくべきでした)

したがって、単に ^#\s のように正規表現を書けばOKでした。

これでやっとログの単位(行区切り)がうまく認識されるようになりました。

 

以上、簡単ですが誰かのお役に立てば幸いです。