general_log を定期的にS3へ保管できると便利
RDSでは、パラメータグループに次の設定を追加するだけで general_log がFILEに保管され、 RDS API経由で取得できるので、たいへん便利です。
- general_log = 1
- log_output = FILE
ただし、1時間単位で general_log はローテーションされ、1日以上経ったログは消されてしまいます。このため、ログを長期保管するためには手動またはスクリプト等にて定期的にログを保管する必要がありました。
Lambda を用いて、S3 上ログを簡単に保管
EC2インスタンス等を新たに構築せずログを定期的に保管する方法としては、Lambda Function を用いた実装が、コスト・運用の観点でお勧めです。
既に、すぐに使える Lambda Function が github 上にありましたので、次にまとめさせていただきます。
使い方
- githubのREADMEドキュメントに従い、S3のbucketにアクセスする権限を、Lambda Functionの実行に用いるIAMロールに追加します。
- rds_mysql_to_s3.py のコードをインラインエディタにてコピー・ペーストします。または、zipファイル化したアーカイブファイルをアップロードします。
- Lambda Function の動作テストを実施します。
動作テストに用いるパラメータは、次の内容になります。
{
"BucketName": "[BucketName]",
"S3BucketPrefix": "[Prefix to use within the specified bucket]/",
"RDSInstanceName": "[RDS DB Instance Name]",
"LogNamePrefix" : "general/mysql-general",
"lastRecievedFile" : "lastWrittenMarker",
"Region" :"[RegionName]"
}
動作テストに成功すれば、rds_mysql_to_s3.py 内の下記コードを変更し、パラメータをコード内に埋め込みます。Event source を用いて定期的に Lambda Function を実行する場合、パラメータを指定することができないため、コード内に変数としてパラメータをあらかじめ設定しておく必要があります。
汎用性を高めるためには、パラメータについてはS3のバケットに記載するなど、別途工夫をすると良いかもしれません。
S3BCUKET='[BucketName]'
S3PREFIX='[Prefix to use within the specified bucket]/'
RDSINSANCE='[RDS DB Instance Name]'
LOGNAME='general/mysql-general'
LASTRECIEVED='lastWrittenMarker'
REGION='[RegionName]'