はじめに
Amazon Aurora(以下Aurora)ではデフォルトでエラーログが出力するようになっています。
(スロークエリログや一般ログはデフォルトでは出力されないため、設定が必要です)
ただ現時点では残念ながらAuroraのエラーログについては、公式でのドキュメントが存在しておりません。
そのため、仕様についての確認はサポートに問い合わせるしかない状況です。
以前、少し確認したところ以下の仕様は、RDS for MySQLと同様のようでした。参考:RDS for MySQL用ページ
- 1 時間ごとにローテートされ、最大30日間、またログの合計サイズが 128 MB まで保存
- 最大保持期間、もしくはログの合計サイズに達した場合にRDSが自動的に削除
上記内容からAWSでエラーログを保持してくれるのは、30日間までということが分かります。
しかし場合によっては、それ以上の期間で保持が必要なケースもあると思います。
その際に、手動で取得するのは手間だと思いますので、自動化を検討する事にします。
方法として
私が考えたのは下記3点です。
- AWS CLIを使用し、crontabと組み合わせて定期実行
- AWS SDKを使用し、crontabを組み合わせて定期実行
- AWS Lambdaを使用し、CloudWatchと組み合わせて定期実行
今回はタイトルでも出てますが、3の方法で行います。
またLambdaは[Node.js,Java,C#,Python]で利用することが可能なのですが、今回はPython3.6を選択しました。
要件としては下記を想定しました。
- ログの取得は前日分の[mysql-error-running.log.タイムスタンプ]
- ログはS3に保存
Lambda関数作成
今回はPythonの学習も兼ねてチャレンジしている為、ローカル環境にPythonのSDKであるboto3をインストールし、作成したコードをzip化しアップロードしました。
その為、ローカル環境からも利用しやすくなっているかと思います。
boto3とAWS Lambda関数のリファレンスを確認しながら作成していきます。
1. まずは関数を1から作成するように、コンソールから選択していきます。
2. トリガーについては後ほど設定するので、ここはそのまま次にいきます。
3. そして基本的な設定をいれて、作成したコードをzipでアップロードします。
4. 同じ画面よりハンドラ及びロールの設定も行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::*/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::*" ] }, { "Effect": "Allow", "Action": [ "rds:DescribeDBLogFiles", "rds:DownloadDBLogFilePortion", "rds:DescribeDBLogFiles" ], "Resource": [ "*" ] } ] } |
5.詳細でタイムアウト値を設定します
デフォルトが3秒となってます。
今回テストした際には約30秒程度かかっているので、タイムアウト値も伸ばしました。
そして実際にアップロードしたコードは下記になります。
リファレンスでは例外エラーが発生した時の設定なども記載されておりますが、今回は割愛しました。
とりあえず要件は満たしているのでよしとしておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import boto3 from datetime import date, timedelta def getlogs(evnet,context): for num in range(24): yesterday = (date.today() - timedelta(days=18)).strftime('%Y-%m-%d') num = str(num).zfill(2) logs = 'error/mysql-error-running.log.' + yesterday + '.' + num rds_client = boto3.client('rds') rds_response = rds_client.download_db_log_file_portion( DBInstanceIdentifier='<AuroraのDBインスタンス名>', LogFileName=logs ) errorlog = rds_response['LogFileData'] s3_client = boto3.client('s3') s3_client.put_object( Bucket='<S3のバケット名>', Key=<保存したいログの名前>, Body=errorlog ) |
スケジュール
上記作成したLambda関数のスケジューリングを行います。
作成した関数から[トリガーを追加]を選択します。
トリガータイプを[CloudWatch Events]にし[新規ルールの作成]を選択します。
ルール名、ルールの説明を適宜入力し、ルールタイプでスケジュール式にチェックを入れます。
スケジュールの書き方はこちらを参考にしました。
まとめ
今回は最低限の要件を満たす形で作成しましたが、溜まったログの削除や
エラー時の設定など、機能追加はまだまだ必要だと思います。
今後もブラッシュアップしていき、AWSのサービスをより有効に活用していきたいですね。