Amazon CloudWatch Logsを試してみる

AWS


インフラエンジニアの指原です!

AWSにはCPU使用率などをモニタリングするCloudWatchというサービスがあります。
CloudWatchには様々な機能がありますが、今回はその中でも気になっていたCloudWatch Logsを試してみました。

CloudWatch Logsとは?

EC2やその他アプリケーションのログファイルをモニタリングしたり、特定の文字列を確認した際にアラームを発生させたりできるサービスです。

ログファイルのモニタリング – Amazon CloudWatch

とりあえずEC2上のapacheのアクセスログを送信するところまでやってみようと思います。

IAMロールの作成

CloudWatch Logsにログファイルを送信するためにIAMロールを作成してやります。

EC2からログファイルの送信を行うのでロールタイプはAmazon EC2を選択

2016-07-13_12h12_44

CloudWatch Logsのポリシーが用意されているので今回はこれを利用します。

CloudWatchlogsFullAccessを選択
2016-07-13_12h13_13

IAMの設定はこれだけでOKです。

その後IAMロールを付与したEC2インスタンスを作成します。

awslogsのインストール

起動したインスタンスにログイン後、専用エージェントであるawslogsをインストールします。

[ec2-user@ip-172-xxx-xxx-xxx ~]$ sudo yum install awslog

続いて設定ファイルの変更です。
デフォルトの設定だとバージニア北部リージョン(us-east-1)のCloudWatchを使用してしまうので東京リージョン(ap-northeast-1)に変更します。

[ec2-user@ip-172-xxx-xxx-xxx ~]$ sudo vim /etc/awslogs/awscli.conf

[default]
region = us-east-1
⇒region = ap-northeast-1

エージェントの起動、自動起動の設定を行います。

[ec2-user@ip-172-xxx-xxx-xxx ~]$ sudo /etc/init.d/awslogs start
Starting awslogs: [ OK ]

自動起動設定

[ec2-user@ip-172-xxx-xxx-xxx ~]$ sudo chkconfig awslogs on

これで送信されているはず!
確認してみましょう!!

ログ送信の確認

コンソール上で確認すると「/var/log/messages」というロググループが作成されていることが分かります。
2016-07-13_17h42_26

クリックするとログストリームにインスタンスIDが出力されています。
2016-07-13_17h01_03

さらにこいつをクリックするとmessagesの内容が確認できます。
2016-07-13_17h02_46

いけましたね!

なぜmessagesがCloudWatch Logsに書き込まれるのか?

⇒デフォルトでmessagesが設定されているからです。

設定は/etc/awslogs/awslogs.confに書かれています。

[/var/log/messages]
datetime_format = %b %d %H:%M:%S
file = /var/log/messages
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/messages

apacheのアクセスログを送信する

では今度はapacheのアクセスログをCloudWatch Logsに出力してみましょう!

サーバ上で設定ファイルを変更します。

[ec2-user@ip-172-xxx-xxx-xxx ~]$ sudo vim /etc/awslogs/awslogs.conf

以下を追記します。

[/var/log/httpd/]
file = /var/log/httpd/access_log
buffer_duration = 5000
log_stream_name = {hostname}
initial_position = start_of_file
log_group_name = /var/log/httpd

上記設定の内容です。

file

CloudWatch Logs にプッシュするログファイルを指定(/var/log/httpd/*のようにワイルドカード指定も可能です。)

buffer_duration

ログイベントのバッチ期間を指定(5000は最小値且つデフォルト)

log_stream_name

ログストリームの設定(デフォルトはinstance_idですが今回はhostnameにしてみます)

initial_position

データの読み出し位置の指定、end_of_fileもありますが、基本的にはデフォルトのstart_of_fileでいいと思います。

log_group_name

送信先ロググループを指定します。

設定を反映するためにawslogsを再起動します。

[ec2-user@ip-172-xxx-xxx-xxx ~]$ sudo /etc/init.d/awslogs restart

ログ送信の確認

これで確認してみましょう!!
再度コンソールから確認。。。
2016-07-13_17h42_09

「/var/log/httpd」が追加されています!!
さらにクリックしてみると。。

2016-07-13_15h13_46

ホスト名でログストリームが作成されてますね!!

apacheのアクセスログも確認できました!!
2016-07-13_17h29_03

簡単でしたね!!
今回はapacheのアクセスログを送信するだけでしたが、HTTPのステータスコードを監視して40xのエラーが出たときにアラームを送信することも可能です。

その他ElasticSearchと連携してログの分析なども行えます。

まとめ

  • CloudWatch Logsとはログ収集用サービス
  • 使用するにはawslogsというエージェントが便利
  • 送信するだけなら超簡単

次は巷で話題のAWS Lambdaを使用してサーバーレスアーキテクチャを実現してみます!


この記事をかいた人

About the author