RDSのMySQL/MariaDBでログをCloudWatch Logsへ出力可能になりました

145件のシェア(ちょっぴり話題の記事)

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ウィスキー、シガー、パイプをこよなく愛する大栗です。

先程RDSのMySQL/MariaDBのログファイルをCloudWatch Logsへ出力できる機能がリリースされましたのでレポートします。

CloudWatch Logsへのログファイル出力

RDS for MySQL/MariaDBでは以下の4種類のログを出力することができました。

  • Audit Log
  • Error Log
  • General Log
  • Slow Query Log

出力先はテーブルかファイルとなり、テーブルの場合はDBにログインして内容を確認したり、ファイルの場合はAPI経由でファイルを取得したりと、Pullでログを見る必要がありました。今回のアップデートによりCloudWatch Logsへほぼリアルタイムに出力する事ができます。

CloudWatchへは以下の形式のロググループが生成されて、DBインスタンス名のログストリームにログが出力されます。

/aws/rds/instance/<db-instance-id>/<log-type>

試してみる

ここでは以下の環境とします。

  • リージョン:東京
  • DBエンジン:MariaDB 10.1.26
  • 出力対象のログ
    • Audit Log
    • Error Log
    • General Log
    • Slow Query Log

パラメータの修正

CloudWatch Logsへログを出力するためには、そもそもファイルとしてログを出力している必要がありますので、そのための設定を行います。

パラメータグループ

MariaDB 10.1用のパラメータグループを作成して、以下のパラメータを修正します。

パラメータ設定 備考
slow_query_log 1 1でSlow Query Logを出力します。
general_log 1 1でGeneral Logを出力します。
long_query_time 0 Slow Query Logの閾値(秒)
log_output FILE ログをファイルとして出力します。

オプショングループ

監査ログの出力は以下のようにオプショングループでの設定が必要になります。

【新機能】Amazon RDSのMySQLとMariaDBで監査ログに対応。ついでにrdsadminの動作も確認してみた。

MariaDB 10.1用のオプショングループを作成してオプションの追加をするとMARIADB_AUDIT_PLUGINを追加します。今回オプション設定はデフォルトの以下の内容です。

オプション設定 備考
SERVER_AUDIT_EVENTS CONNECT,QUERY 監査する対象のイベントです。
SERVER_AUDIT_INCL_USERS 監査対象とするユーザです。
SERVER_AUDIT_EXCL_USERS 監査対象外とするユーザです。
SERVER_AUDIT_FILE_ROTATE_SIZE ログファイルがローテーションするサイズ制限です。
SERVER_AUDIT_FILE_ROTATIONS 保存する世代数数です。
SERVER_AUDIT_LOGGING ON ログが有効化を決めます。変更不能。
SERVER_AUDIT_FILE_PATH /rdsdbdata/log/audit/ ログファイルの場所です。変更不能。
SERVER_AUDIT FORCE_PLUS_PERMANENT この設定はセキュリティのために有効になっており、プラグイン実行時にアンインストールができないことを保証しています。変更不能。

DBインスタンスの起動

DBインスタンスを起動します。

ここではMariaDBを起動します。

MariaDBのバージョンはデフォルトの10.1.26を選択しました。

パラメータグループとオプショングループは事前に修正したものを使用します。

詳細設定にログのエクスポートの項目が増えています。ここでCloudWatch Logsへ出力するログを選択します。ここでは以下の全部を選択しています。また、CloudWatch Logsへの出力権限はService Linked Roleで設定されます。

  • 監査ログ
  • エラーログ
  • 全般ログ
  • スロークエリログ

他はデフォルトの設定で起動します。

ログを確認する

CloudWatch Logsを確認すると以下の4種類のログが出力されたことが分かります。

  • /aws/rds/instance/mariadb-1/audit
  • /aws/rds/instance/mariadb-1/error
  • /aws/rds/instance/mariadb-1/general
  • /aws/rds/instance/mariadb-1/slowquery

各々のログは以下のように出力されます。

Audit Log

Error Log

General Log

Slow Query Log

ログを監視する

CloudWatch Logsに出力するだけでは面白くないので、ログインの失敗を監視してみます。

監視には以下のエントリのlogs2snsを使用します。

CloudWatch LogsのLambdaによるログ監視

ログイン失敗の監視は、RDSからCloudWatch Logsへ監査ログを出力して、Lambdaへストリームして内容を判断して、SNS経由でメールを送るという形になります。

logs2sns.ymlのCloudFormationテンプレートで以下の内容のパラメータを設定して起動します。

パラメータ 設定内容 備考
FilterPattern /,FAILED_CONNECT,/ 監視する正規表現
FilterPatternExcluded /$^/ 監視を除外する正規表現
MailSubject MariaDB Login Failure メールのタイトル
NotifyTopicName MariaDBNotifyTopic SNSトピックの名前

log2snsのCloudFormationスタックを作成したら、作成したSNSトピックにメール通知を登録します。

CloudWatch Logsで監査ログである/aws/rds/instance/mariadb-1/auditを選択して、Lambda サービスへのストリーミングの開始を行います。

logs2snsで作成したLambda関数を選択します。

ログの形式はその他にします。

内容を確認してストリーミングの開始をクリックします。

これで設定は完了です。次はRDSへログインしてみます。

まずは普通にログインしてみます(パスワードはpasswordです)。特に何も起こりません。

$ mysql -u awsuser -pmypassword -h mariadb-1.abcdefghjik2.ap-northeast-1.rds.amazonaws.com mydb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 32
Server version: 10.1.26-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [mydb]>

次に誤ったパスワードでログインしてみます。

$ mysql -u awsuser -pnotpassword -h mariadb-1.abcdefghjik2.ap-northeast-1.rds.amazonaws.com mydb
ERROR 1045 (28000): Access denied for user 'awsuser'@'192.0.2.247' (using password: YES)

するとSNSのサブスクリプションとして登録していたメールアドレスにメールが届きます。

さいごに

Auroraでは監査ログについてCloudWatch Logsで出力できるようになっていましたが、MySQL/MariaDBでもCloudWatch Logsへ出力できるようになりました。CloudWatch LogsはLambdaやElasticsearch Serviceなどへストリーミングできるためログの活用の幅が広がります。

例えば、今回の例のようにログインの失敗検知や、Slow Query Logを元にRead Replicaの台数を増やすようなことも考えられます。CloudWatch Logsへの出力は他のDBエンジンにも広がる事を期待しています。