CloudWatch Logs の保持期間を作成時に変更する

CloudWatch Logs の保持期間を都度変更するのが大変なので作成時に決まった期間で変更するようにしてみました
2020.07.07

こんにちは、望月です。
CloudWatch Logs はみなさんお使いでしょうか。
手軽にログを確認することができ、大変便利でみなさんも大好きなサービスかと思います。
ログを手軽に溜め込むことができ、便利なんですが検証アカウントをいろいろ触っているとデフォルトの設定では無制限にログが保持されるため、保持期間を変更したり、たまにロググループを整理することになることもあるかと思います。
そもそも検証アカウントなのでデフォルトの設定が無制限である必要ないなと思ったので、ロググループの作成を EventBridge で検知し Lambda を動かし、保持期間を変更するようにしてみました。

やってみた

まずは Lambda 関数の作成を行います。
Python 3.8 を選択し、割り当てる IAM ロールには CloudWatchLogsFullAcces 権限を追加します。

  • 関数名
    • お好きに
  • ランタイム
    • Python 3.8
  • アクセス権限
    • CloudWatchLogsFullAcces

関数コードには以下のコードを記載し、作成します。
retentionInDays で保持期間を指定しており、ここでは30日としています。

import boto3

logs = boto3.client('logs')

def lambda_handler(event, context):

    loggroupname = event['detail']['requestParameters']['logGroupName']

    try:
        response = logs.put_retention_policy(
            logGroupName = loggroupname,
            retentionInDays = 30
        )

    except Exception as e:
        print(e)

Lambda 関数作成後、ロググループ作成時に Lambda を実行するため、EventBridge にルールを作成します。

  • 名前
    • お好きに
  • パターンを定義
    • イベントパターン
    • イベント一致パターン
      • カスタムパターン
  • ターゲットを選択
    • Lambda 関数
      • 先程作成した Lambda 関数を指定します。

カスタムパターンには以下イベントパターンを記載し、作成します。

{
  "source": [
    "aws.logs"
  ],
  "detail-type": [
    "AWS API Call via CloudTrail"
  ],
  "detail": {
    "eventSource": [
      "logs.amazonaws.com"
    ],
    "eventName": [
      "CreateLogGroup"
    ]
  }
}

実際にロググループを作成し、指定した保持期間 ( 30日 ) になることを確認します。
試しに "test-loggroup" というロググループを作成してみました。

作成直後は「保持しない」設定になっています。

少し待つと Lambda が実行され、「30日」に変更されました。

まとめ

これで検証アカウントで意図せずログが保持されつづけ、無駄なコストが発生することが防げそうです。
とはいえ、意識せずに保持期間が変更されることにもなるので、のちのちログが残ってないといった問題も発生する可能性はあります。
デフォルト設定が変わるような内容はしっかり周知し、利用者全員が認識した上で行いましょう。

CloudFormation のコード化もちょっとやるかという気持ちはあるので、そのときは更新します。お楽しみに!?