CloudWatch LogsのログをS3へ保存する

## 概要
WAFなどのログをCloudWatch Logsに転送しているが、S3に保存した方が安いため、1ヵ月経ったらS3へ保存するようにしたい

## 大まかな流れ
①対象のロググループの失効を1ヵ月にする
②CloudWatch LogsのデータをS3へ保存するためのロールを用意
③CloudWatch Logsのデータを受け入れるためのバケットポリシーを記述
④EventBridgeで転送するように設定

## 手順
**①対象のロググループの失効を1ヵ月にする**
ロググループを作成する際、以下のように設定（既にある場合は対象を選択し、画面右上アクション⇒保持設定を編集から設定変更可能）

![スクリーンショット1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/9ad38cc6-4212-f5ce-71a2-a9d30768e50c.png)

**②CloudWatch LogsのデータをS3へ保存するためのロールを用意**

まずはポリシーを作成する
サービス：CloudWatch Logs
アクション許可：
・CreateExportTask
・DescribeLogStreams
・DescribeExportTasks
・DescribeLogGroups
・CancelExportTask

⇒検索窓でそれぞれ検索して選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/0c02c2f1-67c7-809e-ad32-4cf28abc18dd.png)

リソースの特定より、「リージョン」、「Resource log group name」をそれぞれ入力し追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/01314813-91dc-23ec-bb96-f9d00320a1c3.png)

名前を付けて保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/59a71277-c882-2f2a-e681-9e3c24842e6b.png)

続いてロールの作成
カスタム信頼ポリシーにてEventBridgeを許可

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/a5449ccf-9164-cdd6-f796-fef32df620a8.png)

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```
先ほど作ったポリシーを追加し、名前を付けて保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/9f297a8e-1ee3-9d48-b64e-b930a734276d.png)

**③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を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/2c05bc1c-b497-51cd-c3a0-2c8faad7ea3e.png)

日付の部分を「**L**」とすることで**毎月の月末**に動作するようになる

APIは「**CloudWatch Logs**」の「**CreateExportTask**」を選択し、入力値として以下を記述
```
{
  "Destination": "<対象の転送先バケット名>",
  "DestinationPrefix": "<aws.scheduler.scheduled-time>",
  "From": 1736262000,
  "LogGroupName": "<対象ロググループ名>",
  "To": 4892022000
}
```
Fromとtoは**Unix時間**で記載する
Unixで変換するサイトがあるため調べて、いつからいつまで動かしたいか決めてUnix時間で記載
他の設定値はデフォルトで、**アタッチするロールのみ手順内で作成したロールを選択する**
スケジュールを保存で設定完了

動きだけ見たい場合は、Cronの日付を作業している時間の5分後などに設定して動作確認するとよい

以上！！