CloudWatch Logs でサーバログを収集する。
固定のEC2インスタンスが1台のみ。みたいな構成の場合は不要かもしれないが商用サービスをする上でログは集約させて処理するのが常道である。と思っている。
例えば昔であればrsyslogなどを使ってsyslog経由でログサーバに集約させていた。比較的新し目の構成だとfluentdとか使う感じですかね?
AWSだとマネージドなサービスとしてCloudWatch Logsがある。以下、AmazonLinuxの場合。
ポリシーの設定
Agentがログを蓄積させるために実行する為に、次の権限が必要なので下記をAllowする。
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
- logs:DescribeLogStreams
具体的な操作としては AWSコンソール > IAM > Roles > Policies でカスタムポリシーを作成する。
設定するポリシーはこんな感じになる。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams" ], "Resource": [ "arn:aws:logs:*:*:*" ] } ] }
ロールの設定
EC2インスタンスにインスタンスロールが設定されている場合は対象のインスタンスロールに上で作ったポリシーを追加する。
インスタンスロールが設定されていない場合は作成する。ロールの作り方やインスタンスへの設定方法はググれ。
エージェントのインストール
sudo yum insltall awslogs
設定
/etc/awslogs/awslogs.conf
に設定ファイルがあるので設定変更する。
LogStream毎の設定を/etc/awslogs/config/
に配置することで設定ファイルのコンパートメント化が出来る。ストリーム毎の設定はこちらで管理するのが良い。
例えば全台で共通して収集するログファイルの設定を共通化して各サーバに配布することで設定の共通化が出来、「なんかサーバ毎に設定が微妙に違うんだけど…」みたいな事態を防げる。Ansibleなどで配布すると良いですね。
設定内容に関してはCloudWatch Logs エージェントのリファレンス - Amazon CloudWatch ログを参考にする。
各ログストリームの設定は最低でも下記が必要。
[logstream1] log_group_name = value log_stream_name = value datetime_format = value file = value
設定後にサービスの起動と自動起動を設定する。
sudo service awslogs start sudo chkconfig awslogs on
確認
CloudWatch のマネージドコンソールにアクセス。 Log Groupsのカテゴリに設定したロググループが出来ていること。ロググループをクリックしてLog Streamが追加されている事を確認。
当たり前だが対象になるログが記録されないとStreamにも記録されない。 送信タイミングがあるのであまりwktkしながら見に行くとガッカリする。落ち着こう。(最後に記録されて5秒durationが開くと送信される)
料金
(東京リージョンの場合)
正直良くわからんw最低このあたりから?
- Dashbord料金:$3.00
- アーカイブ :$0.033/GB/Month
別途データ転送量が掛かる。はず。
何でもかんでもCloudWatch Logsに取り込んでいるとボディブローのように料金が嵩む気がする。知見ある人のご意見を聞きたい。
次回予定
CloudWatch Logs に蓄積したログをS3に定期的にエクスポートする予定。