BEACHSIDE BLOG

MicrosoftとかC#を好むレンジャーの個人的メモ

Azure SQL Dataabase の トランザクションログ を見る

ちょっと大げさなタイトルですが、今回は「EntityFramework CoreとかでSQL Dabaseでアクセスしたときに、どんなクエリが実行されたか見る」ための設定方法です。 SQL Database を使っていると、執筆時点ではオンプレのSQL Serverと違ってSQL Profilerで接続できるようになるとViewer的にもいいんですがねぇ...。

余談ですが、年末にバンコクで財布とかクレジットカードを落としてきたので、厄はすべて出し尽くしたと信じたい今日この頃です。

Overview

Azureのポータル(https://portal.azure.com)から「監査と脅威検出」を設定することで、トランザクションログを見れるようになります。設定方法を大きく以下2つ。

  • (SQL Databaseがのってる)サーバーに設定をして設定を継承させる
  • SQL Databaseのみに設定をする

今回はSQL Databaseに設定する方法をします。それからSQL Databaseに対して適当にクエリを実行し、実行されたクエリがログから見れることを確認します。

f:id:beachside:20170104193611j:plain

1. Azure ポータルから「監査と脅威検出」の設定

Azureのポータル(https://portal.azure.com)で、設定をしたいSQL Databaseのブレードを開きます。
今回はポータルの左側のリソースグループのアイコン > 対象のリソースグループ(今回は「Default-SQL-JapanWest」) > 設定するデータベース(今回は「YokoSQLDatabase」)をクリックします。

f:id:beachside:20170104190134p:plain

SQL Databaseのブレードが開いたら、「監査と脅威検出」(英語表示だと「Auditing & Thread detection」)を選択し、各種設定していきます。

f:id:beachside:20170104190145p:plain

  • サーバーから設定を継承
    サーバーごと設定してそれを継承する場合はチェックを入れます。今回はチェックしません。

  • 監査
    オンにします。

  • 監査の種類
    監査ログの保存先を、Azure StorageのテーブルまたはBLOBどちらか選択します。今回はテーブルを設定します。テーブルを選択すると、すぐ下に警告みたいのが出ますが、こちらを確認して設定すれば問題ないです。(説明は略しますが、さっと見といた方が良いかと...)

  • 容量の詳細
    Azure Storageのアカウント、ログの保有期間、テーブル名などを設定します。 既存のStorageからテーブルを指定することもできますし、 新しくStorageを作成することもできます。

  • 監査されたイベント
    (日本語訳が微妙なのでそのうち名称が変わりそうですが、)監査する内容を設定します。今回は全部チェック。
    f:id:beachside:20170104190156p:plain

  • アラートの送信先
    アラートが出た際の通知メールアドレスを設定します。

最後にこのブレードの上の方にある保存ボタンをクリックし設定完了です。

2. 動作確認

今回は、SQL Server Management Studio(SSMS)から接続して適当にクエリを実行し、Microsoft Azure Storage Explorerでログが出ていることを確認します。

SSMSでSQL Databaseに接続

SSMSからの接続について、以下2点の注意です。

  • 接続文字列の変更
    接続文字列は、Azureポータルから確認できますが、先ほど説明を省略したこちらに記載がある通り、接続文字列を変える必要がある

  • サーバーのファイアウォールの設定
    SQL DatabaseはデフォルトでIP制限がきっちりかかっているので、接続元のIPアドレスを解放してあげる必要があります。今回の私の場合だと、特殊な設定はいらないので、自分のIPアドレスのみを開けておけばOKです。(設定方法はこちら

ログインできたら適当にクエリを叩きます。

f:id:beachside:20170104190207p:plain

Azure Storage Exprolerでログ確認

Azure Storage Exprolerの接続設定とかの説明は端折りますが、設定したテーブルにログが出ていることが確認できます。
これでEntityFramework Coreとか使ってデータベースに接続したとき、どんなクエリが実行されているかチェックできますね(Statementってカラムに出力されます)。ただ、色んなのが大量に出力されるので、SQL Server Profilerとか見慣れてないと「なんじゃこりゃ?」「どれ?」「うざい」みたいな状態に陥りやすいので、ログを見やすくする工夫は必要かなーと思ったり思わなかったりです。

f:id:beachside:20170104190220p:plain

ということで、タイミングがおかしいですが、あけましておめでとうございます。
2017年も一年C#を中心にエンジョイ出来たらと思っていますので、よろしくお願い致します。

最後に

この設定によるSQL Databaseへのパフォーマンスへの影響は不明です。オンプレのSQL Serverの場合ほとんどないはずだったですが....どっかに書いてないですかねーと思っています。
(参考のリンクに、BLOBへの出力の方がパフォーマンスが高いとか、トラフィックの云々について記載がありますが、そもそものサーバーに対するCPUとかの影響は書いてないんですよね...)

今度ムッシュ先生に会ったら聞いてみよう!

SQL Databaseへのパフォーマンスへの影響についてムッシュ先生に聞いたところ以下リンクを教えてもらいましたー♪
で、「パフォーマンスの劣化はほぼないよー」的なこと記載がありますYO。

azure.microsoft.com

私の中の記憶では、
SQL Serverも同様で、
ここら辺はそもそも内部的に動作しているものなので、設定したからといってパフォーマンス劣化はほぼなしと理解しています(記憶違いだったらごめんなさい...ご利用は計画的に♪)。

(私、大事なことは全てムッシュ先生に教わるタイプです♪)

参考

SQL Database 監査の使用 | Microsoft Docs

SQL Database 脅威の検出の概要 | Microsoft Docs

Auditing for Azure SQL Database Generally Available and with more Troubleshooting Features | ブログ | Microsoft Azure