【AWS】「CloudWatch Logsを文字列検知してログ内容をメールを送信してみた」をやってみた

#はじめに 
「[CloudWatch Logs を文字列検知してログ内容をメールを送信してみた](https://dev.classmethod.jp/articles/notification_cloudwatchlogs_subscriptoinfilter/)」について、キャプチャがなくて戸惑ったり一部やり方を変えて行ったので、備忘録として残したい。

#手順
##SNSトピックの作成
SNS>トピック>トピックの作成を選択する。名前と表示名(オプション)を入力する。
![スクリーンショット 2020-09-02 17.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/08552096-783f-739b-b29b-288abe998c02.png)
トピックの作成を選択する。
![スクリーンショット 2020-09-02 17.57.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/914d020c-f007-629b-5849-e6a82d1c991f.png)
SNS>サブスクリプション>サブスクリプションの作成を選択する。
![スクリーンショット 2020-09-02 17.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/24e5193d-e217-9c1b-cef1-399c2b940ef6.png)
下記の内容を選択・入力する。
プロトコル：Eメール
エンドポイント：自身のメールアドレス
選択できたら、サブスクリプションの作成を選択する。
![スクリーンショット 2020-09-02 17.58.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/1eebbf9b-8927-65f3-7d1b-b8ab510855b2.png)
しばらくすると下記のようなメールが送られてくるので、確認の上Confiem subscriptionを選択する。
![スクリーンショット 2020-09-02 17.59.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/63d4b5d3-5297-c864-39c7-abdcbbe47b30.png)

##Lambda関数の作成
Lambda>関数>関数の作成を選択する。
![スクリーンショット 2020-09-02 18.01.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/7e5297c2-936c-122b-cda9-4f15435816ec.png)
下記内容を選択・入力する。
オプション：一から作成
関数名：任意の名前を入力
ランタイム：Python3.7

関数の作成を選択する。
![スクリーンショット 2020-09-02 18.02.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/411b5388-ad76-56c9-2731-b8079d07e9b5.png)

関数コードに以下のコードを貼り付ける。

```
import base64
import json
import zlib
import datetime
import os
import boto3
from botocore.exceptions import ClientError

print('Loading function')


def lambda_handler(event, context):
    data = zlib.decompress(base64.b64decode(event['awslogs']['data']), 16+zlib.MAX_WBITS)
    data_json = json.loads(data)
    log_json = json.loads(json.dumps(data_json["logEvents"][0], ensure_ascii=False))

    print(log_json)

    try:
        sns = boto3.client('sns')

        #SNS Publish
        publishResponse = sns.publish(
            TopicArn = os.environ['SNS_TOPIC_ARN'],
            Message = log_json['message'],
            Subject = os.environ['ALARM_SUBJECT']
        )

    except Exception as e:
        print(e)
```
![スクリーンショット 2020-09-02 18.03.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/adee57ff-e758-9e61-8a06-adf9dff6a6df.png)



環境変数に以下の内容を入力する。
SNS_TOPIC_ARN：前の手順で作成したメール通知用トピック ARN(ARNはSNS>トピック>該当のトピックで選択する。)
ALARM_SUBJECT：SNS で通知される際の件名
![スクリーンショット 2020-09-02 18.06.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/5ec05789-02c3-9f41-9c66-3cbb4b9ffd43.png)

![スクリーンショット 2020-09-02 18.07.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/fdaaef41-58da-375d-5770-d6a44474e646.png)

基本設定でタイムアウトは私の場合デフォルトで0分3秒になっているが、1分に変える。
保存を選択する。
![スクリーンショット 2020-09-02 18.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/87158a77-6518-a49b-1a74-0429a4b668f6.png)

![スクリーンショット 2020-09-02 18.08.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/72da297d-b4f4-196a-482e-c3db21230b2f.png)
アクセス権限タブを選択する。
![スクリーンショット 2020-09-02 18.12.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/01a54e3a-e1ec-05cd-b105-902cb0e7fd23.png)
実行ロールという項目のロール名を選択する。
![スクリーンショット 2020-09-02 18.13.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/c5c37546-5fe9-2a0f-56da-d85ab8da198a.png)
アクセス権限タブ>ポリシーをアタッチしますを選択する。
![スクリーンショット 2020-09-02 18.13.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/b4bccb10-0907-9f09-57d8-7dc339a1eebe.png)
AmazonSNSFullAccessにチェックをつけて、ポリシーのアタッチを選択する。
![スクリーンショット 2020-09-02 18.14.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/c2766a9f-c68b-b5e8-f05e-e6f005450ab7.png)

##サブスクリプションフィルタの作成
Cloudwatch>CloudWatch Logs>アクション>Lambda サブスクリプションフィルターを作成を選択する。
![スクリーンショット 2020-09-02 18.19.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/92fdbc35-6d74-3c02-1967-40a2b44e35e5.png)

![スクリーンショット 2020-09-02 18.20.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/6c4a5093-f94d-f004-fc4e-280f9fdc4868.png)

以下の内容を入力する。
Lambda 関数：前の手順で作成した関数
ログの形式：出力されるログに合わせた形式を選択
サブスクリプションフィルターのパターン：検出する文字列・パターンを入力

![スクリーンショット 2020-09-02 18.30.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/fc6890c0-049c-a0a7-a5a3-7b12099ec2d3.png)
ストリーミングを開始を選択する。
![スクリーンショット 2020-09-02 18.26.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/443d8b80-4063-0550-f1cb-2dcd2ebadffc.png)

##テスト
CloudWatch Logsのダッシュボードの対象ロググループを選択し、ログストリームのタブから対象のログストリームを選択する。
![スクリーンショット 2020-09-03 17.18.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/3e8e4dbd-def5-c222-c959-8bd3780fc1cc.png)
アクション>Create log eventsを選択する。
![スクリーンショット 2020-09-03 17.23.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/7e61bf5d-fe99-c079-5f8f-17236668b392.png)
テスト用に送信したいメッセージを入力し、作成を選択する。
![スクリーンショット 2020-09-03 17.26.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/e6937218-ae62-3153-686a-a4284dbce13e.png)


参考
https://dev.classmethod.jp/articles/cloudwatch-logs-put-test-log/