AWS CLIを使ってRDSのログファイルを読む

aws_logo

一部の人に喜んでもらえたので、手順を書いてみる。

ログファイルの一覧を取得

まずは RDS インスタンスに紐付けられたログファイルの一覧を取得
rds describe-db-log-files --db-instance-identifier コマンドを使う

# http://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-log-files.html
$ aws rds describe-db-log-files --db-instance-identifier xxx
{
    "DescribeDBLogFiles": [
        {
            "LastWritten": 1415809200000,
            "LogFileName": "error/mysql-error.log",
            "Size": 0
        },
        {
            "LastWritten": 1415809200000,
            "LogFileName": "slowquery/mysql-slowquery.log",
            "Size": 732
        },
        ...
        {
            "LastWritten": 1415782800000,
            "LogFileName": "slowquery/mysql-slowquery.log.9",
            "Size": 2379
        }
    ]
}

ログファイルを取得

rds download-db-log-file-portion --db-instance-identifier --log-file-name コマンドを使う

# http://docs.aws.amazon.com/cli/latest/reference/rds/download-db-log-file-portion.html
$ aws rds download-db-log-file-portion --db-instance-identifier xxx --log-file-name slowquery/mysql-slowquery.log --output json
{
    "LogFileData": [
        "/",
        "r",
        "d",
        "s",
        "d",
        "b",
        "b",
        "i",
        "n",
        "/",
        "m",
        "y",
        "s",
        "q",
        "l",
        "/",
        "b",
        "i",
        ...
        "\n"
    ]
}

ここで問題が発生。
aws cli デフォルトの JSON 形式で出力すると、要素 LogFileData が1バイトずつぶつ切りにされてしまっている。
この事象の原因調査はひとまず保留して、行単位で出力される方法を考える。

解決1:行単位で出力

諸般の事情により JSON 形式をやめられない場合、--number-of-lines を渡して行指向で出力させる。
このオプションは aws cli のリファレンスには記載がないけれども、aws-cli が叩いている REST API には記載がある。

http://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DownloadDBLogFilePortion.html

aws cli は REST API のコマンドラインインターフェースに過ぎないので、aws cli のリファレンスで解決しなかった時は、REST API のリファレンスを参照すると解決することが多い。

$ aws rds download-db-log-file-portion --db-instance-identifier xxx --log-file-name  "slowquery/mysql-slowquery.log.6"  --number-of-lines 3
{
    "Marker": "18:2379",
    "AdditionalDataPending": true,
    "LogFileData": "/rdsdbbin/mysql/bin/mysqld, Version: 5.6.19-log (MySQL Community Server (GPL)). started with:\nTcp port: 3306  Unix socket: /tmp/mysql.sock\nTime                 Id Command    Argument\n"
}

jqLogFileData だけを抽出

$ aws rds download-db-log-file-portion --db-instance-identifier xxx --log-file-name  "slowquery/mysql-slowquery.log.6"  --number-of-lines 3 | jq '.LogFileData'
"/rdsdbbin/mysql/bin/mysqld, Version: 5.6.19-log (MySQL Community Server (GPL)). started with:\nTcp port: 3306  Unix socket: /tmp/mysql.sock\nTime                 Id Command    Argument\n"

改行文字がそのまま表示されているので、コンソールに改行が反映されるようにする。

$ aws rds download-db-log-file-portion --db-instance-identifier xxx --log-file-name  "slowquery/mysql-slowquery.log.6"  --number-of-lines 3 | jq '.LogFileData' | sed 's/\\n/\n/g'
"/rdsdbbin/mysql/bin/mysqld, Version: 5.6.19-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument
"

--number-of-lines で指定した行数だけ取得できている。

なお REST API リファレンスにあるように、オフセット(--marker) を指定しなかった場合、ログファイルの一部しか取得できない。
ログファイル全体が欲しい場合、"AdditionalDataPending" : false となるまで オフセット(--marker) を指定しながら次の N 行を繰り返し取得する。

You can download the log file in blocks of lines by specifying the size of the block using the NumberOfLines parameter, and by specifying a value of “0” for the Marker parameter in your first request. Include the Marker value returned in the response as the Marker value for the next request, continuing until the AdditionalDataPending response element returns false.
http://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DownloadDBLogFilePortion.html

解決2:text 形式で出力

レスポンスフォーマットを JSON に固執しなくても良い場合、 aws cli の出力形式を text にすればレスポンスボディ XML の LogFileData だけがそのまま表示される。

$ aws rds download-db-log-file-portion --db-instance-identifier xxx --log-file-name "slowquery/mysql-slowquery.log.6" --output text
/rdsdbbin/mysql/bin/mysqld, Version: 5.6.19-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument
/rdsdbbin/mysql/bin/mysqld, Version: 5.6.19-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument
...

リファレンスにもあるように --marker--number-of-lines も指定していないため、ログファイル全体が返ってくる。

特別な理由がない限り、このアプローチが楽ちんかと。

Advertisements
Tagged with: ,
Posted in aws

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 6 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 6 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 6 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 1 year ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: