クラウドで、アジリティを手に入れよう。
column

コラム

Azure MonitorでAzure Database for PostgreSQLのログ監視を行う

  • TAG

    Azure
  • UPDATE

    2021/05/10

はじめに

こんにちは。BTCクラウドCoEの松波です。 今回はAzure Database for PostgreSQLのログ監視をAzure Monitorで実施してみたいと思います。

ログをAzure Monitorに送信する

Azure Database for PostgreSQLのログは、デフォルト設定ではAzure Monitorに連携されないため、明示的に送信するよう設定する必要があります。 ログの転送は、Azure Database for PostgreSQL画面の「診断設定」メニューから実施します。宛先として3つの中から選ぶことができますが、Azure MonitorはLog Analyticsと統合されているため、Log Analyticsワークスペースを選びます。

なお、デフォルト設定では、PostgreSQLのログは短期保管用ログストレージに出力される仕様となっており、最大容量は1GBまで、保管期間は最大7日間となってます(※1)。 ログの保管期間としてはかなり短いので、仮に監視要件が無かったとしてもいずれかの宛先に転送した方が良さそうです。 ちなみに、Log Analyticsなどへの転送を行う場合は、logging_collectorをオフに設定して短期保管用ログストレージへの出力をオフにすることが推奨されてます。(※1)

Azure Monitorでのクエリ

Azure Monitorに送られたログは、Log Analyticsやモニターの画面からクエリを実行することで、参照可能です。クエリ言語はSQLチックなKusto Query Language、略してKQLです。余談ですが、Share PointでもKQLを使いますが、SharePointの方はKeyword Query Languageの略称で別物です。

まず、ログの内容を見るために簡単なクエリを実行してみます。 PostgreSQLのログはAzure Monitor上で、Category==”PostgreSQLLogs”として扱われるため、クエリでそのように指定します。

AzureDiagnostics
| where Category == "PostgreSQLLogs"

クエリを実行すると、該当のログが画面に表示されます。

 

ログの内容を見てみると、ログ生成の時刻、ログレベル、ログメッセージがそれぞれTimeGenerated、errorLevel_s、Messageにマッピングされていることがわかります。 例えば、直近10分以内のログレベルFATALのものを抽出するようなクエリは以下のようになります。

AzureDiagnostics
| where Category == "PostgreSQLLogs"
| where errorLevel_s == "FATAL"
| where TimeGenerated > ago(10min)

アラート通知

上記クエリで検知された場合、指定のメールアドレスに通知するとします(実際にはFATALをすべてを検知対象とするとログイン時のパスワード間違いなどもすべて検知してしまうので、もう少しチューニングは必要です)。メール通知には、Azure Monitor アラートの機能を使います。ここでは詳細は割愛しますが、クエリの画面で「新しいアラートルール」という項目をクリックして、メール送信するためのアクショングループを指定することで設定可能です。

なお、アラート通知メールからはログメッセージがわからないため、Azure Portalでログの詳細を確認する必要があります。

おわりに

ログ監視の基本的な手順を記載しました。今回はAzure Database for PostgreSQLを題材にしましたが、他サービスでも同様のことができますので是非試してください。

※1 https://docs.microsoft.com/ja-jp/azure/postgresql/concepts-server-logs