awscliでRDSのログを見る

よく訓練されたアップル信者、都元です。本日は小ネタで。

RDSのログ参照API

RDS for MySQLでは、DBParameterGroupに設定を行うことにより、slow query log や general log を参照できるようになることが知られています *1

このログファイルは、API経由で参照できます。具体的には、DescribeDBLogFilesアクションによって今存在するログファイルの名前・サイズ・最終更新タイムスタンプを確認し、DownloadDBLogFilePortionアクションでファイルの内容を参照できます。

awscliでログ参照

awscliにおいては、下記のようなコマンドでDescribeDBLogFilesアクションを実行可能です。

$ aws rds describe-db-log-files --db-instance-identifier xxxx
{
    "DescribeDBLogFiles": [
        {
            "LastWritten": 1398999600000,
            "LogFileName": "error/mysql-error.log",
            "Size": 0
        },
        {
            "LastWritten": 1398999899000,
            "LogFileName": "general/mysql-general.log",
            "Size": 110709
        },
        {
            "LastWritten": 1398999600000,
            "LogFileName": "general/mysql-general.log.3",
            "Size": 264104
        },
        {
            "LastWritten": 1398999600000,
            "LogFileName": "slowquery/mysql-slowquery.log",
            "Size": 183
        },
        {
            "LastWritten": 1398999300000,
            "LogFileName": "slowquery/mysql-slowquery.log.3",
            "Size": 1281
        }
    ]
}

ファイルが大量にある場合はこのままでは見づらいので、jqで整形しましょう。1ファイル1行で、そこそこ見やすくなりました。

$ aws rds describe-db-log-files --db-instance-identifier xxxx | jq -c ".DescribeDBLogFiles[]"{"Size":0,"LogFileName":"error/mysql-error.log","LastWritten":1398999600000}
{"Size":106323,"LogFileName":"general/mysql-general.log","LastWritten":1398999855000}
{"Size":264104,"LogFileName":"general/mysql-general.log.3","LastWritten":1398999600000}
{"Size":183,"LogFileName":"slowquery/mysql-slowquery.log","LastWritten":1398999600000}
{"Size":1281,"LogFileName":"slowquery/mysql-slowquery.log.3","LastWritten":1398999300000}

さて、DownloadDBLogFilePortionアクションはというと…。

$ aws rds download-db-log-file-portion --db-instance-identifier xxxx --log-file-name general/mysql-general.log
{
    "LogFileData": [
        "/",
        "r",
        "d",
        "s",
        "d",
        "b",
        "b",
        "i",
        "n",
        "/",
        "m",
        "y",
        "s",
        "q",
        "l",
        "/",
        "b",
        "i",

思わず目を疑いました。 / ... r ... d ... s ... d ... b ... b ... i ... n ... って1文字ずつかよw

よろしい、ならばjqで整形だ

でも大丈夫。jqは非常に優秀です。addという関数で一発結合!

$ aws rds download-db-log-file-portion --db-instance-identifier xxxx --log-file-name general/mysql-general.log | jq ".LogFileData | add"
"/rdsdbbin/mysql/bin/mysqld, Version: 5.6.13-log (MySQL Community Server (GPL)). started with:\nTcp port: 3306  Unix socket: /tmp/mysql.sock\n(略)

うーん、改行コードが\nで表現されているため、全体が1行で出ちゃいました。そこでraw-outputオプション-rを使うと…。

$ aws rds download-db-log-file-portion --db-instance-identifier xxxx --log-file-name general/mysql-general.log | jq -r ".LogFileData | add"
/rdsdbbin/mysql/bin/mysqld, Version: 5.6.13-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument
		21943 Query	select @@session.tx_read_only
		21943 Query	SELECT 1
		21943 Query	select @@session.tx_read_only
		21943 Query	select name from mysql.plugin
		21943 Query	select @@session.tx_read_only
		21943 Query	SELECT 1
		21943 Query	select @@session.tx_read_only

欲しい結果が得られました。いやーー、jqって強力ですねぇ。

脚注