問題
ログはカスタムsyslogサーバで集めていた。EBはもちろん下位インスタントのログも無理やり転送していた。特に負荷問題はないし、カッコウわるいけど、まーいいかの状態だった。
それが・・・もやは、CloudWatchはシステム構成の必須サービスになっている。何にしろログサーバとしてEC2単体運用はよろしくないので徐々にCloudWatchに移動することに。
そこで・・・EBの場合、ログ設定項目の[保持期間]、[ライフサイクル]によって環境のリタイヤと同時に掃除されると思ったら・・・
CloudWatchのログファイルは消えるが、フォルダのような[ロググループ]や[ログストリーム]はそのまま残るのではないか。
EBはスワップで頻繁にリリースするので過去環境の[ロググループ]が大量に残っていた。
ググっても大した情報はなかった。いくぞ!Lambdaよ。
関数コード
Python3.7
import json
import boto3
import time
def lambda_handler(event, context):
curTime = int(time.time())
client = boto3.client('logs')
pagenator = client.get_paginator('describe_log_groups')
page_iterator = pagenator.paginate()
for grps in page_iterator:
for grp in grps["logGroups"]:
grpName = grp["logGroupName"]
storedBytes = grp["storedBytes"]
creationTime = grp['creationTime']
#新規ログテーブルはまだデータがない場合もあるため作成日14日以上を対象とする
useDays = int((curTime - (creationTime / 1000)) / (24 * 3600))
#print(grpName, curTime, creationTime, f"useDays:${useDays}", f"storedBytes:${storedBytes}")
if useDays >= 14:
if storedBytes < 1:
print("DEL " + grpName + ": " + str(storedBytes) + "byte")
res = client.delete_log_group(
logGroupName = grpName
)
return {
'statusCode': 200,
'body': json.dumps("OK")
}
- 設定
- タイムアウト: デフォルト3秒ではタイムアウトになるので30秒程度に。
- CloudWatch Events: cron(0 13 * * ? *) 一日1回で十分。
参考
-
ECSのコンテナーログ保存先をCloudWatchに設定した翌日、テスターからECS上のサービスが動いてないと連絡があった。環境構築後、作業は数日後になることもあるので、作成日14日以上の条件を追加。