みち草

Azure中心にまとめる技術情報ブログ

診断ログによる Azure Table Storage のエンティティを定期削除する

はじめに

Azure VM イベントログやパフォーマンス カウンターを診断ログとしてストレージ アカウントに保存できますが、Blob ストレージではなくテーブル ストレージに保存されるため、 ライフサイクル管理機能が使えず、古いエンティティが自動的に削除されません。

そこで、Azure Automation の Runbook を用いて定期的に削除するようにしてみました。

一部画像が荒いですが、クリックすれば綺麗に見えます。

目次

対象テーブル

対象は、診断ログにより生成されるこれらのテーブルです。
Linux の Syslog テーブルもありますが、ここでは "WAD" がついたテーブルを対象にします。

削除実行前に、古いものがいつぐらいか確認しておきます。
ストレージ エクスプローラーを使うのが簡単

削除用スクリプト

削除用に作成した、Automation 向け PowerShell スクリプトはこちら
PowerShell/Delete-TableEntity.ps1 at main · kzk839/PowerShell · GitHub

こちらの記事のスクリプトを参考にし、Az モジュール、マネージド ID を使用するようしています。 Table Storageに溜まり続けるWindowsイベントログのクリーニング - Qiita

対象のストレージ アカウント、リソース グループの指定が必須
テーブル名はの指定は任意で、指定する場合はそのテーブルのみ、指定しない場合は "WAD" がついたすべてのテーブルが対象です。

ログの保持日数は、何日以上古いエンティティを削除するかの指定です。
365 を指定した場合は、1 年以上古いエンティティを削除対象とします。

ただ、はじめは指定日数より古いエンティティすべてを対象としていたのですが、自分の環境で試した限りでは、 エンティティ数が多くなると時間がかかり過ぎ、Automation のジョブが制限時間内 (3 時間) に終わらないことがありました。

なので 70 行目にて、最大 5000 件の制限をかけています。
ここは実際に動かしてみて、状況を見て調整してください。

Automation アカウント作成

Automation アカウントを作成する際は、マネージド ID を有効にした状態で作成します。

作成されたマネージド ID に対して、対象ストレージ アカウントの "ストレージ アカウント共同作成者" ロールを付与します。

今回のスクリプトを動かすために AzTable モジュールが必要なため、それを追加します。

Runbook、スケジュール作成

Runbook に先ほどのスクリプトを登録します。

コードを貼り付けた後は、"公開" を選択することを忘れずに。

パラメータはこんな感じで指定

実行結果

あとは時間になる or 手動で実行すれば、こんな感じで各テーブルのエンティティを削除してくれます。
Target : 0 は指定日数を超えるエンティティがない場合です。

実行前に確認したテーブルを再度見ると、綺麗になってます。

終わりに

途中でも記載しましたが、エンティティ量が増えると処理に時間がかかり 3 時間以内に終わらない場合があるため、試してみて数を減らしたり、別のジョブに分けるなど調整してください。
時間がかからずいい感じにできる方法が見つけられなかったので、そこは改善の余地あり。

エンティティ削除スクリプトを作成したものの、現状はイベント ログもパフォーマンス カウンタも Log Analytics に入れてしまう方が多いと思うので、あまり役立つ機会はないかも…
料金は Log Analytics の方が高いけど、最近は Basic Logs とかアーカイブとか出始めたし、Log Analytics なら自動で削除されるし、クエリもできるし、そっちの方が使い勝手はいいと思います。

あとは単純に、エンティティが結構なスピードで増えていくのでこれだと消すのが追い付かなさそう、というのが率直な感想です。