【やさしいAWS】RDSのログをlambdaを経由してメール送信をしてみた

awsロゴ
Pocket

はじめまして。情シスのインフラ担当 すみ と申します。
キラキラインフラ女子( )を目指して勉強中です。スマートで優しいAWSが好きです。

さて、今日はRDSのMySQL/MariaDBのログファイルを、CloudWatch Logsへ出力し、Lambdaを使ってメールで配信できるように設定してみます。

 

材料

RDS インスタンス : 1台
ClowdWatch Logs
Lambda
SNS
受信可能なメールアドレス : 1つ

 

こんな感じで作っていきます


1. RDSからCloudWatchへログを出力する設定をする
2. CloudWatchでキャッチしたらLambdaへストリームして内容を判断
3. SNS経由で管理者へメールを配信する

 

RDS(Relational Database Service)

RDSはAWSの展開するデータベースサービスのひとつで、簡単に立ち上げ、運用ができるリレーショナルデータベース(テーブル表形式で管理するデータベースのことです)のことです。

まずは、このRDSのインスタンスから出力されるログをCloudWatchへと送るための設定をします。

※前提としてインスタンスがすでに1つある想定でお話をします※

 

パラメータグループの設定

CloudWatch Logsへログを出力するために、RDSの中にファイルとしてログを出力している必要があるので、まずはパラメータグループの設定設定を行います。

[サービス]→[RDS]→[インスタンス]を開いてインスタンス一覧を選択してください。

 

一覧からインスタンスをクリックして詳細画面に遷移した後、下のほうへスクロールするとパラメータグループという項目があります。

リンクをクリックしてパラメータを編集します。

 

しかし、「default.」で始まるデフォルトのパラメータグループは編集することができないので、その場合は新しいパラメータグループを作成します。[サービス]→[RDS]→[パラメータグループ]→[パラメータグループの作成]

 

パラメータグループを作成したら、インスタンスへの紐づけもお忘れなく。

[RDS]→[インスタンス]→[インスタンス詳細画面]→[詳細]の変更ボタンをクリックして、データベースの設定項目の「DBパラメータグループ」から作成したパラメータグループを選択してください。

 

それでは、パラメータグループを作成または修正してログが出力されるように設定します。

[RDS]→[パラメータグループ]から対象のインスタンスに設定されているパラメータグループの編集ボタンをクリックして、以下のパラメータを修正してください。

slow_query_log 1 1でSlow Query Logを出力します。
general_log 1 1でGeneral Logを出力します。
long_query_time 5 Slow Query Logの閾値(秒)
log_output FILE ログをファイルとして出力します。

 

これでパラメータグループの設定は終わりです。

 

CloudWatchへログを出力する設定

つぎに、RDSからCloudWatchへログを出力する設定をします。
インスタンスを選択し、[インスタンスの操作]→[変更]をクリックします。

下へスクロールしていくと「ログのエクスポート」という項目があります。

一般ログ、スロークエリーログ、監査ログ、エラーログのうち必要なログの種類にチェックをいれると、CloudWatchへログが出力されるようになります。

設定保存後、CloudWatchLogsにアーカイブの保存先が作成されます。

 

SNS (Simple Notification Service)

Amazon SNSは、登録しているメールアドレスやクライアントへのメッセージの配信または送信を調整し、管理するウェブサービスです。このサービスを利用して管理者へメールを配信するための下準備をします。

 

新しいトピックを作成

[サービス]→[SNS]→[トピック]→[新しいトピックを作成]を選択して、「トピック」と呼ばれるメッセージの送信&通知の受信を行う通信チャネルを作成します。

  • トピック名:Amazon リソースネーム (ARN) と呼ばれる一意の永続識別子
  • 表示名:メールの差出人の名前として表示されます

 

サブスクリプションを設定

トピックの作成が正常に終了したら、次は通知の宛先や方法を定義するサブスクリプションを作成します。

[サービス]→[SNS]→[サブスクリプション]→[サブスクリプションの作成]を選択し、サブスクリプションを作成してトピックに紐づけましょう。

  • トピックARN:上で作成したトピックARN
  • プロトコル:E-Mail
  • エンドポイント:受信可能なメールアドレス

 

スタックを作成すると「AWS Notification – Subscription Confirmation」というタイトルのメールが指定の宛先に届くので、「Confirm subscription」のリンクをクリックしてメールアドレスが存在確認をします。

 

リンクをクリックするとこんな画面が表示されます。

 

Lambda

Lambdaは、なんらかのイベントが起きたら、あらかじめ設定した処理がサーバーレスで実行してくれるサービスです。今回は、CloudWatchで受け取ったログの内容をSNSで作成したトピックを使ってメールで送信するという処理を作成します。

 

関数を作成

  • 関数の名前はlogs2snsとします(お好きな名称でokですよ!)
  • 言語はpythonを選択し、次へ進む
  • エリア内に以下をコピー&ペーストではりつけて、「※」部分を変更してください

これで下準備は整いました。
次で最後の仕上げです。

 

CloudWatch

CloudWatchは、AWSが提供する「フルマネージド運用監視サービス」で、AWSの各種リソースを監視してくれるサービスです。

セットアップ不要で使えて、異常な状態を検知して、自動で復旧までしてくれて、各種サービスのアクションに応じてアラート通知や、アクションを設定できて…もうなんかすごく至れり尽くせりなサービスです。

CloudWatchには、

  • リソースを監視する「CloudWatch」
  • ログを集めて監視する「CloudWatch Logs」
  • APIのイベントをトリガーに何らかのアクションを実行させる「CloudWatch Events」

の3つのサービスがありますが、今回は「CloudWatch Logs」を使ってLambdaを実行させる設定をします。

 

ログを確認する

[サービス]→[Cloudwatch]→[ログ]から、CloudWatch Logsを確認すると以下の4種類のログが出力されていました。

/aws/rds/instance/(db名)/audit
/aws/rds/instance/(db名)/error
/aws/rds/instance/(db名)/general
/aws/rds/instance/(db名)/slowquery

※設定後に発行されたログがある場合のみ自動で保存先が作成されるようです。ログが発行されていない場合は、CloudWatch Logsの一覧に表示されないので、[サービス]→[CloudWatch]→[ログ]→[アクション]→[ロググループの作成]から手動で作成してあげましょう

 

ロググループにサブスクリプションを設定

CloudWatch Logsで対象のロググループ(/aws/rds/instance/(db名)/(ログ種別) ) を選択して、Lambda サービスへのストリーミングの開始を行います。

CloudWatch Logsの一覧から対象のロググループを選択し、[アクション]→[Lambdaサービスへのストリーミングの開始]を選択

作成したLambda関数「logs2sns」を選択

ログの形式は「JSON」を選択

 

内容を確認して「ストリーミングを開始」をクリックしてください。

 

 

完成!

これでRDSからCloudWatch Logsへ出力されたログが、Lambdaを経由してSNSから管理者へメールを送ることができました。

長々と書きましたが、コマンドラインを使わずにできるのでAWS初心者でも意外と簡単にできました。

複数のサービスの組み合わせができるのもAWSの魅力の一つですね。

 

参考

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

Pocket

The following two tabs change content below.
すみ
家事育児AWSライフを楽しむ2児の母してます。立派な情シスを目指して勉強中。