Amazon CloudWatchロググループ保持期間をAWS Lambdaで管理しよう

こんにちは、stremapackのrisakoです。
長い梅雨が明けて夏がやってきましたね:sunny:
コロナに気をつけながら、マスクで熱中症にならないようにもっと注意が必要ですね:mask:
今年の夏は体調管理に気をつけて過ごそうと思います。
#今回したいこと
今回のテーマは「Amazon CloudWatchロググループ保持期間をAWS Lambdaで管理しよう」です！
Amazon ECSやAWS Lambda（以下Lambda）を使っていると、Amazon CloudWatch(以下CoudWatch)にログが溜まり続けてしまいます。
しかも、CloudWatch LogGroupの保持期間はデフォルトで「失効しない」に設定されるため、永遠にログが残り続けてしまい金額も増えてしまいます。今回は、金額を少しでも抑えるために、新規作成されたロググループの保持期間を自動で「１ヶ月」に変更する仕組みをLambdaで入れてみたいと思います！

#今回のアイテム
- IAM role
- IAM policy
- Amazon CloudWatch LogGroup 
- AWS Lambda
- Amazon EventBridge

#やってみよう
###IAM Role設定
Role名は**cloudwatchtest-lambda-role**としておきます。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

###IAM Policy設定

Policy名は**cloudwatchtest-lambda-policy**です。
CloudWatchを操作できる権限を付与しています。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:DescribeLogGroups",
                "logs:PutRetentionPolicy",
                "logs:CreateLogGroup",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
```

###Lambda設定
Lamndaの関数は、下記で作成しました。
**関数名：change_Retention_for_cloudwatch-logs
ランタイム：Python 3.8**

関数コード
新規作成されたロググループの保持期間を**１ヶ月（30日）**に変更したいので、retentionInDays = 30に設定します。
ここは希望の保持期間を指定します。
例：1.3.5.7.60

```
import boto3

logs = boto3.client('logs')

def lambda_handler(event, context):

    loggroupname = event['detail']['requestParameters']['logGroupName']

    try:
        response = logs.put_retention_policy(
            logGroupName = loggroupname,
            retentionInDays = 30
        )

    except Exception as e:
        print(e)
```

###EventBridge設定
今回は、CloudWatch LogGroupが新規作成されるのをトリガーに上記で作成したLambdaを動かしたいので、EventBridgeのルールで感知してもらうようにします。
それでは、ルールを作成します。

パターンの定義は下記で設定します。
**イベントパターン
イベント一致パターン：カスタムパターン**

定義するコードは、右横に出る四角の中に入れます。
![スクリーンショット 2020-08-06 17.52.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429615/b0a8a4f6-50d2-6ab1-38af-2e98061fecfa.png)

ターゲットは、先ほど作成したLambda関数を指定します。
![スクリーンショット 2020-08-06 18.03.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429615/b1ce2b3a-fba5-f0d3-cafa-f34dd2468791.png)

#これで設定は終わり！動かしてみよう
新規作成されたCloudwatch LogGroupの保持期間が１ヶ月になれば、動作確認はOKです！
CloudWatchコンソールの「ロググループを作成」から新規作成します。

**作成直後**
![スクリーンショット 2020-07-30 17.46.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429615/1873bc49-283d-72fc-da6a-a8143af0aedb.png)

**数分後**
![スクリーンショット 2020-07-30 17.46.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429615/bc9bd03c-621a-d192-b417-a36527693802.png)


新規作成してからすぐに保持期間が反映されるわけではないですが、正しく保持期間が設定できていることが確認できます。
これで、ログが溜まり続けて知らぬ間に料金が高くなっているなんてことも防げそうですね:ok_hand:

##参考
・Amazon EventBridge とは
https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/what-is-amazon-eventbridge.html
・Amazon CloudWatch Logs とは
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html
・CloudWatch の使用料金が請求された理由を確認してから、今後の料金を削減するにはどうすればよいですか?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudwatch-understand-and-reduce-charges/?nc1=h_ls