概要
WAFなどのログをCloudWatch Logsに転送しているが、S3に保存した方が安いため、1ヵ月経ったらS3へ保存するようにしたい
大まかな流れ
①対象のロググループの失効を1ヵ月にする
②CloudWatch LogsのデータをS3へ保存するためのロールを用意
③CloudWatch Logsのデータを受け入れるためのバケットポリシーを記述
④EventBridgeで転送するように設定
手順
①対象のロググループの失効を1ヵ月にする
ロググループを作成する際、以下のように設定(既にある場合は対象を選択し、画面右上アクション⇒保持設定を編集から設定変更可能)
②CloudWatch LogsのデータをS3へ保存するためのロールを用意
まずはポリシーを作成する
サービス:CloudWatch Logs
アクション許可:
・CreateExportTask
・DescribeLogStreams
・DescribeExportTasks
・DescribeLogGroups
・CancelExportTask
⇒検索窓でそれぞれ検索して選択
リソースの特定より、「リージョン」、「Resource log group name」をそれぞれ入力し追加
名前を付けて保存
続いてロールの作成
カスタム信頼ポリシーにてEventBridgeを許可
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
先ほど作ったポリシーを追加し、名前を付けて保存
③CloudWatch Logsのデータを受け入れるためのバケットポリシーを記述
転送先のS3のバケットポリシーに以下を記述
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "logs.ap-northeast-1.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::<対象ロググループ名>",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "<自身のアカウントID>"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:logs:*:<自身のアカウントID>:log-group:*"
}
}
},
{
"Effect": "Allow",
"Principal": {
"Service": "logs.ap-northeast-1.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<対象ロググループ名>/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control",
"aws:SourceAccount": "<自身のアカウントID>"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:logs:*:<自身のアカウントID>:log-group:*"
}
}
}
]
}
<>で囲っている部分は環境によって読み替えて下さい。
④EventBridgeで転送するように設定
スケジュールを作成から、名前を決めて以下のようにCronを設定する
日付の部分を「L」とすることで毎月の月末に動作するようになる
APIは「CloudWatch Logs」の「CreateExportTask」を選択し、入力値として以下を記述
{
"Destination": "<対象の転送先バケット名>",
"DestinationPrefix": "<aws.scheduler.scheduled-time>",
"From": 1736262000,
"LogGroupName": "<対象ロググループ名>",
"To": 4892022000
}
FromとtoはUnix時間で記載する
Unixで変換するサイトがあるため調べて、いつからいつまで動かしたいか決めてUnix時間で記載
他の設定値はデフォルトで、アタッチするロールのみ手順内で作成したロールを選択する
スケジュールを保存で設定完了
動きだけ見たい場合は、Cronの日付を作業している時間の5分後などに設定して動作確認するとよい
以上!!