CloudWatchのログ蓄積とモニタリングを使ってみる(その2)

2014年8月25日月曜日 Kouta Mikawa

皆さんこんにちは。今日も元気に運用してますか?Mikawaです。
今日は前回の続きとして、CloudWatchのログ蓄積に関してもう少し書きたいと思います。
前回はAWSから提供されているエージェントを仕込んで、CloudWatchに流す簡単な
お話でしたが、皆さんはどうも満足されていないようなので、もう少し突っ込んだ使い方
をしてみます。


「サーバのログはいいんだけど、ほら、ログ出す奴って
他にもあるじゃん?S3とかCloudFrontとかELBとかさあ」

というマネージドサービスにどっぷり浸かった我儘な方 良く訓練された
AWSユーザの方(私も含む)、まあ見たいですよね。CloudWatchで。

では、エージェント以外でログを送る手段はあるのかと言えば、当然あります。
APIを使えば良いんですね。(公式ブログの下のほうにもちょろっと書いてある)

ということで、私はRubyで書きたいのでその辺から準備します。
まずはドキュメントの確認ですが、それっぽいのはないですね。
でも、大丈夫。私たちには開発プレビュー版のversion2があります!(ドキュメントはこちら
ふむふむ、CloudWatchLogsなるものがありますね。それっぽいですね。

ドキュメントを見ながら書くとこんな感じでしょうか。
(キーとかログファイルのパスは必要な値を入れてください。)

#coding: utf-8
require 'rubygems'
require 'aws-sdk-core'

cloudwatchlogs = Aws::CloudWatchLogs::Client.new(
  access_key_id: ACCESS_KEY,
  secret_access_key: SECRET_KEY,
  region: 'us-east-1'
)

time = Time.now
time =  time.to_i * 1000 + (time.usec / 1000.0).round

token = nil
File.open("./s3-log.txt","r").each do |line|
  res = cloudwatchlogs.put_log_events(
    log_group_name: 'test',
    log_stream_name: 'test',
    log_events: [
      {
        timestamp: time,
        message: line,
      },
    ],
    sequence_token:token,
  )
  token =  res.data[:next_sequence_token]
end

logGroupとlogStreamはAPIからでも作れそうですが、今回は事前に用意しました。
あと、timestampは本来ログから起こさないとダメですね。
S3のログファイル名も解りやすく変えてあります。
putする際にはtokenがポイントですね。


S3のログかどうかわかりづらいのでMetric Filterで見やすくしようとしましたが、モザイクでだめ
ですね。bucketがあるのはわかって頂けるかと思います。
これで、色々放り込めると思いきや...

  • The maximum batch size is 32,768 bytes, and this size is calculated as the sum of all event messages in UTF-8, plus 26 bytes for each log event.
  • None of the log events in the batch can be more than 2 hours in the future.
  • None of the log events in the batch can be older than 14 days or the retention period of the log group.
  • The log events in the batch must be in chronological ordered by their timestamp.
  • The maximum number of log events in a batch is 1,000.

APIドキュメントに色々制約があることが、書かれています。
この感じだとちょっと微妙そうな予感がしますね。
それではまた次回お会いしましょう。