この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
皆様こんにちは。
今回は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.フロー図
カスタムメトリクスを含むCloudWatchAlarmのアラームの通知を自分のメールアドレスに配信するには上記の図の構成でします。
今回はCLoudwatchAlarm作成までのフローを以下で紹介します。
- EC2起動時にユーザーデータでインストールしたCloudWatchAgentの初期設定をします。
- 収集したメトリクスを利用して、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
起動確認できました。
上記の方法で両方の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"
}
]
アラーム状態になっていることを確認できました。
⑤最後に自分のメールアドレスにアラームのメールが配信されているかの確認をします。
自分のメールアドレスに配信されていることを確認できました。
これで検証を終わります。
6-3.Disk監視アラーム検証
最後に今回作成したディスク使用率を監視するアラームが正常に動作するかの検証をしていきます。
検証のためEC2インスタンスにSSHで接続し、ダミーファイルを作成します。
①EC2にSSHで接続出来たら、以下のコマンドを使用して4GBのダミーファイルを作成します。
dd if=/dev/zero of=4G.dummy bs=1MD count=4000
②しばらく時間を置いた後、マネコンからアラーム状態になっていることを確認します。
確認できました。
③自分のメールアドレスにアラームのメールが配信されているかの確認をします。
確認できました。
④最後に、今回作成したダミーファイルを以下のコマンドで削除します。
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