share facebook facebook2 twitter menu hatena pocket slack

2014.07.17 THU

AWS 白帯シリーズ(8) Amazon CloudWatch Logs を日本で 12 番目位に試してみる

川原 洋平

WRITTEN BY川原 洋平

cloudpack の 自称 Sensu芸人 の かっぱこと 川原 洋平@inokara)です。

追記(2)

今回試した手順は以下のドキュメントを参考にしてセットアップしました。


追記

勝手に CloudWatch Logs Q&A をやってみます。

コストは?

現時点では下記のように記載されておりました。

  • $0.50 per GB ingested
  • $0.03 per GB archived per month**

無料ではないようです!

アーカイブの仕様は?

コストにも絡むことですが…こちらを抜粋させて頂くと…

Data archived by CloudWatch Logs includes 26 bytes of metadata per log event and is compressed using gzip level 6 compression. Archived data charges are based on the sum of the metadata and compressed log data size

以下の仕様でアーカイブされます。

  • ログファイル毎に 26 バイトのメタデータが付加される
  • Level 6 の gzip 圧縮される
  • アーカイブデータの課金はメタデータを含んだ圧縮された容量で課金される

@kaz_goto さん、教えて頂きまして有難うございます!

aws cli が動いてる?

動いているようです。

root      1912  0.0  0.1 115052  1184 pts/0    S    07:29   0:00 /bin/sh /var/awslogs/bin/awslogs-agent-launcher.sh
root      1914  0.1  2.5 437004 26024 pts/0    SNl  07:29   0:10 /var/awslogs/bin/python2.6 /var/awslogs/bin/aws logs push --config-file /var/awslogs/etc/awslogs.conf

上記のように aws logs push するプロセスが動いています。

はじめに

AWS Summit NewYorkCloudWatch Logs というサービスが公開になったようですので試してみたいと思います。

サービス自体はまだ東京リージョンでは公開されておらず、一部のリージョン(N. Virginia)のみとなっているようですが、既に実際にサービスを試されている方がいらっしゃいますので詳しくはそちらの記事を御覧ください!

す、凄いです!


さて、なにをしよう

既に上記の記事でインストール手順等について詳しく解説されており、書くことはあまりなさそうですが…

Amazon CloudWatch Logs とは?

  • CloudWatch を利用してインスタンスのアプリケーションログやシステムのログをリアルタイムに監視するサービス
  • 各種ログを追跡してエラー率がしきい値を超えた場合に通知を出すことも可能(アプリケーションログに出力される「NullReferenceException」や Apache ログの 404 エラー等)
  • 収集したログを S3 に保存することが出来る
  • 保存期間を設けて期間を過ぎたログは自動削除も設定することが出来る

コンセプト

ドキュメントの冒頭に書かれているコンセプトを超強引な意訳でまとめてみます。もちろん、協力は Powerd by Google 翻訳です。

コンセプト 詳細
Log Events 監視されているアプリケーションログ。イベント発生時点のタイムスタンプと未加工のイベントメッセージが記録されている。イベントメッセージは UTF-8 エンコードされている必要がある。
Log Streams ログの吐き出し先。保存ストレージではなく流しておく入れ物を想像して頂ければ…。二ヶ月間保持されていて二ヶ月間ログの出力が無い場合にはストリームそのものが削除される。各インスタンスのアプリケーション毎にストリームを関連付けることが出来る。
Log Groups Log Stream を同一の保持期間、監視、アクセス制御にグルーピングしたもの。
Metric Filters ログから取得したイベントの中からメトリクスを抽出して CloudWatch のデータポイントに変換する為に利用する。メトリクスフィルタは Log Group に割り当てられ Log Stream に適用される。
Retention Settings ログの保存期間。期限切れのログは自動的削除されます。Log Group に割り当てられ Log Stream に適用される。

上記、超意訳ですので誤訳があったりますのでご注意下さい。

Getting Started

ま、ドキュメントを見ながらセットアップしていきましょう。

前提条件

以下のような環境をサポートしています。

  • AWS resources in the US East (Northern Virginia) Region. Other AWS regions are not supported.
  • Python 2.6.5 or later
  • Amazon Linux version 2014.03.02 or later, Ubuntu Server version 14.04 or later
ステップ
ポリシー設定

IAM ロールで以下のポリシーを定義しておきます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:*",
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:logs:us-east-1:*:*",
        "arn:aws:s3:::*"
      ]
    }
  ]
}

これはセットアップの際に Amazon S3 上のバケットに置いてあるセットアップファイルを読み込む為だと思われます。

インスタンス起動

上記で定義しておいた IAM ロールを適用してインスタンスを起動します。

エージェントのインストールとセットアップ

エージェントのインストールも簡単です。

以下のようにインストーラースクリプトをダウンロードしてきます。

wget https://s3.amazonaws.com/aws-cloudwatch/downloads/awslogs-agent-setup-v1.0.py

次にダウンロードしてきたスクリプトを実行するとコマンドラインのウィザードにて設定が行われます。

sudo python ./awslogs-agent-setup-v1.0.py --region us-east-1

以下の内容を設定しますので、あらかじめ控えておきましょう。

設定項目 内容
AWS Access Key ID AWS のアクセスキーを設定します。IAM ロールを利用している場合には設定不要ですので何も入力せず Enter で進みます
AWS Secret Access Key AWS のシークレットアクセスキーを設定します。アクセスキー同様に IAM ロールを利用している場合には何も入力せず Enter で進みます
Default region name 現時点では us-east-1 のみです
Default output format 要確認
Path of log file to upload ログを送信する際のパスを指定します。インストーラーがお薦めしてくれます。
Destination Log Group name ログのグループ名を指定します。インストーラーがお薦めしてくれます。
Destination Log Stream name デフォルトではホスト名が指定されます。インストーラーもホスト名をお薦めしてきます
Timestamp format ログに記録されるタイムスタンプのフォーマットを指定します。
Initial position データのアップロード方法を設定します。全てのデータをアップロードする際には start_of_file を指定して新しいデータをアップロードする際には end_of_file を指定します

実際にインストーラースクリプトを実行した結果は以下のとおりです。

01

ほぼ Enter キーだけで設定が終わりました。今回は /var/log/messages を対象にしましたが、他のログにも適用したい場合には More log files to configure? という質問に対しては素直に Enter キーで対応しましょう。正常に設定が終わると赤枠の中に各種情報が出力されます。よく確認しておきましょう。

あらためてセットアップしたい場合
sudo ./awslogs-agent-setup.py --region us-east-1 --only-generate-config
設定ファイル(/var/awslogs/etc/awslogs.conf)

/var/awslogs/etc/awslogs.conf に保存された設定ファイルは下記のようなものになりました。

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

が冒頭についた行はコメントとみなされるようです。

awslogs サービスを起動する

正常にセットアップが終わると awslogs という init スクリプトが /etc/init.d/ 以下に保存されています。

/etc/init.d/awslogs

満を持して awslogs を起動しましょう。

/etc/init.d/awslogs start

以下のように起動を確認しました。

02

せっかくなので awslogs 自身のログも確認してみましょう。以下のようなログが出力されています。

03

Publish batch の部分を見るとログ自身は JSON のようです。

CloudWatch にて確認

Manegament Console から CloudWatch のメニューを選択すると左メニューに Logs というメニューが追加されていることがわかります。

04

Logs をクリックすると Logs Groups のテーブルに /var/logs/messages というリストがリストアップされていますので、 /var/logs/messages というリストをクリックすると…

05

上記のように Log Streams というリストが表示され、i-xxxxxx で始まる Log Stream がリストされていることがわかります。さらに、i-xxxxxx をクリックすると…

06

上記のようにインスタンス ID-xxxxxx(設定で Log Stream をインスタンス ID にしてましたね)の /var/log/messages の内容を確認することが出来ました。


最後に

ああ、こんな使い方が出来そう

logwatch とかの代替

従来はインスタンスにログインして logwatch 等のログ監視ツールを導入して、アラートを設定して…と頑張る必要がなくなりそうです。

クラスタ毎のログ監視

各インスタンス毎の Apache の access.log で Log Stream を作って Log Group でグルーピングしておいてインスタンスクラスタ毎のイベントを監視して通知出来そう

他にも使い方があれば追記していきます。

今回やったこと

  • 新しいインスタンスを起動して CloudWatch Logs を設定しました
  • インスタンス内の /var/log/messages を監視対象として設定し Management Console からログを確認しました

次回やりたこと

  • フィルター等の設定を行い CloudWatch の通知機能と連携させてみたいと思います

感じたこと

  • セットアップ簡単!
  • 設定仕込んでおけば障害発生時等にインスタンスにログインしてログを確認する機会も減ってきそうですね

元記事は、こちら