• 作成:
  • 更新:

Amazon CloudWatchの空のロググループを削除するワンライナー

注意

長いこと起動しっぱなしでろくにログを吐かないサービスの場合、ロググループを更新時などに必要とするけれど、ストリームは現在ないなどと言った状況が存在します。

その場合ロググループを削除すると久々の更新時にデプロイが失敗するようになります。

問題

せっかくAmazon CloudWatchのログの保持を失効するように設定していても、ロググループはストリームが空になっても残ってしまいます。

お金的にはおそらく問題ないのですが、トラブル解決時にどのログを参照すれば良いのか分からなくなって混乱してしまいます。

さっと探した限りだとPythonスクリプトをLambdaで定期実行とかしか出なくて、そこまでするのは毎回求めてはいないなと思ったので、とりあえずサクッと手元でワンラインで削除する方法を考えました。

それが出来ればそれこそそれをLambdaで実行しても良いですし。

方法

aws logs describe-log-groupsを実行するとlogGroupが保持している容量数である、 storedBytesをを付与して返してくるので、これが0であるグループをフィルタリングして削除すれば良さそうです。

コード

一応ChatGPTくんに聞いてみたけどmetricFilterCountを使う頓珍漢な方法で危うく全てのグループが消されるところでした。

aws logs describe-log-groups|jq '.logGroups'|jq 'map(select(.storedBytes == 0))'|jq '.[].logGroupName'|xargs -n1 aws logs delete-log-group --log-group-name

で良さそうです。

なんか終わるのを待つ応答待ちがやたらと長いですが…