CloudWatch Logs ロググループの保持期間を自動で設定するやつ

# 概要

AWSを利用していると意識していないのに、CloudWatch Logsのロググループが作成されていて、保持期間の設定なしの状態で保管されているので結構な費用が発生している何てことあると思います。
ということで、新規ロググループが作成されたら自動で保持期間を設定するマシンを作成します！

下図が今回のステートマシン……もはやシンプルすぎて別にステートマシンじゃなくてもいいんですが…
![stepfunctions_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1123830/cbaa6636-9382-4b1a-e10e-e2d61bbbb2ad.png)

やってることはシンプルで、ロググループの作成をEventBridgeで検知して、ステートマシンを呼び出して保持期間を設定します。
細かい手順は割愛して、CloudFormationテンプレートを用意したので、使ってみてください～

# CloudFormationテンプレート

パラメータは以下のとおりです！

| **設定項目** | **設定値** |
| :---------: | :---------: |
| StateMachineName | StepFunctionsのステートマシン名 |
| RetentionDate | ロググループに設定する保持期間 |

```yaml
AWSTemplateFormatVersion: '2010-09-09'

Description: State machine to Change retention policy

Parameters:
  StateMachineName:
    Default: PutRetentionPolicyMachine
    Type: String
  RetentionDate:
    Default: 30
    Type: Number
    AllowedValues:
      - 1
      - 3
      - 5
      - 7
      - 14
      - 30
      - 60
      - 90
      - 120
      - 150
      - 180
      - 365
      - 400
      - 545
      - 731
      - 1827
      - 3653

Resources:
  XRayAccessPolicy:
    Type: 'AWS::IAM::Policy'
    Properties:
      PolicyName: !Sub XRayAccessPolicy-${AWS::StackName}
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:
              - 'xray:PutTraceSegments'
              - 'xray:PutTelemetryRecords'
              - 'xray:GetSamplingRules'
              - 'xray:GetSamplingTargets'
            Resource: '*'
      Roles:
        - !Ref MyStateMachineRole
  
  PutRetentionPolicyAccess:
    Type: 'AWS::IAM::Policy'
    Properties:
      PolicyName: !Sub PutRetentionPolicy-${AWS::StackName}
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:
              - 'logs:PutRetentionPolicy'
            Resource: '*'
      Roles:
        - !Ref MyStateMachineRole

  MyStateMachineRole:
    Type: "AWS::IAM::Role"
    Properties: 
      AssumeRolePolicyDocument: 
        Version: "2012-10-17"
        Statement: 
          - 
            Effect: "Allow"
            Principal: 
              Service: 
                - "states.amazonaws.com"
            Action: 
              - "sts:AssumeRole"
      Path: "/"

  MyStateMachine:
    Type: AWS::StepFunctions::StateMachine
    Properties:
      StateMachineName: !Ref StateMachineName
      Definition:
        Comment: A description of my state machine
        StartAt: PutRetentionPolicy
        States:
          PutRetentionPolicy:
            Type: Task
            End: true
            Parameters:
              LogGroupName.$: $.detail.requestParameters.logGroupName
              RetentionInDays: !Ref RetentionDate
            Resource: arn:aws:states:::aws-sdk:cloudwatchlogs:putRetentionPolicy
      RoleArn: !GetAtt MyStateMachineRole.Arn

  EventBridgeRule:
    Type: AWS::Events::Rule
    Properties: 
      EventBusName: default
      EventPattern:
        source:
          - aws.logs
        detail-type:
          - "AWS API Call via CloudTrail"
        detail:
          eventSource:
            - logs.amazonaws.com
          eventName:
            - CreateLogGroup
      Name: !Sub CreateLogGroupEventRule-${AWS::StackName}
      Targets: 
        - Arn: !GetAtt MyStateMachine.Arn
          Id: !Sub CreateLogGroupEventRule-${AWS::StackName}
          RoleArn: !GetAtt EventRole.Arn

  EventRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: !Sub events.amazonaws.com
            Action: 'sts:AssumeRole'
      Path: /
      Policies:
        - PolicyName: !Sub PutEventsPolicy-${AWS::StackName}
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - 'states:StartExecution'
                Resource:
                  - !GetAtt MyStateMachine.Arn
```

# 終わりに

こういうコスパのいいもの増やしていきたいですね！
以上！！