CloudWatch Logsの保存期間を変更するシェルスクリプト

はじめに

先日先人が作り上げた、偉大なログエクスポートを実行するStepFunctionsがコケていました。
一時的に全てのCloudWatchLogsの保持期間を「失効しない」に変更しました。
CloudWatch LogsからS3バケットにエクスポートするシェルスクリプトでバックアップは取得できたので、それぞれの保持期間を戻していきます。
前回と同じ理由で、対象となるCloudWatchLogsの量が多いことや、アクセスキーが払い出されていないことから、本番環境のCloudShellで作業実施を決めました。

参考:
AWS ドキュメント「ロググループとログストリームの操作」

構成図


構築

1.CloudWatch Logsの保存期間を変更シェルスクリプト

1.1.転送するCloudWatchLogsのリストファイルを作成

S3へ転送したい CloudWatchLogsのロググループをテキストファイル形式で作成して保存
※下記log.txtの内容にS3に転送したいロググループ名を記載する

【例】log.txt

/aws/lambda/cfn-sf-inamura-LambdaHumanApprovalSendEmailFunctio-wPwtEbDmKEg3
/aws/lambda/cfn-stepfunctions-inamura-LambdaHumanApprovalSendE-3j0qFdWkOpat
/aws/lambda/cfn-stepfunctions-inamura-LambdaHumanApprovalSendE-D92dYTTBLAmy
/aws/lambda/cfn-stepfunctions-inamura-LambdaHumanApprovalSendE-IbgVOxScNeUI
/aws/lambda/cfn-stepfunctions-inamura-LambdaHumanApprovalSendE-UTH7yskJ5b79

1.2.CloudWatch Logsの保存期間を変更シェルスクリプト

今回利用するCLIのput-retention-policyからでは「失効しない(無期限)」は実現できないようでした。
ログデータを無期限に保持するとストレージコストが高くなる可能性があるためとのこと、真偽は不明だが今回は「失効しない」状態から特定の日にちにするため深く踏み込まない。
参照:AWS CLI コマンドリファレンス

【シェルスクリプト】change_log_retention.sh

#!/bin/bash
#エラーが発生した場合停止
set -e
#スクリプトがエラーで終了した場合、エラーメッセージを表示
trap 'echo "保存期間の変更に失敗しました:$log_group" >&2' ERR

# CloudWatchLogsで変更可能な引数の値
if [[ ! $2 =~ ^(1|3|5|7|14|30|60|90|120|150|180|365|400|545|731|1096|1827|2192|2557|2922|3288|3653)$ ]]; then
  echo "CloudWatchLogsで保存可能な値を引数としてください: [1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1096, 1827, 2192, 2557, 2922, 3288, 3653]"
  exit 1
fi

#ログリストを一行ずつ実行
while read log_group; do
  # 保存期間を変更する
  aws logs put-retention-policy --log-group-name "$log_group" --retention-in-days $2

  # 操作が成功したらメッセージを表示
  echo "保存期間が変更されました:$log_group"

done < $1

挙動の確認

1.CloudShellでのシェルスクリプト実行前

1.1で作成したlog.txtに記載している変更対象(実行前なので”失効しない”)

2.CloudShellでのシェルスクリプト実行

変更対象log.txtの保持期間を7日とするコマンドを実行

$ bash retention.sh "log.txt" 7

3.CloudShellでのシェルスクリプト実行後

実行後保存期間が変更されたコメントとともに、対象ロググループ名が出力される

4.CloudWatchLogsグループの保存期間が変更されている

選んだ対象のCloudWatchLogsグループの保持期間が1週間に変更されたことを確認できる

さいごに

APIに依頼してることは単純な動作ですが、保持期間を無期限に出来ないことなど「細かなこと知らないなぁ」と思えることが多かったです。
とりあえずリストに記載すれば、対象の一覧全てをサクッと変更することができるようになったので、それについては概ね満足。
※利用したS3バケットは検証終了したため削除されています。

Last modified: 2023-05-28

Author