limitusus’s diary

主に技術のことを書きます

RDS logをRubyでダウンロード

AuroraのAudit log検証をしていて、「これ定期的にS3にアップロードしないと消えるよね?」って話になったので、まずはRDSから取ってくるとこからだね…ってことでやってみることにしました。

候補手段

 方法はいくつかあるんですが、

1. rds-cliを使う

もうdeprecatedだそうで、今後メンテされないものを今から使い始めるというのはいかにもセンスがないので却下。

docs.aws.amazon.com

The Amazon RDS Command Line Interface (RDS CLI) has been deprecated. Instead, use the AWS CLI for RDS.

 

2. aws-cliを使う

アリなんですが、aws-cliだとrds download-db-log-file-portionというコマンドになり、最大1MB単位でしかダウンロードできず、何度も呼び出して連結して…という処理を書くのがめんどくさいので避けたいところです。

download-db-log-file-portion — AWS CLI 1.11.118 Command Reference

3. SDKを使う

2の方法だとshell scriptで繰り返し処理を書くのがめんどくさいということで、RubyなりPythonなりで書くのが現実的でしょう。SDKでダウンロードするAPIもあります。

Rubyだと Aws::RDS::Client#download_db_log_file_portion が用意されています。ただ、2とほぼ同様にmarkerをリクエストに入れて何度も呼び出す仕組みであり、めんどくさい…

4. DownloadCompleteDBLogFileを使う

[Tips] Amazon RDSのログファイルから全てのメッセージを取得する方法 | Developers.IO でも紹介されている方法です。ここではPythonでやっていますが、今回Rubyで書きたいなと思ったのでRubyでやってみました。

docs.aws.amazon.com

ということで以下は実装

実装

RDS log downloader sample

さすがに全部ログとってくると多すぎるのでAudit logに絞っています。

おおざっぱにいうと

  1. ログのリストは普通のRDS APIで取得
  2. ログをダウンロードするAPISDKにないので自分でURLを組み立てる
  3. リクエストオブジェクトを用意する(といってもGETなのでURLだけ)
  4. リクエストのv4署名を作成
  5. Net::HTTP#getでリクエストを投げ飛ばす
  6. 帰ってきたchunkを順番にファイルに書いていく

という感じです。

補足: 署名について

最初署名を調べていたときに実装例がHMACを4回呼び出すようになっててびっくりしたんですが…

署名バージョン 4 の署名キーを取得する方法の例 - アマゾン ウェブ サービス

幸いSDKがあるならそのリクエストに署名するクラスが用意されていて助かりました(上記コードでも利用しています)

Class: Aws::Sigv4::Signer — Documentation for aws-sigv4 (1.0.0)