CloudWatchアラームの設定作業で苦しむ人を減らしたい

# 目次
[1.この記事を書いた経緯](#1-この記事を書いた経緯)
[2.アラーム登録コマンド紹介](#2-アラーム登録コマンド紹介)
　[注意事項](#注意事項)
　[ステータスチェック_システム](#ステータスチェック_システム)
　[ステータスチェック_インスタンス](#ステータスチェック_インスタンス)
　[cpu使用率](#cpu使用率)
　[メモリ使用率_linux](#メモリ使用率_linux)
　[メモリ使用率_windows](#メモリ使用率_windows)
　[ディスク使用率_linux](#ディスク使用率_linux)
　[ディスク残量_windows](#ディスク残量_windows)
[3.作業実施後](#3-作業実施後)

# 1. この記事を書いた経緯
CloudWatchアラーム(以降CWアラームと表記)はシステムの保守・運用に不可欠な存在ですが、AWSマネジメントコンソールから登録するためには
　①監視対象のメトリクスを選ぶ
　②アラート条件を設定
　③アクションを設定
　④アラーム名を設定
と大まかに4つの作業を実施する必要があります。

私が参加していたプロジェクトではCWアラームの数が50個ほどあったためミスなく設定するために気を遣いまくり、神経を削られておりました。
そこでCWアラーム登録をCloudshellからコマンド実行できるようにしたところ、素早く正確にストレス少なく登録できるようになりました。

今回は私と同じようにしんどい思いをしている人&これからする人の一助になればと思い、CWアラーム登録コマンドの例を記載していきたいと思います。**EC2の特定のメトリクス限定の紹介になってしまいますが**、お役に立てば幸いです。

# 2. アラーム登録コマンド紹介
## 注意事項
+ アラーム共通の設定について
    + 状態がアラーム・OKに変わった際、SNSトピックに登録したメールアドレスに発報する
    + 期間は1分
    + データポイントは1/1(評価期間の中で1個のデータポイントのうち1個が閾値を
      上回った/下回った時に状態遷移する)
    + 取得できないメトリクスは「データ不足」として扱う
    
    　 ※ここら辺の設定は結構適当なので、必要に応じて変えて下さい。
    
+ コマンドに出現する**置換対象は\<>で囲ったものになります**。Excelの文字列結合で置換対象を
  セル参照できるようにしておくと、インスタンスIDなどを簡単に入れ替えられるので楽です。

## ステータスチェック_システム
+ AWSの物理ホストに異常発生を監視するメトリクス
+ 最小値が0を上回った場合アラーム状態に遷移
+ アラーム状態遷移時のアクションとして、メール発報に加えてインスタンスを再起動する
```shell:ステータスチェック_システム
aws cloudwatch put-metric-alarm \
--alarm-name "<アラーム名>" \
--alarm-description "" \
--alarm-actions "<SNSトピックのARN>" "arn:aws:swf:<リージョン>:<アカウントID>:action/actions/AWS_EC2.InstanceId.Reboot/1.0" \
--ok-actions "<SNSトピックのARN>" \
--namespace "AWS/EC2" \
--dimensions "Name=InstanceId,Value=<EC2のインスタンスID>" \
--metric-name "StatusCheckFailed_System" \
--threshold 0.0 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 1 \
--datapoints-to-alarm 1 \
--period 60 \
--statistic "Minimum" \
--treat-missing-data missing
```

```shell:置換後の例
aws cloudwatch put-metric-alarm \
--alarm-name "test1" \
--alarm-description "" \
--alarm-actions "arn:aws:sns:ap-northeast-1:123456789012:cwalarm-test" "arn:aws:swf:ap-northeast-1:123456789012:action/actions/AWS_EC2.InstanceId.Reboot/1.0" \
--ok-actions "arn:aws:sns:ap-northeast-1:123456789012:cwalarm-test" \
--namespace "AWS/EC2" \
--dimensions "Name=InstanceId,Value=i-0f7846263346a65b2" \
--metric-name "StatusCheckFailed_System" \
--threshold 0.0 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 1 \
--datapoints-to-alarm 1 \
--period 60 \
--statistic "Minimum" \
--treat-missing-data missing
```

## ステータスチェック_インスタンス
+ EC2のソフトウェアとネットワークの異常発生を監視するメトリクス
+ メトリクス名以外は、ステータスチェック_システムと同じ設定
```shell:ステータスチェック_インスタンス
aws cloudwatch put-metric-alarm \
--alarm-name "<アラーム名>" \
--alarm-description "" \
--alarm-actions "<SNSトピックのARN>" "arn:aws:swf:<リージョン>:<アカウントID>:action/actions/AWS_EC2.InstanceId.Reboot/1.0" \
--ok-actions "<SNSトピックのARN>" \
--namespace "AWS/EC2" \
--dimensions "Name=InstanceId,Value=<EC2のインスタンスID>" \
--metric-name "StatusCheckFailed_Instance" \
--threshold 0.0 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 1 \
--datapoints-to-alarm 1 \
--period 60 \
--statistic "Minimum" \
--treat-missing-data missing
```

## cpu使用率
+ 最大値が閾値90%を上回った場合アラート状態に遷移
```shell:cpu使用率
aws cloudwatch put-metric-alarm \
--alarm-name "<アラーム名>" \
--alarm-description "" \
--alarm-actions "<SNSトピックのARN>"  \
--ok-actions "<SNSトピックのARN>" \
--namespace "AWS/EC2" \
--dimensions "Name=InstanceId,Value=<EC2のインスタンスID>" \
--metric-name "CPUUtilization" \
--threshold 90.0 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 1 \
--datapoints-to-alarm 1 \
--period 60 \
--statistic Maximum \
--treat-missing-data missing
```
## メモリ使用率_linux
+ 最大値が閾値90%を上回った場合アラート状態に遷移

※ 名前空間はデフォルトで設定されるCWAgentとしております。環境に応じて変えてください
```shell:メモリ使用率_linux
aws cloudwatch put-metric-alarm \
--alarm-name "<アラーム名>" \
--alarm-description "" \
--alarm-actions "<SNSトピックのARN>"  \
--ok-actions "<SNSトピックのARN>" \
--namespace "CWAgent" \
--dimensions "Name=host,Value=<インスタンスのホスト名>" \
--metric-name "mem_used_percent" \
--threshold 90.0 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 1 \
--datapoints-to-alarm 1 \
--period 60 \
--statistic Maximum \
--treat-missing-data missing
```
## メモリ使用率_windows
+ 最大値が閾値90%を上回った場合アラート状態に遷移

```shell:メモリ使用率_windows
aws cloudwatch put-metric-alarm \
--alarm-name "<アラーム名>" \
--alarm-description "" \
--alarm-actions "<SNSトピックのARN>"  \
--ok-actions "<SNSトピックのARN>" \
--namespace "CWAgent" \
--dimensions "Name=host,Value=<インスタンスのホスト名>" "Name=objectname,Value=Memory" \
--metric-name "Memory % Committed Bytes In Use" \
--threshold 90.0 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 1 \
--datapoints-to-alarm 1 \
--period 60 \
--statistic Maximum \
--treat-missing-data missing
```

## ディスク使用率_linux
+ 最大値が閾値90%を上回った場合アラート状態に遷移
+ \<パス名>、\<デバイス名>、\<fstype名>は下記画像のようにメトリクス画面から確認可能
![スクリーンショット 2022-04-16 23.56.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100334/95952019-9f28-70ff-35cf-49f549c3e44f.png)

```shell:ディスク使用率_linux
aws cloudwatch put-metric-alarm \
--alarm-name "<アラーム名>" \
--alarm-description "" \
--alarm-actions "<SNSトピックのARN>"  \
--ok-actions "<SNSトピックのARN>" \
--namespace "CWAgent" \
--dimensions \
  "Name=path,Value=<パス名>" \
  "Name=host,Value=<インスタンスのホスト名>" \
  "Name=device,Value=<デバイス名>" \
  "Name=fstype,Value=<fstype名>" \
--metric-name "disk_used_percent" \
--threshold 90.0 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 1 \
--datapoints-to-alarm 1 \
--period 60 \
--statistic Maximum \
--treat-missing-data missing
```
```shell:置換後の例
aws cloudwatch put-metric-alarm \
--alarm-name "test-disk" \
--alarm-description "" \
--alarm-actions "arn:aws:sns:ap-northeast-1:123456789012:cwalarm-test"  \
--ok-actions "arn:aws:sns:ap-northeast-1:123456789012:cwalarm-test" \
--namespace "CWAgent" \
--dimensions \
  "Name=path,Value=/" \
  "Name=host,Value=cwalarm-test" \
  "Name=device,Value=xvda1" \
  "Name=fstype,Value=xfs" \
--metric-name "disk_used_percent" \
--threshold 90.0 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 1 \
--datapoints-to-alarm 1 \
--period 60 \
--statistic Maximum \
--treat-missing-data missing
```
## ディスク残量_windows
+ 最小値が閾値10%を下回った場合アラート状態に遷移
```shell:ディスク残量_windows
aws cloudwatch put-metric-alarm \
--alarm-name "<アラーム名>" \
--alarm-description "" \
--alarm-actions "<SNSトピックのARN>"  \
--ok-actions "<SNSトピックのARN>" \
--namespace "CWAgent" \
--dimensions \
  "Name=instance,Value=<パス名>" \
  "Name=host,Value=<インスタンスのホスト名>" \
  "Name=objectname,Value=LogicalDisk" \
--metric-name "LogicalDisk % Free Space" \
--threshold 10.0 \
--comparison-operator LessThanThreshold \
--evaluation-periods 1 \
--datapoints-to-alarm 1 \
--period 60 \
--statistic Minimum \
--treat-missing-data missing
```

# 3. 作業実施後
各インスタンスに紐づいていることを確認するため、テストを実施してみてください。
おすすめはClassmethod様の[設定した CloudWatch Alarm をテストする方法](https://dev.classmethod.jp/articles/tsnote-cloudwatch-alarm-test-001/)にあるやり方で、cloudshellからお手軽に実行できます。ただしステータスチェック系に対して実行するとインスタンスが再起動してしまうことにはご注意ください。