下記記事にて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
また「Python版AWSコマンドラインツールでRDSのログ(すべてのファイル)をダウンロード」 にて課題となっていた
下記事項にも対応しています。
本件、”Marker”や”AdditionalDataPending”は考慮していません。 また、”AdditionalDataPending: true”、つまり未ダウンロードのログが残っている場合は、 そのログはダウンロードできません。
ダウンロードファイルのタイムスタンプも”Last Written”に揃えています。
次回はダウンロードしたファイルをS3にアーカイブしてみようと思います。