2013年5月13日月曜日

RubyでRDSのログ(すべてのファイル)をダウンロード

スズキです。

下記でPython版AWSコマンドラインツールを用いたスクリプトを作成したのですが、
やはりシェルスクリプトでは、かゆいところに手が届きづらく、
結局Rubyを使ってしまいました...

対象のログは下記です。


スクリプトは、こんな感じです。
# cat download-db-log-file
#!/usr/bin/ruby

require 'rubygems'
require 'aws-sdk'

AWS.config({ :region => 'ap-northeast-1' })
db_instance_identifier = 'suzuki'
max_records            = 0
number_of_lines        = 0

client = AWS::RDS.new.client

log_files = client.describe_db_log_files({
    :db_instance_identifier => db_instance_identifier,
    :max_records            => max_records
})

log_files.describe_db_log_files.each do |log_file|

    additional_data_pending = true
    marker                  = '0:0'

    while additional_data_pending do

        log = client.download_db_log_file_portion({
            :db_instance_identifier => db_instance_identifier,
            :log_file_name          => log_file.log_file_name,
            :marker                 => marker,
            :number_of_lines        => number_of_lines
        })

        log_file_name = log_file.log_file_name.split("/")[1]
        File.open(log_file_name, "a") do |io|
            if !log.log_file_data.nil? then
                io.print(log.log_file_data)
            end
        end
        timestamp = log_file.last_written / 1000
        File::utime(timestamp, timestamp, log_file_name)

        additional_data_pending = log.additional_data_pending
        marker                  = log.marker

    end

end

実行すると、このようになります。
# ./download-db-log-file
# ll
合計 904
-rw-r--r-- 1 ...      0  5月 13 12:00 2013 mysql-error-running.log
-rw-r--r-- 1 ...   1915  5月 13 10:48 2013 mysql-error-running.log.2
-rw-r--r-- 1 ...   1356  5月 13 11:05 2013 mysql-error-running.log.3
-rw-r--r-- 1 ...      0  5月 13 13:20 2013 mysql-error.log
-rw-r--r-- 1 ...  29956  5月 13 13:23 2013 mysql-general.log
-rw-r--r-- 1 ...  80236  5月 13 12:05 2013 mysql-general.log.3
-rw-r--r-- 1 ...  69861  5月 13 13:00 2013 mysql-general.log.4
-rw-r--r-- 1 ...  94849  5月 13 13:23 2013 mysql-slowquery.log
-rw-r--r-- 1 ... 320669  5月 13 12:05 2013 mysql-slowquery.log.3
-rw-r--r-- 1 ... 306948  5月 13 13:05 2013 mysql-slowquery.log.4

下記にも対応しています。
ただし、"Marker"や"AdditionalDataPending"は考慮していません。
"AdditionalDataPending: true"、つまり未ダウンロードのログが残っている場合は、
そのログはダウンロードできません...
ダウンロードファイルのタイムスタンプも"Last Written"にそろえています。

次はダウンロードしたファイルをS3にアーカイブするところです...
--------
http://www.suz-lab.com

0 コメント: