EventBridge SchedulerでCloudWatch Logs⇒S3へ自動エクスポート

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

前回CloudWatch Logsに蓄積させたログをS3に手動でエクスポートする手順を確認しました。

https://qiita.com/ohtsuka-shota/items/614a6cfddce257dd623e

今回はこの続きで、EventBridgeを使用して自動でS3にエクスポートする手順をメモって行きたいと思います。
EventBridgeを使うことで、Linuxで言うcron、Windowsで言うTask Scheduler的なことがAWSで出来るので良い感じですね。

# 環境イメージ
以下のような形となります。
EC2からCloudWatch AgentでCloudWatch Logsにログを自動アップロード。アップロードされたものEventBridge Schedulerを使って1分間隔でS3にエクスポートしていきたいと思います。
![島田様02-ページ4.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/b03a8fbe-73a3-19e5-0bd1-8d263bed0daa.png)


# 構築
## IAM Role作成
EventBridge SchedulerにアタッチするためのIAM Roleを作成していきます。
IAM Role作成画面でカスタム信頼ポリシーを選択し、ポリシーに以下の内容を書いていきます。
![screencapture-us-east-1-console-aws-amazon-iam-home-2024-06-19-08_27_50 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3ba6638c-25a6-5aa3-a43c-ff8dbe5a4324.png)
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```
※scheduler.amazonaws.com（＝EventBridge Scheduler）が今作っているIAM Roleを使用して定義されたアクション（IAMロールにアタッチされたアクセスポリシー。今回は後からCloudWatchLogsFullAccessをアタッチするのでそれのこと）を実行することが出来るようになる、という意味っぽいです。
許可を追加の画面でCloudWatchLogsFullAccessをアタッチします。
![Untitled (45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/0ef70891-f366-40be-1944-d16e1b772daf.png)
Roleの名前はEventBridge-add-task-to-CloudWatchLogsとしました。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/9744e5a2-7471-320c-4c45-f896f057c493.png)

## EventBridge Schedulerの作成
EventBridge Schedulerの画面からスケジュールを作成を押下します。
![Untitled (46).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f1d0d5fe-bd33-8e14-20b6-84ba9404e90d.png)
Schedulerの名前はCloudWatchLogs-S3Exportとしました。
スケジュールパターンの頻度は定期的なスケジュールを選択。種類はrateベースとし、1 minutesとし1分間隔でスケジューリングしました。
![screencapture-ap-northeast-1-console-aws-amazon-scheduler-home-2024-06-20-07_02_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/088a71f3-d02b-8fc4-d15c-050a9f60d82e.png)
ターゲットを選択します。CloudWatch Logsを選択します。
![screencapture-ap-northeast-1-console-aws-amazon-scheduler-home-2024-06-19-07_56_39 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/5c79fb08-7957-ca7f-e18a-fe6ad3a490ae.png)
その後CreateExportTaskを選択します。
![Untitled (48).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/61fab907-b5e2-9fdf-5f79-3706077eb5e6.png)
タスクの詳細を記入します。今回は以下としました。
LogGroupNameはCloudWatchLogsにあるロググループの名前です。
FromとToはエポック時間ミリ秒単位で開始時間と終了時間を記載します。AIに「エポック時間で2024年1月1日から12月31日までにしてください」みたいなことを聞いて出力してきたのをとりあえず入れています。
DestinationはS3バケットの名前を。Prefixはバケットの中のディレクトリを示しています。\<aws.scheduler.scheduled-time\>はタスク実行時間になり、実行ごとにフォルダを作るようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3ac96537-9c62-fb12-1579-4fc1449326cd.png)
```
{
  "LogGroupName": "ApplicationEventLog",
  "From": 1704067200000,
  "To": 1735689599000,
  "Destination": "wineventlog-cloudwatchlogs",
  "DestinationPrefix": "ApplicationEventLog/<aws.scheduler.scheduled-time>"
}
```


<details><summary>参考</summary>
CloudWatch Logsのロググループ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/68473f3b-ad12-839f-eb61-ec57c7232321.png)

S3バケットと内部のディレクトリ（プレフィックス）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/14ba3785-cf95-a7fc-7c22-1157d220e66d.png)

</details>



アクセス許可に作成したIAM Roleをアタッチします。この後の画面で最終確認が表示されますので確認します。
![screencapture-ap-northeast-1-console-aws-amazon-scheduler-home-2024-06-20-07_12_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/d394d1e6-c035-aed4-3a45-53baa15fdd83.png)
作成されたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/7a409b24-1f23-7403-a06f-1aa092d50bb1.png)

## S3に自動エクスポートされるか確認する
指定したS3バケット/プレフィックスに自動でエクスポートされているかを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e49653f9-51e5-9d06-508e-3881741e30a9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/40db8c41-ec96-cd4b-698a-0c3fd36194d4.png)

CloudWatch LogsからS3にエクスポートしたことで、Logsにあるログを削除したいところです。
これに関しては今後・・・