EC2をSlackで簡単に監視する


<!-- 発端や概要を記載 -->
なおきち餃子（@naokichigyoza）と申します。
初のQiita記事投稿です。

今回は「EC2が終了したことに気づきたい！監視する方法ないの！？」
という質問（要望）を受け、EC2 をの監視システムを作りました。

作る上では「簡単に」というのを意識しました。具体的には以下です。
- スクリプトを書かない
- マネージドサービスを使う
- Slackで通知させる

最終的に、**ステータス と CPU使用率 が監視できるようになりました。**

# 目次
<!-- タイトルとアンカー名を編集 -->
### ひとまずステータスを確認できるようにする
1. [構成図](#01_image)
1. [構築手順 - Amazon SNS](#02_sns)
1. [構築手順 - AWS Chatbot](#03_chatbot)
1. [構築手順 - Amazon EventBridge](#04_eventbridge)
1. [Slack通知](#05_result)
### CPU使用率も監視できるようにする
6. [追加構成 - AWS CloudWatch](#06_cloudwatch_alarm)
7. [Slack通知_2](#07_result2)

<!-- 各チャプター -->
<a id="#01_image"></a>
# 構成図
![構成図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/1fce475b-81c6-a901-bea2-b06e3d4ed609.png)
EC2のステータスが変化したら、Slackに通知が飛ぶようにします。
こちらが構成図です。

EC2のステータスが変化したことをAmazon EventBridge で検出し、SNSトピックに送信します。
SNSにデータが書き込まれると、ChatbotがSlackに内容を通知します。

実際に構築してみましょう。

<a id="#02_sns"></a>
# 構築手順 - Amazon SNS
まずはSNSトピックを新規作成します。
Amazon SNS > トピック > トピックの作成
![FireShot Capture 007 - Simple Notification Service - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/5d75b7f6-4060-8705-3e46-5dd5b6f50678.png)

好きな名前を入力し、画面下部の[トピックの作成]をクリック。
![FireShot Capture 008 - Simple Notification Service - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/4fb39a8d-510a-84fd-5f6e-d1d3f83893df.png)

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/085fb30e-fe2b-ec1d-3673-e410c3f70960.png">

<a id="#03_chatbot"></a>
# 構築手順 - AWS Chatbot

次はChatbotの設定です。
チャットクライアントで[Slack]を選択し、[クライアントを設定]をクリックします。
![FireShot Capture 011 - AWS Chatbot - us-east-2.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/5e9ca152-aeb9-8316-1f84-4d2df30492e1.png)

Slackサインイン画面が出てくるので、サインインして続けます。
![スクリーンショット 2023-01-22 18.31.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/25cca78e-eab0-6607-1fe9-9a3a55539df7.png)

ワークスペース名が表示されれば成功です。[新しいチャネルを設定]をクリックします。
![FireShot Capture 017 - Slack - AWS Chatbot - us-east-2.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/cbe680d1-ab12-3060-d7e8-7bae9ade2b4c.png)

設定名に任意の名前を入力し、Slackのチャネルも指定します。
![FireShot Capture 020 - Slack チャネルの詳細 - AWS Chatbot - us-east-2.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/62ad68e8-35f0-c093-5015-b5e542f9fe4a.png)

Chatbotで使用するロールを指定します。
[テンプレートを使用してIAMロールを作成する]を選択し、任意のロール名を入力しておきます。
![FireShot Capture 021 - Slack チャネルの詳細 - AWS Chatbot - us-east-2.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/2db20fc9-e4e5-26ab-46f5-25ef5a44ec2d.png)

ガードレールポリシーを入力します。ここには[CloudWatchReadOnlyAccess]を入力しておきます。
（1つ前の手順で作成したロールと、ここで指定するポリシー、これら2つに共通する権限でChatbotは動作します。）
![FireShot Capture 022 - Slack チャネルの詳細 - AWS Chatbot - us-east-2.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/d848da8f-e85a-1eb9-3462-8b97a4534475.png)

Chatbotと紐付けるSNSトピックを指定します。
先ほど作成したSNSトピックを指定しておきます。
![FireShot Capture 023 - Slack チャネルの詳細 - AWS Chatbot - us-east-2.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/c8820e92-cdcb-dfc8-988a-5e9d5c69720f.png)


<a id="#04_eventbridge"></a>
# 構築手順 - Amazon EventBridge

最後にEventBridgeの設定をします。
EventBridge > ルール > ルールを作成 をクリックします
![FireShot Capture 030 - Amazon EventBridge - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/ec75fd2d-9693-1053-ee6f-c5d1a90dbda3.png)

ページ下部の「イベントパターン」で以下を選択します
AWSのサービス：EC2
イベントタイプ：EC2 Instance State-change Notification
![FireShot Capture 031 - Amazon EventBridge - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/cb50c36f-7c8f-8971-a8e6-f53df1461828.png)

ターゲットで、先ほど作成したSNSトピックを指定します。
![FireShot Capture 032 - Amazon EventBridge - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/0c2d2262-53fb-654b-6a9f-406227ec4518.png)

そのまま[ルールを作成]をクリックします
![FireShot Capture 033 - Amazon EventBridge - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/3365e6c8-3318-0f89-3adc-2fbbbae614b7.png)

こちらで設定は完了です。



<a id="#05_result"></a>
# Slack通知

実際にインスタンスを停止させてみましょう。
![FireShot Capture 035 - インスタンス - EC2 Management Console - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/98603dbe-f9a2-0c77-654c-b5d4dc704e1e.png)

すると、Slackで停止したことが通知されました。
停止中（STOPPING）の通知も来ていますね。
![スクリーンショット 2023-01-22 22.39.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/d78afec7-d018-98e2-9b67-610ad9dbc495.png)



逆に起動した場合はこのように通知されます。
![スクリーンショット 2023-01-22 22.39.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/8a3c7355-3eaa-f8a9-12d2-7938277ba26b.png)


停止・終了はこんな感じ。
![スクリーンショット 2023-01-23 19.05.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/5a33c7b9-baa8-f917-ad6a-0112d87b9bcb.png)


こちらで、EC2のステータス確認がSlack上でできるようになりました。

<a id="#06_cloudwatch_alarm"></a>
# 追加構成 - AWS CloudWatch

起動/終了だけではなく、CPU使用率もマネージドサービスだけで確認できます。
少し別のサービスが必要となります。その場合構成は以下のようになります。
![構成図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/607b8fd7-1be6-2f70-1857-c951bd32333a.png)

設定したCPU使用率の閾値を超えると、Cloudwatch Alarm がアラートを発砲し
Slackに通知される仕組みです。こちらも構築してきます。

まずは CloudWarch > アラーム > アラームの作成 をクリックし、メトリクスを追加します。
![FireShot Capture 036 - CloudWatch Management Console - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/e50407c1-5a20-ee99-98c0-4546524b0abe.png)

今回は「test-EC2」というインスタンスの、CPU使用率メトリクスを指定してみます。
![FireShot Capture 037 - CloudWatch Management Console - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/e051591a-7320-2ad3-1271-b7761f146c62.png)

アラームの条件設定をしています。
ここでは70%を超えるとアラーム状態となるように設定しています。
![FireShot Capture 038 - CloudWatch Management Console - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/8c3723a5-4abe-6e47-3398-9bb8505f92cf.png)

通知の送信先として、「既存のSNSトピックを選択」を選び、作成したトピックを指定します。
![FireShot Capture 040 - CloudWatch Management Console - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/9275429d-22bb-b1dc-a491-29aba6b835f6.png)

任意のアラーム名をつけ、[次へ]をクリックします。
![FireShot Capture 041 - CloudWatch Management Console - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/7b0bc1c9-4375-76e7-6036-696ecb0aac4e.png)

[アラームの作成] をクリックします。
![FireShot Capture 042 - CloudWatch Management Console - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/137fcdcb-aa65-0693-09cd-0118b4b45e6b.png)

これで完成です。


<a id="#07_result2"></a>
# Slack通知_2

CPU使用率が上がった場合、どのように通知が飛ぶか確認してみます。

以下のようにグラフ付きで投稿されるようになりました。
![スクリーンショット 2023-01-22 22.45.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/fe0d6cb5-7596-01fb-10d0-4cc599e3f130.png)


以上です。AWSのマネージドサービスだけで構築できるので
皆さんもやってみてください。