"Amazon RDS for MySQL のログを Amazon CloudWatch Logs へ直接保存する。"
はじめに
Amazon RDS のログが Amazon CloudWatch へ直接保存できるようになったということで、試してみました。
# 対応ログタイプ
RDSでエクスポートできるログタイプは以下になります。
- Error log – 起動および停止にデータベースエンジンによって生成された診断メッセージが含まれています
- General query log – クライアントから受け取ったすべてのSQLステートメントのレコードと、クライ アントの接続および切断時間を含みます。
- Slow query log – 設定された時間よりも実行に時間かかったクエリや、定義された行数を超える行を走査したSQL文のレコードが含まれています。 両方の閾値は設定可能です。
- Audit log – MariaDB Audit Pluginを使用して提供されるこのログは、監査目的でデータベースアクティビティを記録します。
ログイベントは CloudWatch のロググループにログストリームの形式で保存されます。 また、ログはDBインスタンスの同じリージョン内で保存されます。
# パラメータグループの設定 ログをCloudWatchへ送るために、まずはログ出力を有効にする必要があります。
今回は「set-log」というパラメータグループを新規に用意して設定しています。

作成したらパラメータグループをクリックします。

それでは、各ログを有効にするために以下の設定を行います。
### Slow query log slow_query_log のパラメータを修正します。 デフォルトは値なし(0)なので1へ変更します。 
また、スロークエリーログに出力される値は long_query_time で設定できます。

デフォルトは値なしですがその場合はデフォルト値(10秒)となります。
### General query log general_log のパラメータを修正します。 こちらも、デフォルトは値なし(0)なので1へ変更します。 
### Error log Error log は標準で有効なのでパラメータの変更は不要です。
### ログ出力 log_outpu のパラメータを修正します。 デフォルトのログ出力はTABLEなのでFILEへ変更します。 
注意: 本番DBインスタンスのAudit logとGeneral query logを有効にする場合は注意が必要です。これらのログは実行されたすべてのステートメントをキャプチャして記録するため、DBインスタンスのパフォーマンスが低下する可能性があります。
# データベースの設定変更 新規の場合は作成時にパラメータグループを指定します。既存のDBインスタンの場合はパラメータグループの変更を行うか、先ほど設定したログ内容を
「ログのエクスポート」でエクスポートするログを選択します。

以上で完了です。
# 確認 Amazon CloudWatch Logs を確認します。 ログは以下のような命名パターンで作成されます。
/aws/rds/instance/<db-instance-id>/<log-type>
実際に先ほど設定したログが保存されると以下のようになります。

ログのエクスポートで全般ログにチェックを入れませんでしたが、入れるとgeneralという名前のログが保存されます。
# Amazon RDS → Amazon CloudWatch Logs Amazon RDSはDBインスタンスと同じアカウント内のロググループにservice-linked roleを使用してログを送信します。これにより、Amazon RDSはアカウント内の関連するロググループにアクセスできます。 ログの送信を有効にすると、AWSServiceRoleForRDSという追加のIAMロールが通常は作成されます。 設定後にはIAMの管理画面で実際に確認ができます。

# おわりに 今まで、RDSのログを保存するのにCLIなどで定期的にダウンロードを行っていましたが、今後はそういったことが不要になるのはとても助かります。 また、これによって Amazon CloudWatch でログ監視ができるようになるため、運用負荷がとても軽くなるなと感じました。