2013年5月29日水曜日

RDSのログをS3に保存する準備

スズキです。

以前、下記でRDSのログをダウンロードするスクリプトを作成してみました。
RubyでRDSのログ(すべてのファイル)をダウンロード
今回は、このログを定期的(1時間に一回?)S3にアップロードする準備をしてみました。

まずは上記で紹介したスクリプトでRDSのログをダウンロードします。
(ファイルのタイムスタンプもRDS上のログのタイムスタンプにそろえています)
# ../download-rds-log
# ll
合計 9232
...      0  5月 29 17:25 2013 mysql-error.log
...  34476  5月 29 17:27 2013 mysql-general.log
...  75796  5月 28 18:00 2013 mysql-general.log.0
...  76212  5月 28 19:00 2013 mysql-general.log.1
...  76139  5月 28 20:00 2013 mysql-general.log.10
...  75796  5月 28 21:00 2013 mysql-general.log.11
...  76212  5月 28 22:00 2013 mysql-general.log.12
...  78126  5月 28 23:00 2013 mysql-general.log.13
...  76212  5月 29 00:00 2013 mysql-general.log.14
...  76125  5月 29 01:00 2013 mysql-general.log.15
...  75883  5月 29 02:00 2013 mysql-general.log.16
...  76139  5月 29 03:00 2013 mysql-general.log.17
...  75869  5月 29 04:00 2013 mysql-general.log.18
...  76139  5月 29 05:00 2013 mysql-general.log.19
...  78503  5月 29 06:00 2013 mysql-general.log.2
...  75796  5月 29 07:00 2013 mysql-general.log.20
...  76212  5月 29 08:00 2013 mysql-general.log.21
...  76139  5月 29 09:00 2013 mysql-general.log.22
...  75869  5月 29 10:00 2013 mysql-general.log.23
...  76139  5月 29 11:00 2013 mysql-general.log.3
...  75796  5月 29 12:00 2013 mysql-general.log.4
...  76212  5月 29 13:00 2013 mysql-general.log.5
...  75796  5月 29 14:00 2013 mysql-general.log.6
...  76212  5月 29 15:00 2013 mysql-general.log.7
...  76139  5月 29 16:00 2013 mysql-general.log.8
...  75869  5月 29 17:00 2013 mysql-general.log.9
... 138717  5月 29 17:27 2013 mysql-slowquery.log
... 331099  5月 28 18:05 2013 mysql-slowquery.log.0
... 281490  5月 28 19:00 2013 mysql-slowquery.log.1
... 306716  5月 28 20:00 2013 mysql-slowquery.log.10
... 331099  5月 28 21:05 2013 mysql-slowquery.log.11
... 307080  5月 28 22:05 2013 mysql-slowquery.log.12
... 287825  5月 28 23:00 2013 mysql-slowquery.log.13
... 332670  5月 29 00:05 2013 mysql-slowquery.log.14
... 280947  5月 29 01:00 2013 mysql-slowquery.log.15
... 306052  5月 29 02:00 2013 mysql-slowquery.log.16
... 332306  5月 29 03:05 2013 mysql-slowquery.log.17
... 305873  5月 29 04:05 2013 mysql-slowquery.log.18
... 281126  5月 29 05:00 2013 mysql-slowquery.log.19
... 314652  5月 29 06:00 2013 mysql-slowquery.log.2
... 331099  5月 29 07:05 2013 mysql-slowquery.log.20
... 307080  5月 29 08:05 2013 mysql-slowquery.log.21
... 305509  5月 29 09:05 2013 mysql-slowquery.log.22
... 306716  5月 29 10:05 2013 mysql-slowquery.log.23
... 281490  5月 29 11:00 2013 mysql-slowquery.log.3
... 331099  5月 29 12:05 2013 mysql-slowquery.log.4
... 281490  5月 29 13:00 2013 mysql-slowquery.log.5
... 331099  5月 29 14:05 2013 mysql-slowquery.log.6
... 281490  5月 29 15:00 2013 mysql-slowquery.log.7
... 332306  5月 29 16:05 2013 mysql-slowquery.log.8
... 280283  5月 29 17:00 2013 mysql-slowquery.log.9

次に下記スクリプトでファイルの末尾をタイムスタンプに変更します。
これは、定期的にS3にアップロードするときに既存のログを上書きしないためです。
(".log"で終わっているファイルは対象外にしています)
# cat ../rename-rds-log
#!/bin/sh

for FILE in *; do
    if [ ${FILE##*.} != "log" ]; then
        mv $FILE ${FILE%.*}.`date -r $FILE +%Y%m%d%H%M%S`
    fi
done
# ../rename-rds-log
# ll
合計 9232
...      0  5月 29 17:25 2013 mysql-error.log
...  34476  5月 29 17:27 2013 mysql-general.log
...  75796  5月 28 18:00 2013 mysql-general.log.20130528180000
...  76212  5月 28 19:00 2013 mysql-general.log.20130528190000
...  76139  5月 28 20:00 2013 mysql-general.log.20130528200000
...  75796  5月 28 21:00 2013 mysql-general.log.20130528210000
...  76212  5月 28 22:00 2013 mysql-general.log.20130528220000
...  78126  5月 28 23:00 2013 mysql-general.log.20130528230000
...  76212  5月 29 00:00 2013 mysql-general.log.20130529000000
...  76125  5月 29 01:00 2013 mysql-general.log.20130529010000
...  75883  5月 29 02:00 2013 mysql-general.log.20130529020000
...  76139  5月 29 03:00 2013 mysql-general.log.20130529030000
...  75869  5月 29 04:00 2013 mysql-general.log.20130529040000
...  76139  5月 29 05:00 2013 mysql-general.log.20130529050000
...  78503  5月 29 06:00 2013 mysql-general.log.20130529060000
...  75796  5月 29 07:00 2013 mysql-general.log.20130529070000
...  76212  5月 29 08:00 2013 mysql-general.log.20130529080000
...  76139  5月 29 09:00 2013 mysql-general.log.20130529090000
...  75869  5月 29 10:00 2013 mysql-general.log.20130529100000
...  76139  5月 29 11:00 2013 mysql-general.log.20130529110000
...  75796  5月 29 12:00 2013 mysql-general.log.20130529120000
...  76212  5月 29 13:00 2013 mysql-general.log.20130529130000
...  75796  5月 29 14:00 2013 mysql-general.log.20130529140000
...  76212  5月 29 15:00 2013 mysql-general.log.20130529150000
...  76139  5月 29 16:00 2013 mysql-general.log.20130529160000
...  75869  5月 29 17:00 2013 mysql-general.log.20130529170000
... 138717  5月 29 17:27 2013 mysql-slowquery.log
... 331099  5月 28 18:05 2013 mysql-slowquery.log.20130528180500
... 281490  5月 28 19:00 2013 mysql-slowquery.log.20130528190000
... 306716  5月 28 20:00 2013 mysql-slowquery.log.20130528200000
... 331099  5月 28 21:05 2013 mysql-slowquery.log.20130528210500
... 307080  5月 28 22:05 2013 mysql-slowquery.log.20130528220500
... 287825  5月 28 23:00 2013 mysql-slowquery.log.20130528230000
... 332670  5月 29 00:05 2013 mysql-slowquery.log.20130529000500
... 280947  5月 29 01:00 2013 mysql-slowquery.log.20130529010000
... 306052  5月 29 02:00 2013 mysql-slowquery.log.20130529020000
... 332306  5月 29 03:05 2013 mysql-slowquery.log.20130529030500
... 305873  5月 29 04:05 2013 mysql-slowquery.log.20130529040500
... 281126  5月 29 05:00 2013 mysql-slowquery.log.20130529050000
... 314652  5月 29 06:00 2013 mysql-slowquery.log.20130529060000
... 331099  5月 29 07:05 2013 mysql-slowquery.log.20130529070500
... 307080  5月 29 08:05 2013 mysql-slowquery.log.20130529080500
... 305509  5月 29 09:05 2013 mysql-slowquery.log.20130529090500
... 306716  5月 29 10:05 2013 mysql-slowquery.log.20130529100500
... 281490  5月 29 11:00 2013 mysql-slowquery.log.20130529110000
... 331099  5月 29 12:05 2013 mysql-slowquery.log.20130529120500
... 281490  5月 29 13:00 2013 mysql-slowquery.log.20130529130000
... 331099  5月 29 14:05 2013 mysql-slowquery.log.20130529140500
... 281490  5月 29 15:00 2013 mysql-slowquery.log.20130529150000
... 332306  5月 29 16:05 2013 mysql-slowquery.log.20130529160500
... 280283  5月 29 17:00 2013 mysql-slowquery.log.20130529170000

最後に圧縮です。
# gzip *
# ll
合計 444
...    36  5月 29 17:25 2013 mysql-error.log.gz
...  1830  5月 28 18:00 2013 mysql-general.log.20130528180000.gz
...  1835  5月 28 19:00 2013 mysql-general.log.20130528190000.gz
...  1814  5月 28 20:00 2013 mysql-general.log.20130528200000.gz
...  1830  5月 28 21:00 2013 mysql-general.log.20130528210000.gz
...  1854  5月 28 22:00 2013 mysql-general.log.20130528220000.gz
...  2329  5月 28 23:00 2013 mysql-general.log.20130528230000.gz
...  1849  5月 29 00:00 2013 mysql-general.log.20130529000000.gz
...  1838  5月 29 01:00 2013 mysql-general.log.20130529010000.gz
...  1842  5月 29 02:00 2013 mysql-general.log.20130529020000.gz
...  1817  5月 29 03:00 2013 mysql-general.log.20130529030000.gz
...  1830  5月 29 04:00 2013 mysql-general.log.20130529040000.gz
...  1829  5月 29 05:00 2013 mysql-general.log.20130529050000.gz
...  2330  5月 29 06:00 2013 mysql-general.log.20130529060000.gz
...  1823  5月 29 07:00 2013 mysql-general.log.20130529070000.gz
...  1840  5月 29 08:00 2013 mysql-general.log.20130529080000.gz
...  1826  5月 29 09:00 2013 mysql-general.log.20130529090000.gz
...  1843  5月 29 10:00 2013 mysql-general.log.20130529100000.gz
...  1830  5月 29 11:00 2013 mysql-general.log.20130529110000.gz
...  1814  5月 29 12:00 2013 mysql-general.log.20130529120000.gz
...  1843  5月 29 13:00 2013 mysql-general.log.20130529130000.gz
...  1840  5月 29 14:00 2013 mysql-general.log.20130529140000.gz
...  1846  5月 29 15:00 2013 mysql-general.log.20130529150000.gz
...  1823  5月 29 16:00 2013 mysql-general.log.20130529160000.gz
...  1840  5月 29 17:00 2013 mysql-general.log.20130529170000.gz
...  1055  5月 29 17:27 2013 mysql-general.log.gz
... 13222  5月 28 18:05 2013 mysql-slowquery.log.20130528180500.gz
... 11287  5月 28 19:00 2013 mysql-slowquery.log.20130528190000.gz
... 12203  5月 28 20:00 2013 mysql-slowquery.log.20130528200000.gz
... 13213  5月 28 21:05 2013 mysql-slowquery.log.20130528210500.gz
... 12454  5月 28 22:05 2013 mysql-slowquery.log.20130528220500.gz
... 12118  5月 28 23:00 2013 mysql-slowquery.log.20130528230000.gz
... 13267  5月 29 00:05 2013 mysql-slowquery.log.20130529000500.gz
... 11316  5月 29 01:00 2013 mysql-slowquery.log.20130529010000.gz
... 12179  5月 29 02:00 2013 mysql-slowquery.log.20130529020000.gz
... 13206  5月 29 03:05 2013 mysql-slowquery.log.20130529030500.gz
... 12254  5月 29 04:05 2013 mysql-slowquery.log.20130529040500.gz
... 11321  5月 29 05:00 2013 mysql-slowquery.log.20130529050000.gz
... 13246  5月 29 06:00 2013 mysql-slowquery.log.20130529060000.gz
... 13036  5月 29 07:05 2013 mysql-slowquery.log.20130529070500.gz
... 12439  5月 29 08:05 2013 mysql-slowquery.log.20130529080500.gz
... 12178  5月 29 09:05 2013 mysql-slowquery.log.20130529090500.gz
... 12184  5月 29 10:05 2013 mysql-slowquery.log.20130529100500.gz
... 11372  5月 29 11:00 2013 mysql-slowquery.log.20130529110000.gz
... 13210  5月 29 12:05 2013 mysql-slowquery.log.20130529120500.gz
... 11285  5月 29 13:00 2013 mysql-slowquery.log.20130529130000.gz
... 13172  5月 29 14:05 2013 mysql-slowquery.log.20130529140500.gz
... 11370  5月 29 15:00 2013 mysql-slowquery.log.20130529150000.gz
... 13232  5月 29 16:05 2013 mysql-slowquery.log.20130529160500.gz
... 11254  5月 29 17:00 2013 mysql-slowquery.log.20130529170000.gz
...  5932  5月 29 17:27 2013 mysql-slowquery.log.gz

ここまで準備ができたら、あとはS3に"s3cmd"などでシンクすればOKだと思います。
※上記を定期的に実行することでローテーションされた差分ログが、
定期的にアップロードされるはずです。

ブログのペースが...
--------
http://www.suz-lab.com

2013年5月15日水曜日

(とりあえず)Chef(Solo)やってみた

スズキです。

そろそろ、ある程度は理解しておかないと置いていかれそうなので...

ダウンロードは下記(本家)から可能です。ここではRHEL6(CentOS6)用を
使っていますが、いろいろなプラットホーム毎に用意されています。
Install Chef

インストール

# curl -L https://www.opscode.com/chef/install.sh | bash
...
Downloading Chef  for el...
...
Installing Chef 
警告: /tmp/tmp.wlXWdFaE/chef-.x86_64.rpm: ヘッダ V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
準備中...                ################################# [100%]
   1:chef                   ################################# [100%]
Thank you for installing Chef!

Gitリポジトリの作成

# mkdir -p /var/chef/cookbooks
# cd /var/chef/cookbooks
# git init
Initialized empty Git repository in /var/chef/cookbooks/.git/

JSONファイルの用意

# cat localhost.json
{
    "run_list": [
        "apache2"
    ]
}
下記の"apache2"の"cookbook"を利用する想定です。
Opscode Community

コミット

# git add .
# git commit -m init
...
 create mode 100644 localhost.json
※"/var/chef/cookbooks"はGitリポジトリにしてコミットまでしてないと
下記がうまく行きませんでした...

"cookbook"のダウンロード?

# knife cookbook site vendor apache2
WARNING: No knife configuration file found
Installing apache2 to /var/chef/cookbooks
Checking out the master branch.
Creating pristine copy branch chef-vendor-apache2
Downloading apache2 from the cookbooks site at version 1.6.2 to /var/chef/cookbooks/apache2.tar.gz
Cookbook saved: /var/chef/cookbooks/apache2.tar.gz
Removing pre-existing version.
Uncompressing apache2 version 1.6.2.
removing downloaded tarball
1 files updated, committing changes
Creating tag cookbook-site-imported-apache2-1.6.2
Checking out the master branch.
Updating ec540d0..2dc8dcb
Fast-forward
...
 111 files changed, 5491 insertions(+), 0 deletions(-)
...
Cookbook apache2 version 1.6.2 successfully installed
上記の"Opscode Community"からダウンロード?しています。

適用?

# chef-solo -j localhost.json
...
上記で作成したJSONファイルを指定しています。

確認

# ps aux | grep http
root   2103 0.0 0.4 73352 2508 ? Ss 11:08 0:00 /usr/sbin/httpd
apache 2106 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2107 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2108 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2109 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2110 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2111 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2112 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2113 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2114 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2115 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2116 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2117 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2118 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2119 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2120 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2121 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
ちゃんと"httpd"まで立ち上がってました!

言葉(用語)の使い方に、まだ自身が持てない...
--------
http://www.suz-lab.com

2013年5月14日火曜日

EC2の価格のJSONを"jq"でいじってみた

スズキです。

@ar1さんが下記記事(EC2およびS3の価格がJSONで取得できる)を公開してくれました。
EC2およびS3の価格をプログラマブルで計算したい人はJSONをたたこう
JSONとくれば「jq」でしょ、ということで"jq"で色々と整形してみました。

まずはリージョン一覧です。
# curl -s http://aws.amazon.com/jp/ec2/pricing/pricing-on-demand-instances.json \
> | jq ' .config.regions[].region '
"us-east"
"us-west-2"
"us-west"
"eu-ireland"
"apac-sin"
"apac-tokyo"
"apac-syd"
"sa-east-1"
何か微妙に期待していた値と違うような...

次にインスタンスタイプです。
# curl -s http://aws.amazon.com/jp/ec2/pricing/pricing-on-demand-instances.json \
> | jq ' .config.regions[] | select(.region == "sa-east-1").instanceTypes[].type '
"stdODI"
"secgenstdODI"
"uODI"
"hiMemODI"
"hiCPUODI"
インスタンスタイプといっても、"m1, m2, m3, c1, ..."の部分ですね...

さらに、"small, large, ..."の部分まで出力してみます。
# curl -s http://aws.amazon.com/jp/ec2/pricing/pricing-on-demand-instances.json \
> | jq ' .config.regions[] | select(.region == "apac-tokyo").instanceTypes[] | { (.type): [ .sizes[].size ] }'
{
  "stdODI": [
    "sm",
    "med",
    "lg",
    "xl"
  ]
}
{
  "secgenstdODI": [
    "xl",
    "xxl"
  ]
}
{
  "uODI": [
    "u"
  ]
}
{
  "hiMemODI": [
    "xl",
    "xxl",
    "xxxxl"
  ]
}
{
  "hiCPUODI": [
    "med",
    "xl"
  ]
}
マイクロって"u"なんですね...(最初よくわからなかった...)

最後にLinuxの金額まで出力してみます。
# curl -s http://aws.amazon.com/jp/ec2/pricing/pricing-on-demand-instances.json \
> | jq ' .config.regions[] | select(.region == "apac-tokyo").instanceTypes[] | { (.type): [ .sizes[] | { (.size): .valueColumns[] | select(.name == "linux").prices.USD } ] } '
{
  "stdODI": [
    {
      "sm": "0.088"
    },
    {
      "med": "0.175"
    },
    {
      "lg": "0.350"
    },
    {
      "xl": "0.700"
    }
  ]
}
{
  "secgenstdODI": [
    {
      "xl": "0.760"
    },
    {
      "xxl": "1.520"
    }
  ]
}
{
  "uODI": [
    {
      "u": "0.027"
    }
  ]
}
{
  "hiMemODI": [
    {
      "xl": "0.505"
    },
    {
      "xxl": "1.010"
    },
    {
      "xxxxl": "2.020"
    }
  ]
}
{
  "hiCPUODI": [
    {
      "med": "0.185"
    },
    {
      "xl": "0.740"
    }
  ]
}
「24時間 x 30日 x 100円(1$)」して一ヶ月分の金額にもしてみました。
# curl -s http://aws.amazon.com/jp/ec2/pricing/pricing-on-demand-instances.json | jq ' .config.regions[] | select(.region == "apac-tokyo").instanceTypes[] | { (.type): [ .sizes[] | { (.size): .valueColumns[] | select(.name == "linux").prices.USD | ( tonumber * 24 * 30 * 100 ) } ] } '
{
  "stdODI": [
    {
      "sm": 6336
    },
    {
      "med": 12599.999999999996
    },
    {
      "lg": 25199.999999999993
    },
    {
      "xl": 50399.999999999985
    }
  ]
}
{
  "secgenstdODI": [
    {
      "xl": 54720.00000000001
    },
    {
      "xxl": 109440.00000000001
    }
  ]
}
{
  "uODI": [
    {
      "u": 1944.0000000000002
    }
  ]
}
{
  "hiMemODI": [
    {
      "xl": 36360
    },
    {
      "xxl": 72720
    },
    {
      "xxxxl": 145440
    }
  ]
}
{
  "hiCPUODI": [
    {
      "med": 13319.999999999998
    },
    {
      "xl": 53279.99999999999
    }
  ]
}
小数点がうざい...

まあ、"jq"の練習です...
--------
http://www.suz-lab.com

2013年5月13日月曜日

Nagios(プラグイン)でDNSラウンドロビンの各IPアドレスに対する(HTTP)監視

スズキです。

プラグインは下記の通りです。
# cat check_dns_roundrobin
#!/bin/sh

. `dirname $0`/utils.sh
PLUGIN=/usr/lib64/nagios/plugins/check_http

while getopts :H:I: OPT; do
    case $OPT in
        H) DNSNAME=$OPTARG;;
        I) DNSNAME=$OPTARG;;
        *) ;;
    esac
done

IP_LIST=`dig +noall +answer $DNSNAME \
| awk '{ print $5 }'`

if [ "$IP_LIST" = "" ]; then
    echo "Can't resolve \"$DNSNAME\"."
    exit $STATE_CRITICAL
fi

for IP in $IP_LIST; do
    OPTIONS=`echo $@ | sed s/$DNSNAME/$IP/g`
    OUTPUT=`$PLUGIN $OPTIONS`
    STATUS=$?
    if [ $STATUS -ne $STATE_OK ]; then
        echo "$IP $OUTPUT"
        exit $STATUS
    fi
done

OUTPUT=`echo $IP_LIST | sed "s/\n/ /g"`
echo "OK $OUTPUT"
exit $STATUS

仕様は次の通りです。
  • オプションは"check_http"と同じ。
  • 一つでも結果がOK以外のIPアドレスがあったら、その時点で終了。
  • プラグインは"utils.sh"が存在するディレクトリに配置

実行すると次のようになります。
失敗(チェックに失敗するIPアドレスが存在)
# ./check_dns_roundrobin -H test.suz-lab.com
192.168.1.1 CRITICAL - Socket timeout after 10 seconds
成功(すべてのIPアドレスがチェック成功)
# ./check_dns_roundrobin -H test.suz-lab.com
OK aaa.aaa.aaa.aaa bbb.bbb.bbb.bbb ccc.ccc.ccc.ccc ddd.ddd.ddd.ddd

ELBのノード監視にも使えるかも...
--------
http://www.suz-lab.com

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

2013年5月9日木曜日

Python版AWSコマンドラインツールでRDSのログ(すべてのファイル)をダウンロード

スズキです。

下記でRDSのログ出力とPython版AWSコマンドラインツールを使ったログの
ダウンロード(個別)を紹介しました。
今回は個別ではなく、特定のRDSで出力されているすべてのログ(ファイル)を
ダウンロードしてみました。
("describe-db-log-files"でログファイル一覧を取得しています)

スクリプトは下記のような感じです。
# cat download-db-logs
#!/bin/sh

FILES=`aws rds describe-db-log-files \
--db-instance-identifier $1 \
| jq '.DescribeDBLogFiles[].LogFileName' \
| sed 's/"//g'`

for FILE in $FILES; do
    echo "######## $FILE ########"
    aws rds download-db-log-file-portion \
    --db-instance-identifier $1 \
    --log-file-name $FILE \
    | jq '.LogFileData' \
    | sed 's/^"//' \
    | sed 's/"$//' \
    | sed 's/\\t/\t/g' \
    | sed 's/\\n/\n/g'
done

実行すると次のような感じになります。
# ./download-db-logs master
######## error/mysql-error-running.log ########
null
######## error/mysql-error-running.log.12 ########
130502 11:11:27 [Warning] IP address '10.0.0.210' could not be resolved: Name or service not known
...
######## error/mysql-error-running.log.9 ########
130502  8:02:03 [Note] /rdsdbbin/mysql/bin/mysqld: Normal shutdown
...
######## error/mysql-error.log ########
null
######## general/mysql-general.log ########
/rdsdbbin/mysql/bin/mysqld, Version: 5.5.27-log (Source distribution). started with:
...
######## general/mysql-general.log.12 ########
/rdsdbbin/mysql/bin/mysqld, Version: 5.5.27-log (Source distribution). started with:
...
######## general/mysql-general.log.13 ########
/rdsdbbin/mysql/bin/mysqld, Version: 5.5.27-log (Source distribution). started with:
...
######## general/mysql-general.log.14 ########
/rdsdbbin/mysql/bin/mysqld, Version: 5.5.27-log (Source distribution). started with:
...
######## slowquery/mysql-slowquery.log ########
null
######## slowquery/mysql-slowquery.log.12 ########
/rdsdbbin/mysql/bin/mysqld, Version: 5.5.27-log (Source distribution). started with:
...
######## slowquery/mysql-slowquery.log.13 ########
/rdsdbbin/mysql/bin/mysqld, Version: 5.5.27-log (Source distribution). started with:
...
######## slowquery/mysql-slowquery.log.14 ########
/rdsdbbin/mysql/bin/mysqld, Version: 5.5.27-log (Source distribution). started with:
...

ただし、"Marker"や"AdditionalDataPending"は考慮していません。
"AdditionalDataPending: true"、つまり未ダウンロードのログが残っている場合は、
そのログはダウンロードできません...

そろそろシェルスクリプトの限界か...これ以上はRubyで書くか...
--------
http://www.suz-lab.com

2013年5月2日木曜日

RDSで"general.log"と"slowquery.log"も出力してみる

スズキです。

下記でRDSのログがダウンロードできるようになったのですが、デフォルトでは
"error.log"と"error-running.log"しか出力されません。
Python版AWSコマンドラインツールでRDSのログをダウンロード
今回は、"general.log"と"slowquery.log"も出力するように設定してみました。

まず、新しい"DB Parameter Group"を作成します。


次に、作成した"DB Parameter Group"のパラメータを変更します。

変更したパラメータは下記となります。

log_output FILE 出力先をファイルに
general_log 1 "general_log"を出力
slow_query_log 1 "slow_query_log"を出力
long_query_time 0 すべてのSQLを出力

※本来"long_query_time"は指定した時間以上かかったSQLが出力されるようにします。

そして、作成した"DB Parameter Group"をRDSに適用します。(リブートも必要でした)


最後に、AWSマネジメントコンソールで確認すると下記のように"general.log"と
"slowquery.log"が出力されていることがわかります。


このログもダウンロードしてみよう。
--------
http://www.suz-lab.com

Python版AWSコマンドラインツールでRDSのログをダウンロード

スズキです。

ちょっと古い情報ですが、以前RDSのログファイルがコンソールで閲覧できたり、
ダウンロードできるようになったりしました。
Amazon RDS - より簡単にログファイルにアクセス可能に
この辺りは下記に詳しく記載されています。
Working with Database Log Files

実際にコンソールを確認してみると下記のようにログを確認することができます。


実際のログは次の通りです。


そして、このログをPython版AWSコマンドラインツールでダウンロードもしてみました。

実際のコマンドと結果は次の通りです。
# aws rds download-db-log-file-portion \
> --db-instance-identifier master \
> --log-file-name error/mysql-error-running.log.7 \
> | jq '.LogFileData' \
> | sed 's/^"//' \
> | sed 's/"$//' \
> | sed 's/\\n/\n/g'
130501  6:50:41 [Note] Plugin 'FEDERATED' is disabled.
130501  6:50:41 InnoDB: The InnoDB memory heap is disabled
130501  6:50:41 InnoDB: Mutexes and rw_locks use GCC atomic builtins
130501  6:50:41 InnoDB: Compressed tables use zlib 1.2.3
130501  6:50:41 InnoDB: Using Linux native AIO
130501  6:50:41 InnoDB: Initializing buffer pool, size = 311.0M
130501  6:50:41 InnoDB: Completed initialization of buffer pool
130501  6:50:41  InnoDB: Log file /rdsdbdata/log/innodb/ib_logfile0 did not exist: new to be created
InnoDB: Setting log file /rdsdbdata/log/innodb/ib_logfile0 size to 128 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Progress in MB: 100
130501  6:50:46  InnoDB: Log file /rdsdbdata/log/innodb/ib_logfile1 did not exist: new to be created
InnoDB: Setting log file /rdsdbdata/log/innodb/ib_logfile1 size to 128 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Progress in MB: 100
130501  6:50:52 InnoDB: highest supported file format is Barracuda.
InnoDB: The log sequence number in ibdata files does not match
InnoDB: the log sequence number in the ib_logfiles!
130501  6:50:52  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
130501  6:50:52  InnoDB: Waiting for the background threads to start
130501  6:50:53 InnoDB: 1.1.8 started; log sequence number 1606156
130501  6:50:53 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
130501  6:50:53 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
130501  6:50:53 [Note] Server socket created on IP: '0.0.0.0'.
130501  6:50:53 [Note] Event Scheduler: Loaded 0 events
130501  6:50:53 [Note] /rdsdbbin/mysql/bin/mysqld: ready for connections.
Version: '5.5.27-log'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution

"jq"が、かなり得意になってしまった...
--------
http://www.suz-lab.com