Cent OSにawslogs-agent 入れようとして苦労した話

EC2インスタンスからパカパカログを検知して
cloudwatchに入れたいねという依頼があったのでやってみた。
苦労したところがあったのでメモ。

pythonのバージョン差異でエラーが出る出ないがあるようだった。
でも調べることが目的じゃないので精査してない。

自分の環境だとどうもpython 2.6だとエラーが出てるようだったので
いっそのこと3系でawslogs-agentが使えるようにした。

(後述)
あとからわかったけど2.6系でもいけたっぽい

また仕事の環境借りてやってたので
ところどころパスを修正して書き直してます。
なのでパスとしてつじつまが合うようにしてるけど
たまに合わないところがあるかもしれません。
そこはご容赦いただきたい。


一応ここを参考にしたけど、苦労した部分が多かったなあ。
http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/QuickStartEC2Instance.html

環境

OS:Cent OS 6.6

Cent OS なのか?リポジトリ設定が悪かったのか

sudo yum install -y awslogs

はダメだった。amazon linux って書いてあるしなあ。

インストール手順

awslogs-agent-setup.pyを実行してみる

sudo mkdir /opt/awslogs_work

cd /opt/awslogs_work/

curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O

sudo python awslogs-agent-setup.py --region ap-northeast-1

ここでなぜかエラー

sudo python awslogs-agent-setup.py --region ap-northeast-1
Launching interactive setup of CloudWatch Logs agent ...
 
Step 1 of 5: Installing pip ...DONE
 
Step 2 of 5: Downloading the latest CloudWatch Logs agent bits ... Traceback (most recent call last):
  File "awslogs-agent-setup.py", line 1317, in <module>
    main()
  File "awslogs-agent-setup.py", line 1313, in main
    setup.setup_artifacts()
  File "awslogs-agent-setup.py", line 858, in setup_artifacts
    self.install_awslogs_cli()
  File "awslogs-agent-setup.py", line 570, in install_awslogs_cli
    subprocess.call([AWSCLI_CMD, 'configure', 'set', 'plugins.cwlogs', 'cwlogs'], env=DEFAULT_ENV)
  File "/opt/python-env/lib/python2.7/subprocess.py", line 168, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/opt/python-env/lib/python2.7/subprocess.py", line 390, in __init__
    errread, errwrite)
  File "/opt/python-env/lib/python2.7/subprocess.py", line 1025, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

原因わかんねーよ
2.7 だとエラーになるみたい。(2.6だとOKだった)
エラー終了しちゃうけど続ける。

awslogs-agent-setup.py 実行することで
/var/awslogsができる。

python 3 を/var/awslogs/bin に入れる

awslogs-agent はpython 2.7 - 3.5じゃないと動かない(とどこかに書いてあった)
また、もうさすがにpythonは3系を使いたいので3系を入れる。

sqlite-develインストール
sudo yum install sqlite-devel

これはこの後にpython awslogs-agent-setup.py やると
ImportError: No module named '_sqlite3'
が出るため

python 3 を入れる
sudo mkdir -p /opt/python3_work/python3
  
cd /opt/python3_work/
  
sudo wget https://www.python.org/ftp/python/3.5.4/Python-3.5.4.tar.xz
  
sudo xz -dv Python-3.5.4.tar.xz
  
sudo tar xfv Python-3.5.4.tar
  
cd Python-3.5.4
 
 
sudo ./configure --prefix=/var/awslogs/ && sudo make && sudo make altinstall
 
# /var/awslogs/bin/python は2.6系だった。
# python が2.6にリンクされているので削除する

cd /var/awslogs/bin
 
sudo rm -f python2 python2.6
 
#デフォルトも名前を変えておく
sudo mv python python_bk_26
sudo mv pip pip_bk_26
 
sudo ln -s python3.5 python
sudo ln -s pip3.5 pip
 
 
##### awscliのインストール

# デーモンを動かす時に /var/awslogs/bin/aws でエラーが出たことがあったので
# 3系に入れなおしたあとに再度awscliを入れる

sudo ./pip install awscli
 

もう一回awslogs-agent-setup.pyトライ

cd cd /opt/awslogs_work/
 
sudo /var/awslogs/bin/python awslogs-agent-setup.py --region ap-northeast-1

Launching interactive setup of CloudWatch Logs agent ...
 
Step 1 of 5: Installing pip ...DONE
 
Step 2 of 5: Downloading the latest CloudWatch Logs agent bits ... DONE
 
### aws アクセスキー情報は適切なものを入力する
# --only-generate-config オプション入れれば再度confファイル作り直せる。
 
Step 3 of 5: Configuring AWS CLI ...
AWS Access Key ID [****************XXXX]:
AWS Secret Access Key [****************XXXX]:
Default region name [ap-northeast-1]:
Default output format [None]:
 
#### 以降はawslogsでログの検知対象とするログファイルを指定する。
Step 4 of 5: Configuring the CloudWatch Logs Agent ...
Path of log file to upload [/var/log/messages]:
Destination Log Group name [/var/log/messages]:
 
Choose Log Stream name:
  1. Use EC2 instance id.
  2. Use hostname.
  3. Custom.
Enter choice [1]:
 
### 検知するログのタイムスタンプのフォーマット
# ここを間違えるとエラーが出まくるが、あとで書き直せる。
Choose Log Event timestamp format:
  1. %b %d %H:%M:%S    (Dec 31 23:59:59)
  2. %d/%b/%Y:%H:%M:%S (10/Oct/2000:13:55:36)
  3. %Y-%m-%d %H:%M:%S (2008-09-08 11:52:54)
  4. Custom
Enter choice [1]:
 
#### ログのどこから検知してくか?だと思う
# たぶん
#  From start of file :ファイルの最初から →アプリがまだ起動してなくて最初からcloudwatchに投げたい
#  From end of file : ファイルの最後から →アプリがすでに起動してて大量にログが書かれてるから、途中からcloudwatchに投げたい
Choose initial position of upload:
  1. From start of file.
  2. From end of file.
Enter choice [1]:
More log files to configure? [Y]: n
 
Step 5 of 5: Setting up agent as a daemon ...DONE
 
 
------------------------------------------------------
- Configuration file successfully saved at: /var/awslogs/etc/awslogs.conf
- You can begin accessing new log events after a few moments at https://console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#logs:
- You can use 'sudo service awslogs start|stop|status|restart' to control the daemon.
- To see diagnostic information for the CloudWatch Logs Agent, see /var/log/awslogs.log
- You can rerun interactive setup using 'sudo python ./awslogs-agent-setup.py --region ap-northeast-1 --only-generate-config'
------------------------------------------------------

起動を確認する

$ sudo service awslogs status
 (pid  8758) を実行中...

タイムフォーマットエラー

設定が終わると自動的にデーモンが起動して、おそらくタイムスタンプフォーマットがエラーだよと
ダーッと /var/log/awslogs.logに吐かれてると思う。

2017-12-12 15:13:32,198 - cwlogs.push.reader - WARNING - 5377 - Thread-4 - Fall back to previous event time: {'start_position': 238799, 'timestamp': 1513018394000, 'end_position': 238926}, previousEventTime: 1513018394000, reason: timestamp could not be parsed from message.




止める

$ sudo service awslogs stop
Stopping system awslogs daemon

設定ファイルの修正

デフォルトは/var/log/messagesを見てるので修正
→別に消してもいいけど。。。

vi /var/awslogs/etc/awslogs.conf
 
 
[/var/log/messages]
log_stream_name = {instance_id}
file = /var/log/messages
#datetime_format = %Y-%m-%d %H:%M:%S
# 2017-12-12T14:50:44.374863+09:00
# こんな風にしてみる
datetime_format = %Y-%m-%dT%H:%M:%S.%f
initial_position = start_of_file
log_group_name = /var/log/messages
buffer_duration = 5000

再度 起動するとエラーはでなくなる

sudo service awslogs start

時間のフォーマットなどはここが参考になった
www.yamamanx.com

                                                              • -

(更新)
あとでやってみたところデフォルトで入ってるpython 2.6で下記のように実行してみたら、なんのエラーもなく実行できてしまった。
実は上述で書いてた下記のコマンドのpythonは仕事で使ってて別のパスに入ってたpythonでデフォルトのpythonでは実行してない。
ここで書くために単にパスを省いて書いてしまった。
んー デフォルトのpythonで何の問題もないじゃん。

curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O

sudo python awslogs-agent-setup.py --region ap-northeast-1