はじめに
検証環境にロググループがどれくらいあるかを見たことがあるでしょうか。
僕の検証環境には310個のロググループがいました。
ロググループのストリームの数や保持期間にもよりますが、大体50円/月ほどかかっています。
費用的には大したことなく、「なんか気持ち悪いなぁ」という程度なので消さなくても良いかと思います。
ただ、先日JAWS-UG CLI支部でCloudWatch Logsのハンズオンをやったこともあり、理解を深める意味でロググループを一掃するコマンドを作ってみることにしました。
でも、使用中のロググループもあり、全部消す訳にもいかないので、一定期間更新されていないロググループのみ消すようにします。
手順
1. 削除したいリージョンでCloudShellを起動
2. 全ロググループを抽出する
コマンド
ARRAY_LOG_GROUP_NAMES=$( \
aws logs describe-log-groups \
--query 'logGroups[*].logGroupName' \
--output text
) \
&& echo ${ARRAY_LOG_GROUP_NAMES}
結果(例)
実行したリージョンに存在しているロググループがスペース区切りで全て出力
/aws/lambda/appmesh-xxxx /aws/lambda/no1 ... test-log-group-1 test-log-group-2 test-log-group-3 ... test-log-group-4month-ago test-log-group-2month-ago
3. 削除対象とする期間を指定
- dateコマンドで3ヶ月前のタイムスタンプを取得
- AWS CLIで使える形式にするために000を追加
コマンド
THREE_MONTH_AGO_DATE=$(date -d '3 month ago' +%s)000 \
&& echo ${THREE_MONTH_AGO_DATE}
結果(例)
1649930797000
4. 削除対象の抽出
コマンド
for i in $(echo "${ARRAY_LOG_GROUP_NAMES%None*}");do
x=$( \
aws logs filter-log-events \
--log-group-name ${i} \
--max-items 1 \
--start-time ${THREE_MONTH_AGO_DATE} \
--query 'events[].logStreamName' \
--output text \
)
if [ -n "$x" ]; then
ARRAY_LOG_GROUP_NAMES=`echo ${ARRAY_LOG_GROUP_NAMES} | sed -e s@$i@@`
fi
done \
&& echo ${ARRAY_LOG_GROUP_NAMES}
結果(例)
手順1で出力されたロググループから、指定した期間内で更新されたロググループが取り除かれて出力
/aws/lambda/appmesh-xxxx /aws/lambda/no1 ... test-log-group-1 test-log-group-2 test-log-group-3 ... test-log-group-4month-ago
ロググループが少ないリージョンで試してみたところ、3ヶ月間で更新されロググループが削除対象から消えていることを確認
(見やすさのために改行していますが、実際はスペース区切りの1行で出力)
5. ロググループの削除
コマンド
for delete in $(echo "${ARRAY_LOG_GROUP_NAMES%None*}");do
aws logs delete-log-group \
--log-group-name ${delete}
done
結果(例)
出力なし
実行後
今後の展望
- AWS CLIスクリプト → Lambda(python) + EventBridgeに書き換え、
自動化できそう- ただ増えても100円/月いくか怪しいので、作成する必要があるか微妙...
- 全リージョンのロググループを一括で削除できるようにする