LoginSignup
10
15

More than 5 years have passed since last update.

RDS(mysql) general_log をLambdaを用いてS3に保存する方法

Posted at

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 上にありましたので、次にまとめさせていただきます。

使い方

  1. githubのREADMEドキュメントに従い、S3のbucketにアクセスする権限を、Lambda Functionの実行に用いるIAMロールに追加します。
  2. rds_mysql_to_s3.py のコードをインラインエディタにてコピー・ペーストします。または、zipファイル化したアーカイブファイルをアップロードします。
  3. 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]'
10
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
15