164日目 CloudWatchでEC2ログの管理したい(2/2) 社畜L

## 🔍前回のおさらい
前回はEC2のログをクラウドウォッチで管理できるように設定しました。
[CloudWatchでEC2ログの管理したい(1/2) 社畜L](https://qiita.com/QiiTaro_/items/6e66425b5c9544f9564e)

今回はさらに使いやすくしていくにはどうすればいいか解説します。
CloudWatchの設定はわかりやすいようにCloudFormation用のymlで説明します。

## 🔍やりたいたこと
1. - [ ] CloudWatchエージェントをインストールする
2. - [ ] CloudWatchエージェントのJSONはSSMパラメータストアで管理しロードしたい
3. - [x] JSONの読み込みは初回のみ手動で今後はEC2再起動のみでSSMパラメータストアを読み込むようにしたい
4. - [x] ログ追加時に通知メールが欲しい


## 🔍事前準備
[CloudWatchでEC2ログの管理したい(1/2) 社畜L](https://qiita.com/QiiTaro_/items/6e66425b5c9544f9564e) の続きです

1. CloudWatchの設定をパラメータストアで管理している
2. AmazonSNSからの通知を受け取るためのメールアドレス

の準備を前提としています。

## 🔍作業手順

### JSONの読み込みは初回のみ手動で今後はEC2再起動のみでSSMパラメータストアを読み込むようにしたい

#### systemdユニットファイル作成

※SSM内にCloudWatchエージェントの設定ファイルの保存が必要、内容は前回を参照

1. EC2起動時コマンドを作成
    ```
    sudo vi /etc/systemd/system/fetch-cloudwatch-config.service
    ```
    ```
    [Unit]
    Description=Fetch CloudWatch Agent config from SSM
    After=network.target
    
    [Service]
    Type=oneshot
    ExecStart=/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c ssm:[SSM名] -s
    RemainAfterExit=true
    
    [Install]
    WantedBy=multi-user.target
    ```
    <br>
2. 設定ファイル読み込み
    ```
    systemctl daemon-reload
    systemctl enable fetch-cloudwatch-config.service
    ```

### ログ追加時に通知メールが欲しい

#### AmazonSNSの準備
1. トピックの作成
    任意の名前で作成する
    ![スクリーンショット 2024-09-25 153503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/3ab052ef-654c-cd7a-20d1-8b235f95e74c.png)
![スクリーンショット 2024-09-25 153512.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/25ec774d-70a9-3ead-e245-6ec27db2df8e.png)

    
    <br>

2. サブスクリプションの作成(メールアドレスの登録)
作成したトピックを開くと画面下部にサブスクリプションの作成という項目があるので、作成を押す

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/0c4975b2-a6fe-6c97-c366-78d3d9f6e78e.png)
    
    トピックARNには先ほど作成したトピックを指定し、
    プロトコルは**Eメール**を指定する
    エンドポイントに通知用のメールアドレスを設定する

    ※**サブスクリプションに複数のメールアドレスを登録することで、
    登録されているすべてのメールアドレスに通知されます。**

    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/d9e351e6-e9b4-d1da-a87a-f80518a3c795.png)

#### CloudWatchアラーム設定(CloudFormation) 

1. CloudFormation用のymlを作成
    手動でも構いませんが下記の内容を[.yml]の形式で保存してください

    ```
    #バージョン指定
    AWSTemplateFormatVersion: "2010-09-09"
    
    #スタックの説明(コメント)
    Description:
      Create_Metrics_Alarm
    
    #パラメータ
    Parameters:
      #Environment
      Environment:
        Type: String
        AllowedValues:
          - development
          - staging
          - production
    
      #SNS
      SNSarn:
        Type: String
        Description: SNS_arn
    
      #Name
      AlarmName:
        Type: String

      LogName:
        Type: String
        
    #リソースの定義
    Resources:
      # Log Filter
      LaravelLogFilter:
        Type: AWS::Logs::MetricFilter
        Properties:
          FilterPattern: ""
          LogGroupName:
            !Ref LogName
          MetricTransformations:
            -
              MetricValue: "1"
              MetricNamespace: log-Namespace
              MetricName: log-Metric
    
      # Alarm
      LogAlarm:
        Type: AWS::CloudWatch::Alarm
        Properties:
          AlarmDescription: "アラームを確認してください。"
          AlarmName: !Ref AlarmName
          AlarmActions:
            - !Ref SNSarn
          ComparisonOperator: GreaterThanOrEqualToThreshold
          Threshold: 1
          DatapointsToAlarm: 1
          EvaluationPeriods: 1
          MetricName: log-Metric
          Namespace: log-Namespace
          TreatMissingData: notBreaching
          # 1minutes
          Period: 60
          Statistic: Average
          Tags:
            - Key: Environment
              Value: !Ref Environment
    ```
    <br>
2. 必要箇所修正
    - AlarmDescription
        アラームのコメント、SNSに通知される
    - Period
        監視タイミング、現在の設定では６０秒おきにチェックを行う
    - MetricName
        カスタムメトリクス名、任意の名前でよい
    - Namespace
        ネームスペース名、任意の名前でよい
    - FilterPattern
        監視フィルタ、設定するとマッチした文字列を含むエラー時にのみ通知される
        
    <br>
3. 実行
    CloudFormationを開きスタックの作成を行う
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/445dee0b-3ada-ca31-a670-0b2c68b8ed4c.png)

    テンプレートの指定で、テンプレートファイルのアップロードを選択し、ファイルの選択を押し、先ほど保存した.yml指定する
    指定後は内容を触らず右下の、[次へ] [送信]と押すことでリソースが作成される
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/9ab2d302-b06b-1514-29cf-b1a1e1ec2e30.png)

    パラメータの設定を行う、
    **SNSarn**の箇所にはSNSトピック内で確認できる**ARN**を入力する
    **LogName**の箇所には監視予定の**ロググループ名**を記載する
    そのほかの項目は任意
    ![スクリーンショット 2024-09-25 163405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/c9b0931e-e6a3-b5a4-87de-b12283d87d54.png)


## 🔍まとめ
今回はSNSの設定とCloudWatchの設定を中心に行いました。
CloudWatchの設定に悩んでいる方の解決に役立てば幸いです。