【AWS】SNSからアラートメール送信機能を使ってみました

# SNSからアラートメールを送信
EC2のCPU使用率をAWSのSNS機能を使って送信してみました。

# ステップ1: EC2用のIAM Roleを作成する
- ```IAM ```→```ロール```→```ロールを作成```をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/62da7d29-6b9b-6915-3f91-68f88089e16d.png)

- ```AWSのサービス```をクリックして、```ユースケース```に```EC2```を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/81fc6d8e-ecf4-6f67-ab24-aabc70b9066a.png)

- ```AmazonSSMFullAccess```を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/56529569-dbce-369c-25c3-02b268bf5049.png)

- ```AmazonSNSFullAccess```を選択した上、```次へ```をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/44a284bf-82b2-fa63-ba65-e7b54aaa643c.png)


- ```ロール名```に名前を入力の上、作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/a8833919-d546-191e-5fd5-1f2d36ae4336.png)

- ロールが作成されたことを確認することができた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/bd094880-fb5a-1053-ea77-446b34cbd59a.png)

# ステップ2: EC2を作成する
- ```EC2```→```インスタンスを起動```をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/b29d4028-7399-225d-0365-78aea81be14e.png)

- 名前とタグ: ```vpn-server```
- アプリケーションおよびOSイメージ: ```Amazon Linux 2```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/268c58b6-6841-7086-fddd-3f835c1801f6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/65c3e620-f8da-591d-378a-d1586bbd0d3f.png)

- ネットワーク設定
    - VPC: 既存のVPCを選択する
    - Subnet: 任意のPublic Subnetを選択する
    - パブリックIPの自動割り当て: ```有効化```にする
    - セキュリティグループ: ```セキュリティグループを作成する```をチェック→```セキュリティグループ名```と```説明```にバリューを入れる
    - セッションマネージャーを用いてログインするため、インバンドルールが不用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/6b044418-17b3-ae18-5ce0-cf46957f1e6d.png)

- キーペア（ログイン）: デフォルト値の```キーペアなしで続行```を選択する
※ EC2のSSMFullAccessのセッションマネージャー機能を用いてログインするため、キー認証では```キーペアなしで続行```を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/deb2da4e-d796-6e85-08c5-cda3204fc12e.png)

- 高度なネットワーク設定
※ 下記の図のようにデフォルト値のままにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/a278b839-3b49-b91f-035d-98338af8364b.png)

- ストレージを設定
※ 下記の図のようにデフォルト値のままにする
- 高度な詳細
    - IAMインスタンスプロフィール: 上記ステップ1で作られたIAMロールを選択する
※ 他の設定は下記の図のようにデフォルト値のままにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/52ec5ad1-49fc-c1a7-b000-fd23e2a57425.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/70228401-04b5-4732-48c6-17b4239c65db.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/43470e6b-81f8-f2f9-a82f-542368b7b6ec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/8a9634cf-96f5-7652-d69a-a72188930580.png)

- EC2インスタンスが作成されたことを確認することができた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/9e91ebf2-81e5-15d0-96dc-9494e0747241.png)

# ステップ3: SNSトピックを作成する
- ```Amazon SNS```→```トピック```→```トピックの作成```をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/e0c71462-a965-c0ff-e735-c00af569358c.png)

- トピックの作成
    - タイプ: ```スタンダード```にチェックを入れる
    - 名前: 任意の内容を入れる
    - 表示名: 任意の内容を入れる
    - 他の設定はデフォルトのままにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/608d916c-0f52-5f49-0fa9-b47b5d6bf048.png)

- トピックが作成されたことを確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/5bc65892-c25d-d838-d687-ec765588dd81.png)

# ステップ4: サブスクリプションを作成する

- ```Amazon SNS```→```トピック```→```サブスクリプションの作成```をクリックする
- 詳細
    - トピック ARN: 上記のステップ3で作成したトピックを選択する
    - プロトコル: ```Eメール```を選択する
    - エンドポイント: 送信先のEメールアドレスを入力する
    - 他の設定はデフォルトのままにする
    - ```サブスクリプションの作成```をクリックする

![截屏2023-10-14 20.14.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/317a9d4b-2107-e3de-ea2a-aa3fa5ba3502.png)

- 上記に登録したEメールアドレスに確認メールが届くので、その```Confirm subscription```リンクを押下し、```Subscription Confirmed!```という文言が表示されればOK

![IMG_6529.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/8717cc62-fc3b-a1d9-b0bd-742ef102f8de.jpeg)

# ステップ5: EC2にCPU使用率をSNS経由で知らせる

- ```セッションマネージャー```を使ってインスタンスに接続する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/3c1ca143-72a0-c6a8-95bd-203097f270c0.png)

- Root userに切り替える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/e18d200b-0f8d-9e40-ddd7-4111d6921072.png)

- AWS Cliの場所を確認する
```
which aws
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/0e47dd02-1df4-22ef-58e0-1f67e33f01bc.png)

- 以下のスクリプトを実装する
    - ```--topic-arn```に上記が生成されたARNを入れ替えてください
``` sh
#!/bin/bash

CPU_us=$(vmstat | awk '{print $13}' | sed -n '$p')
CPU_sy=$(vmstat | awk '{print $14}' | sed -n '$p')
CPU_id=$(vmstat | awk '{print $15}' | sed -n '$p')
CPU_wa=$(vmstat | awk '{print $16}' | sed -n '$p')
CPU_st=$(vmstat | awk '{print $17}' | sed -n '$p')

CPU1=`cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}'`
sleep 5
CPU2=`cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}'`
IDLE1=`echo $CPU1 | awk '{print $4}'`
IDLE2=`echo $CPU2 | awk '{print $4}'`
CPU1_TOTAL=`echo $CPU1 | awk '{print $1+$2+$3+$4+$5+$6+$7}'`
CPU2_TOTAL=`echo $CPU2 | awk '{print $1+$2+$3+$4+$5+$6+$7}'`
IDLE=`echo "$IDLE2-$IDLE1" | bc`
CPU_TOTAL=`echo "$CPU2_TOTAL-$CPU1_TOTAL" | bc`
RATE=`echo "scale=4;($CPU_TOTAL-$IDLE)/$CPU_TOTAL*100" | bc | awk '{printf "%.2f",$1}'`
echo "CPU_RATE:${RATE}%"
CPU_RATE=`echo $RATE | cut -d. -f1`

/usr/bin/aws sns publish \
--topic-arn arn:aws:sns:us-east-1:xxxxxxxxx:TopicForNotification \
--subject "CPU使用率のお知らせ" \
--message "現在のCPU使用率は $CPU_RATE ％です" >> /tmp/cpu.log \
--region us-east-1
```

- 当スクリプトに実行権限を与える: ```chmod 775 test.sh```
- スクリプトの中身を確認する: ```cat test.sh```
- スクリプトを実行する: ```./test.sh```
    - スクリプトを実行した結果、```CPU_RATE:0.00%```が表示される

![截屏2023-10-14 20.50.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/51483fbe-34c7-188d-130a-a03ddcb705f2.png)

- 上記のスクリプトの実行した結果、ステップ4にサブスクリプションされたメールアドレスにも通知を送信したことを確認できた

![IMG_6530.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983478/071532e5-ff2e-a10f-a3b8-4d3afebc4058.jpeg)