皆様こんにちは。
今回はCloudFormationを利用して高可用性アーキテクトの構築をしていきます。
この記事ではCloudFormationよりCloudWatchAlarmの作成を行います。
このブログはCloudFormationによるCloudWatchAlarmの作成をする上での知識を記事としてまとめ再確認し、皆様と共有するため作成します。

1.高可用性アーキテクト構築目次

目次はこちら

2.CloudWatchとは

Amazon CloudWatch は、DevOps エンジニア、デベロッパー、サイト信頼性エンジニア (SRE)、IT マネージャー、および製品所有者のために構築されたモニタリング/オブザーバビリティサービスです。CloudWatch は、アプリケーションをモニタリングし、システム全体におけるパフォーマンスの変化に対応して、リソース使用率の最適化を行うためのデータと実用的なインサイトを提供します。CloudWatch は、モニタリングおよびオペレーショナルデータをログ、メトリクス、イベントの形式で収集します。
引用:Amazon CloudWatch

Amazon CloudWatch Metrics

メトリクスはシステムのパフォーマンスに関するデータです。デフォルトで多くのAWSリソース (Amazon EC2、Amazon EBS、Amazon RDS など) の無料のメトリクスを提供しています。
CloudWatch Agentを利用して追加のカスタムメトリクスを発行できます。

Amazon CloudWatch Agent

Amazon EC2から内部システムレベルのメトリクスを収集するためにはCloudWatch Agentをデプロイする必要があります。
オンプレミスサーバーもCloudWatch Agentを利用しシステムレベルのメトリクスを収集することが可能です

Amazon CloudWatch Alarm

CloudWatch メトリクスを監視し、特定のしきい値を超えた場合に 1 つ以上のアクションを実行します。アクションでは、Amazon SNS トピックに通知を送信したり、Amazon EC2 アクション、Amazon EC2 Auto Scaling アクションを実行できます。

今回は構築した高可用性アーキテクトを監視するため、CloudWatchAlarmを利用します。
またEC2から追加のカスタムメトリクスを発行したいため、CloudWatchAgentも利用します。

類似の監視サービスにはDatadog Japanの「Datadog」があげられます。

3.フロー図

file
カスタムメトリクスを含むCloudWatchAlarmのアラームの通知を自分のメールアドレスに配信するには上記の図の構成でします。

今回はCLoudwatchAlarm作成までのフローを以下で紹介します。

  1. EC2起動時にユーザーデータでインストールしたCloudWatchAgentの初期設定をします。
  2. 収集したメトリクスを利用して、CloudWatchAlarmの作成をします。

4.CloudWatch Agent初期設定

CloudWatchAgentはEC2起動時にユーザーデータでインストール済みのため、初期設定から始めます。
SSHでEC2インスタンスに接続して、以下のコマンドでセットアップウィザードを実行します。

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

セットアップウィザードの実行内容は以下のようになります。

  • ウィザード起動
================================================================
= Welcome to the Amazon CloudWatch Agent Configuration Manager =
=                                                              =
= CloudWatch Agent allows you to collect metrics and logs from =
= your host and send them to CloudWatch. Additional CloudWatch =
= charges may apply.                                           =
================================================================
  • どのOSでエージェントを使用する予定ですか?
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:
1

今回はLinuxOSを利用しているので1を選択。

  • EC2またはオンプレミスのホストを使用していますか?
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
1

EC2インスタンスで利用するので1を選択。

  • どのユーザーでエージェントを実行する予定ですか?
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
1

実質的にはroot又はAmazonlinuxのデフォルトユーザーであるec2-userどちらかの選択です。
今回はデフォルトで選択されている1にします。

  • StatsDデーモンを有効にしますか?
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
2

今回はStatsDデーモンは利用しないので2を選択。

  • CollectDからメトリクスを監視しますか?警告:CollectDがインストールされていないと、Agentの起動に失敗します。
Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start
1. yes
2. no
default choice: [1]:
2

CollectDは利用しないので2を選択します。
CollectDをインストールしてない状態で1を選択すると、エラーで起動に失敗します。

  • CPU、メモリなどを監視したいですか?
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1

今回はディスク使用率のカスタムメトリクスを取得したいので1を選択。

  • コアごとのCPUメトリックスを監視したいですか?
Do you want to monitor cpu metrics per core?
1. yes
2. no
default choice: [1]:
2

今回はコアごとのCPUメトリックスを監視する必要はないので2を選択。

  • ec2のディメンション(ImageId, InstanceId, InstanceType, AutoScalingGroupName)が利用可能であれば、すべてのメトリクスに追加しますか?
Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:
1

ディメンションが利用可能であれば追加したいので1を選択。

  • ec2のディメンション(InstanceId)を集約するか?
Do you want to aggregate ec2 dimensions (InstanceId)?
1. yes
2. no
default choice: [1]:
2

今回はメトリクスの集約は必要ないので2を選択。

  • メトリクスを何秒間隔で収集するか?
Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:
4

今回は60秒間隔で十分なのでデフォルトの4を選択。

  • どのようなデフォルトメトリクス設定をご希望ですか?
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
1

今回使用するカスタムメトリクスはBasicで十分取得できるため1を選択。

  • 上記の設定に満足していますか?
Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:
1

問題ないので1を選択。

  • 既存のCloudWatch Log Agentはありますか?
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
2

既存のCloudWatch Log Agentはないので2を選択。

  • ログファイルを監視しますか?
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
2

今回はログファイルを監視する必要はないので2を選択。

  • 設定したものがJSON形式で提示されます。
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        }
                }
        }
}
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.
  • コンフィグをSSMパラメータストアに保存しますか?
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:
2

SSMは利用しないので2を選択。

これでウィザードによる設定は完了です。

次に以下のコマンドを使用して、起動します。

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s

最後に起動できたかの確認のため以下のコマンドを使用します。

systemctl status amazon-cloudwatch-agent.service

起動確認できました。
file

上記の方法で両方のEC2インスタンスに設定し、Agentの設定は完了です。

5.CloudWatch Alarm作成

CloudWatchAlarm構築の全体のソースコードは下記の通りです。
ファイル名「ut-CWA-CF」

AWSTemplateFormatVersion: "2010-09-09"
Resources:
  CloudWatchAlarm1:
  #システムエラー時に通知と復旧を行うアラームを作成
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "ut-AR-1"
      AlarmDescription: "Alarm for monitoring StatusCheckFailed_System"
      ActionsEnabled: true
      AlarmActions: 
      - "arn:aws:automate:ap-northeast-2:ec2:recover"
      - !ImportValue ut-sns-topic-arn
      MetricName: "StatusCheckFailed_System"
      Namespace: "AWS/EC2"
      Statistic: "Maximum"
      Dimensions: 
      - 
        Name: "InstanceId"
        Value: !ImportValue ut-Instance-id-1
      Period: 60
      EvaluationPeriods: 2
      Threshold: 1
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: "ignore"

  CloudWatchAlarm2:
  #システムエラー時に通知と復旧を行うアラームを作成
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "ut-AR-2"
      AlarmDescription: "Alarm for monitoring StatusCheckFailed_System"
      ActionsEnabled: true
      AlarmActions: 
      - "arn:aws:automate:ap-northeast-2:ec2:recover"
      - !ImportValue ut-sns-topic-arn
      MetricName: "StatusCheckFailed_System"
      Namespace: "AWS/EC2"
      Statistic: "Maximum"
      Dimensions: 
      - 
        Name: "InstanceId"
        Value: !ImportValue ut-Instance-id-2
      Period: 60
      EvaluationPeriods: 2
      Threshold: 1
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: "ignore"

  CloudWatchAlarm3:
  #ディスク監視アラーム作成
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "ut-disk-1"
      AlarmDescription: "Alarm for monitoring DiskUsedPercent"
      ActionsEnabled: true
      AlarmActions: 
      - !ImportValue ut-sns-topic-arn
      MetricName: "disk_used_percent"
      Namespace: "CWAgent"
      Statistic: "Average"
      Dimensions: 
      - 
        Name: "path"
        Value: "/"
      - 
        Name: "InstanceId"
        Value: !ImportValue ut-Instance-id-1
      - 
        Name: "ImageId"
        Value: "ami-0cbec04a61be382d9"
      - 
        Name: "InstanceType"
        Value: "t2.micro"
      - 
        Name: "device"
        Value: "xvda1"
      - 
        Name: "fstype"
        Value: "xfs"
      Period: 300
      EvaluationPeriods: 2
      Threshold: 70
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: "missing"

  CloudWatchAlarm4:
  #ディスク監視アラーム作成
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "ut-disk-2"
      AlarmDescription: "Alarm for monitoring DiskUsedPercent"
      ActionsEnabled: true
      AlarmActions: 
      - !ImportValue ut-sns-topic-arn
      MetricName: "disk_used_percent"
      Namespace: "CWAgent"
      Statistic: "Average"
      Dimensions: 
      - 
        Name: "path"
        Value: "/"
      - 
        Name: "InstanceId"
        Value: !ImportValue ut-Instance-id-2
      - 
        Name: "ImageId"
        Value: "ami-0cbec04a61be382d9"
      - 
        Name: "InstanceType"
        Value: "t2.micro"
      - 
        Name: "device"
        Value: "xvda1"
      - 
        Name: "fstype"
        Value: "xfs"
      Period: 300
      EvaluationPeriods: 2
      Threshold: 70
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: "missing"

  CloudWatchAlarm5:
  #ALB死活監視アラーム作成
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "ut-ALB"
      AlarmDescription: "Alarm for monitoring HealthyHostCount"
      ActionsEnabled: true
      AlarmActions: 
      - !ImportValue ut-sns-topic-arn
      MetricName: "HealthyHostCount"
      Namespace: "AWS/ApplicationELB"
      Statistic: "Minimum"
      Dimensions: 
      - 
        Name: "TargetGroup"
        Value: !ImportValue ut-tgn-fullname
      - 
        Name: "LoadBalancer"
        Value: !ImportValue ut-alb-fullname
      Period: 60
      EvaluationPeriods: 2
      Threshold: 1
      ComparisonOperator: "LessThanOrEqualToThreshold"
      TreatMissingData: "missing"

  CloudWatchAlarm6:
  #EC2死活監視アラーム作成
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "ut-ec2-1"
      AlarmDescription: "Alarm for monitoring StatusCheckFailed"
      ActionsEnabled: true
      AlarmActions: 
      - !ImportValue ut-sns-topic-arn
      MetricName: "StatusCheckFailed"
      Namespace: "AWS/EC2"
      Statistic: "Maximum"
      Dimensions: 
      - 
        Name: "InstanceId"
        Value: !ImportValue ut-Instance-id-1
      Period: 60
      EvaluationPeriods: 2
      Threshold: 1
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: "missing"

  CloudWatchAlarm7:
  #EC2死活監視アラーム作成
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "ut-ec2-2"
      AlarmDescription: "Alarm for monitoring StatusCheckFailed"
      ActionsEnabled: true
      AlarmActions: 
      - !ImportValue ut-sns-topic-arn
      MetricName: "StatusCheckFailed"
      Namespace: "AWS/EC2"
      Statistic: "Maximum"
      Dimensions: 
      - 
        Name: "InstanceId"
        Value: !ImportValue ut-Instance-id-2
      Period: 60
      EvaluationPeriods: 2
      Threshold: 1
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: "missing"

今回作成するそれぞれのアラームについての説明をしていきます。

5-1.CloudWatchAlarm(オートリカバリー)作成

まずシステムエラー時に通知と復旧を行うアラームを作成します。
オートリカバリーのアラーム作成のソースコードは下記の通りです。

CloudWatchAlarm1:
  #システムエラー時に通知と復旧を行うアラームを作成
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "ut-AR-1"
      AlarmDescription: "Alarm for monitoring StatusCheckFailed_System"
      ActionsEnabled: true
      AlarmActions: 
      - "arn:aws:automate:ap-northeast-2:ec2:recover"
      - !ImportValue ut-sns-topic-arn
      MetricName: "StatusCheckFailed_System"
      Namespace: "AWS/EC2"
      Statistic: "Maximum"
      Dimensions: 
      - 
        Name: "InstanceId"
        Value: !ImportValue ut-Instance-id-1
      Period: 60
      EvaluationPeriods: 2
      Threshold: 1
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: "ignore"

  CloudWatchAlarm2:
  #システムエラー時に通知と復旧を行うアラームを作成
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "ut-AR-2"
      AlarmDescription: "Alarm for monitoring StatusCheckFailed_System"
      ActionsEnabled: true
      AlarmActions: 
      - "arn:aws:automate:ap-northeast-2:ec2:recover"
      - !ImportValue ut-sns-topic-arn
      MetricName: "StatusCheckFailed_System"
      Namespace: "AWS/EC2"
      Statistic: "Maximum"
      Dimensions: 
      - 
        Name: "InstanceId"
        Value: !ImportValue ut-Instance-id-2
      Period: 60
      EvaluationPeriods: 2
      Threshold: 1
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: "ignore"

設定項目は下記の通りです。

使用するオプション 設定値 説明
AlarmName ut-AR-1
ut-AR-2
アラーム名を指定します
AlarmDescription "Alarm for monitoring StatusCheckFailed_System" アラームの説明を入力
ActionsEnabled true アクションを有効化
AlarmActions arn:aws:automate:ap-northeast-2:ec2:recover
!ImportValue ut-sns-topic-arn
通知と復旧のアクションを指定
MetricName StatusCheckFailed_System 監視するメトリクスを指定
Namespace AWS/EC2 監視するサービスの名前空間を指定
Statistic Maximum 統計に最大を指定
Dimensions Name: "InstanceId"
Value: !ImportValue ut-Instance-id-1,2
インスタンスIDを指定
Period 60 迅速なオートリカバリーを考慮し最小値
EvaluationPeriods 2 2回データポイントが越えた時アラーム状態にする
Threshold 1 1以上でエラー状態とするため
ComparisonOperator GreaterThanOrEqualToThreshold 1以上でエラー状態とするため
TreatMissingData ignore アラーム後のデータ欠落時はなんらかのエラーが起きていることが予想されるため

これでCloudWatchAlarm(オートリカバリー)作成のソースコードの説明は以上です。

5-2.ディスク監視アラーム作成

次はEBSのディスク使用率が70%以上の時にメールで通知してくれるアラームを作成します。
ディスク監視のアラーム作成のソースコードは下記の通りです。

  CloudWatchAlarm3:
  #ディスク監視アラーム作成
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "ut-disk-1"
      AlarmDescription: "Alarm for monitoring DiskUsedPercent"
      ActionsEnabled: true
      AlarmActions: 
      - !ImportValue ut-sns-topic-arn
      MetricName: "disk_used_percent"
      Namespace: "CWAgent"
      Statistic: "Average"
      Dimensions: 
      - 
        Name: "path"
        Value: "/"
      - 
        Name: "InstanceId"
        Value: !ImportValue ut-Instance-id-1
      - 
        Name: "ImageId"
        Value: "ami-0cbec04a61be382d9"
      - 
        Name: "InstanceType"
        Value: "t2.micro"
      - 
        Name: "device"
        Value: "xvda1"
      - 
        Name: "fstype"
        Value: "xfs"
      Period: 300
      EvaluationPeriods: 2
      Threshold: 70
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: "missing"

  CloudWatchAlarm4:
  #ディスク監視アラーム作成
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "ut-disk-2"
      AlarmDescription: "Alarm for monitoring DiskUsedPercent"
      ActionsEnabled: true
      AlarmActions: 
      - !ImportValue ut-sns-topic-arn
      MetricName: "disk_used_percent"
      Namespace: "CWAgent"
      Statistic: "Average"
      Dimensions: 
      - 
        Name: "path"
        Value: "/"
      - 
        Name: "InstanceId"
        Value: !ImportValue ut-Instance-id-2
      - 
        Name: "ImageId"
        Value: "ami-0cbec04a61be382d9"
      - 
        Name: "InstanceType"
        Value: "t2.micro"
      - 
        Name: "device"
        Value: "xvda1"
      - 
        Name: "fstype"
        Value: "xfs"
      Period: 300
      EvaluationPeriods: 2
      Threshold: 70
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: "missing"

設定項目は下記の通りです。

使用するオプション 設定値 説明
AlarmName ut-disk-1
ut-disk-2
アラーム名を指定します
AlarmDescription "Alarm for monitoring DiskUsedPercent" アラームの説明を入力
ActionsEnabled true アクションを有効化
AlarmActions !ImportValue ut-sns-topic-arn 通知のアクションを指定
MetricName disk_used_percent 監視するメトリクスを指定
Namespace CWAgent 監視するサービスの名前空間を指定
Statistic Average 統計に平均を指定
Dimensions Name=path,Value=/
Name=InstanceId,Value=!ImportValue ut-Instance-id-1,2
Name=ImageId,Value=ami-0fa49cc9dc8d62c84
Name=InstanceType,Value=t2.micro
Name=device,Value=xvda1
Name=fstype,Value=xfs
ディスクのパス、
インスタンスの情報(Type,Id,AmiId)、
Volumeの情報(device,fstype)を入力しています
AmiIdはソウルリージョンのAmazonLinux2を指定しています
Period 300 緊急性がないのでデフォルト値
EvaluationPeriods 2 2回データポイントが越えた時アラーム状態にする
Threshold 70 70%以上でエラー状態とするため
ComparisonOperator GreaterThanOrEqualToThreshold 70%以上でエラー状態とするため
TreatMissingData missing データ欠落時はデータが欠落していると表示されても問題ないため

これでディスク監視アラーム作成のソースコードの説明は以上です。

5-3.ALB死活監視アラーム作成

ALBの分散対象のEC2が正常かどうかを監視するアラームを作成します。
ALB死活監視のアラーム作成のソースコードは下記の通りです。

  CloudWatchAlarm5:
  #ALB死活監視アラーム作成
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "ut-ALB"
      AlarmDescription: "Alarm for monitoring HealthyHostCount"
      ActionsEnabled: true
      AlarmActions: 
      - !ImportValue ut-sns-topic-arn
      MetricName: "HealthyHostCount"
      Namespace: "AWS/ApplicationELB"
      Statistic: "Minimum"
      Dimensions: 
      - 
        Name: "TargetGroup"
        Value: !ImportValue ut-tgn-fullname
      - 
        Name: "LoadBalancer"
        Value: !ImportValue ut-alb-fullname
      Period: 60
      EvaluationPeriods: 2
      Threshold: 1
      ComparisonOperator: "LessThanOrEqualToThreshold"
      TreatMissingData: "missing"

設定項目は下記の通りです。

使用するオプション 設定値 説明
AlarmName ut-ALB アラーム名を指定します
AlarmDescription "Alarm for monitoring HealthyHostCount" アラームの説明を入力
ActionsEnabled true アクションを有効化
AlarmActions !ImportValue ut-sns-topic-arn 通知のアクションを指定
MetricName HealthyHostCount 監視するメトリクスを指定
Namespace AWS/ApplicationELB 監視するサービスの名前空間を指定
Statistic Minimum 統計に最小を指定
Dimensions Name: "TargetGroup"
Value: !ImportValue ut-tgn-fullname
Name: "LoadBalancer"
Value: !ImportValue ut-alb-fullname
ターゲットグループとロードバランサの情報を指定
Period 60 迅速な復旧のため最小値とする
EvaluationPeriods 2 2回データポイントが越えた時アラーム状態にする
Threshold 1 1以下でエラー状態とするため
ComparisonOperator LessThanOrEqualToThreshold 1以下でエラー状態とするため
TreatMissingData missing データ欠落時はデータが欠落していると表示されても問題ないため

これでALB死活監視アラーム作成のソースコードの説明は以上です。

5-4.EC2死活監視アラーム作成

最後にEC2が問題なく動作しているか監視するアラームを作成しましょう。
EC2死活監視アラーム作成のソースコードは下記の通りです。

  CloudWatchAlarm6:
  #EC2死活監視アラーム作成
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "ut-ec2-1"
      AlarmDescription: "Alarm for monitoring StatusCheckFailed"
      ActionsEnabled: true
      AlarmActions: 
      - !ImportValue ut-sns-topic-arn
      MetricName: "StatusCheckFailed"
      Namespace: "AWS/EC2"
      Statistic: "Maximum"
      Dimensions: 
      - 
        Name: "InstanceId"
        Value: !ImportValue ut-Instance-id-1
      Period: 60
      EvaluationPeriods: 2
      Threshold: 1
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: "missing"

  CloudWatchAlarm7:
  #EC2死活監視アラーム作成
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "ut-ec2-2"
      AlarmDescription: "Alarm for monitoring StatusCheckFailed"
      ActionsEnabled: true
      AlarmActions: 
      - !ImportValue ut-sns-topic-arn
      MetricName: "StatusCheckFailed"
      Namespace: "AWS/EC2"
      Statistic: "Maximum"
      Dimensions: 
      - 
        Name: "InstanceId"
        Value: !ImportValue ut-Instance-id-2
      Period: 60
      EvaluationPeriods: 2
      Threshold: 1
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: "missing"

設定項目は下記の通りです。

使用するオプション 設定値 説明
AlarmName ut-ec2-1
ut-ec2-2
アラーム名を指定します
AlarmDescription "Alarm for monitoring StatusCheckFailed" アラームの説明を入力
ActionsEnabled true アクションを有効化
AlarmActions !ImportValue ut-sns-topic-arn 通知のアクションを指定
MetricName StatusCheckFailed 監視するメトリクスを指定
Namespace AWS/EC2 監視するサービスの名前空間を指定
Statistic Maximum 統計に最大を指定
Dimensions Name: "InstanceId"
Value: !ImportValue ut-Instance-id-1,2
インスタンスIDを指定
Period 60 迅速なオートリカバリーを考慮し最小値
EvaluationPeriods 2 2回データポイントが越えた時アラーム状態にする
Threshold 1 1以上でエラー状態とするため
ComparisonOperator GreaterThanOrEqualToThreshold 1以上でエラー状態とするため
TreatMissingData missing データ欠落時はデータが欠落していると表示されても問題ないため

これでEC2死活監視アラーム作成のソースコードの説明は以上です。

6.検証

スタック作成までできたら今回設定したCloudwatchAgentとCloudwatchAlarm、前回設定したSNSが正常に機能するかの検証を行います。

6-1.CloudWatchAgent起動確認

検証はCloudWatchAgentを設定した2つのEC2にSSHで接続してCloudWatchAgentが起動しているかの確認を行います。

2つのEC2にSSHで接続して以下のコマンドでCloudWatchAgentの起動を確認します。

systemctl status amazon-cloudwatch-agent.service

出力

[ec2-user@ip-10-0-1-10 ~]$ systemctl status amazon-cloudwatch-agent.service
● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
   Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2022-06-02 02:39:29 UTC; 13min ago
-----
[ec2-user@ip-10-0-2-20 ~]$ systemctl status amazon-cloudwatch-agent.service
● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
   Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2022-06-02 02:39:44 UTC; 14min ago

両方のEC2でCloudWatchAgentの起動を確認できました。

6-2.CloudWatchAlarm、SNS動作検証

検証は二つのEC2の片方を停止してHealthyHostCountの値が1になった際、それを監視しているアラームがSNSにアラーム状態になったことのメールを通知し、SNSを通じてエンドポイントである私のメールアドレスに配信されるかで機能確認します。

①まず最初に現在のアラームの状態を以下のコマンドで確認します。

aws cloudwatch describe-alarms `
    --alarm-names "ut-ALB" `
    --query "MetricAlarms[*].{AlarmName:AlarmName,StateValue:StateValue}"

出力

[
    {
        "AlarmName": "ut-ALB",
        "StateValue": "OK"
    }
]

OK状態であることが確認できました。

②二つあるEC2インスタンスの片方を以下のコマンドで停止させます。

aws ec2 stop-instances --instance-ids [instance_id]

出力

{
    "StoppingInstances": [
        {
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "InstanceId": "i-02bf73f895701498e",
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}

③停止できたか、以下のコマンドを使用して確認します。

aws ec2 describe-instances `
    --instance-ids i-02bf73f895701498e `
    --query "Reservations[].Instances[].[Tags[].{Name:Value},State.{InstanceStatus:Name}]"

出力

[
    [
        [
            {
                "Name": "ut-wordpress-2"
            }
        ],
        {
            "InstanceStatus": "stopped"
        }
    ]
]

停止を確認できました。

④数分時間を置き、以下のコマンドでアラームの状態を再度確認します。

aws cloudwatch describe-alarms `
    --alarm-names "ut-ALB" `
    --query "MetricAlarms[*].{AlarmName:AlarmName,StateValue:StateValue}"

出力

[
    {
        "AlarmName": "ut-ALB",
        "StateValue": "ALARM"
    }
]

アラーム状態になっていることを確認できました。

⑤最後に自分のメールアドレスにアラームのメールが配信されているかの確認をします。

file

自分のメールアドレスに配信されていることを確認できました。

これで検証を終わります。

6-3.Disk監視アラーム検証

最後に今回作成したディスク使用率を監視するアラームが正常に動作するかの検証をしていきます。

検証のためEC2インスタンスにSSHで接続し、ダミーファイルを作成します。

①EC2にSSHで接続出来たら、以下のコマンドを使用して4GBのダミーファイルを作成します。

dd if=/dev/zero of=4G.dummy bs=1MD count=4000

②しばらく時間を置いた後、マネコンからアラーム状態になっていることを確認します。
file
確認できました。

③自分のメールアドレスにアラームのメールが配信されているかの確認をします。
file
確認できました。

④最後に、今回作成したダミーファイルを以下のコマンドで削除します。

rm 4G.dummy

これで検証を終わります。

7.感想

CloudWatchAlarmの作成はオプションが多く大変でしたが良い経験になりました。
次回もよろしくお願いします。

8.参照

AWS CloudFormation – AWS::CloudWatch::Alarm
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-cw-alarm.html

Last modified: 2022-06-22

Author