初めに結論
やってみると動くけど、実運用ではそのまま使うのは難しい。
Eventbridge Scheduler
Eventbridge の機能でAWSのAPIをターゲットにしてスケジュール実行ができる。
CLoudwatch logs
AWSのサービスやEC2などのログを集約できるサービス
S3
言わずとれしれたオブジェクトストレージ、なんでも保存できる
Cloudwatch logsをS3に保存したい
AWS上の種々のログはCloudwatch Logsに簡単に出力できる。なのでどんどん出力されたログは蓄積される。容量は制限がないので、蓄積したままでもよいが、Cloudwatch Logsに大量のログをずっとおいておくと費用がかかる。なので、蓄積したいログはなるべく安いところに移動して削除したい。
ということで、CloudwatchLogsからS3に移動して古いログはライフサイクルルールで安いストレージクラスに移動する、というのが常道。
Cloudwatch logsからS3への移動方法
実運用を考えると一回ではなく定期的に実行する必要があるが、いくつか方法がとれる
- LambdaでCloudwatch LogsのAPI(Create Export Task)を呼ぶ処理をつくってEventBridge Schedulerとかで定期実行
- Cloudwatch Logs Subscription FilterとKinesisFirehoseで随時転送
- Eventbridge SchedulerからCloudwatch LogsのAPI(Create Export Task)を直実行
Lambdaは何でもかけるがコードを書かなくてはいけない。
Subscription FileterとKinesis Firehoseはコード書くのは不要だが別のサービスの設定を考えなくてはいけない。
それでは"Eventbridge SchedulerからCloudwatch LogsのAPI(Create Export Task)を直実行"だとどうなるだろうか。
Eventbridge Schedulerの設定画面をみてみる
Eventbridge SchedulerのCreate Scheduleから
スケジュール名は適当にして、スケジュールを考える、定期的に、と考えるととりあえず毎日0時に一回実行、と考えてみる
Desitinationは宛先のS3、LogGroupNameは対象のLogGroupName、ここまではよい
"From"と"to"がある。1日一回毎日実行、とすると、この枠に対象の日の時間枠を設定してあげないといけないはず
CreateExportTaskのリファレンスを確認する
https://docs.aws.amazon.com/cli/latest/reference/logs/create-export-task.html
どうもFrom,toは必須であり、
"1970 00:00:00"からのミリセカンドの経過時間でしか指定できない。。。
ということは、毎日異なる時間枠で実行するためには毎日分のスケジュールを個別につくって全部固定値を入れる必要がある、ということなので、やろうとすると実現性がなさそうである。
(CDKかなにかである程度の先まで毎日分のスケジュールをFromとto固定値で作成しておく?とかになってしまう)
ということでこの方法での定期Exportは実運用ではつかえなそうなので、"Cloudwatch Logs Subscription FilterとKinesisFirehoseで随時転送"が適していると考えている。
考察と期待
"やってみて機能としてできる"、と"実運用でも使える"はギャップがあるので、運用考えて設計しないといけないな、と思いました。
AWSさん、ぜひEventbridgeからの実行時に実行時間などから可変のパラメータを渡せるように(24時間前から実行時までとか)機能拡張をお願いします