Amazon Eventbridge scheduleを使ったCloudWatchアラームの自動停止/起動


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

こんにちは、西海です。
今回、Amazon Eventbridge scheduleを使用して一定時間帯でCloudWatchアラームを無効化するシステムを構築・検証しました。

目的

Apacheの動作プロセスを監視して、しきい値を下回った際にアラームを発報させます。
さらにAmazon EventBridge Schedulerを使用して、毎日朝4時~5時にCloudWatchアラームを自動停止/自動起動させるシステムを構築します。
アラームを停止させたい理由として、実際の運用現場においてその時間帯にメンテナンス作業などを実施することを想定しています。

〇動作イメージ図

要件

今回構築するシステムの要件は以下になります。
要件1:amazon linux 2023 にApacheをインストールして、そのプロセス監視のアラーム作成。
要件2:メトリクス名 procstat_lookup_pid_count =0の場合、SNSを使って、メール送信する。
要件3:毎日4:00~5:00の間が監視不要なので、Amazon EventBridge Schedulerより CloudWatch アラームを無効化するスケジュールを作成する。

※要件3については動作確認をしやすくするため、今回は別の時間を指定して構築します。

検証環境構築

検証環境構内容

今回、下記のような構成でシステムを構築し検証しました。

大まかな手順として、下記の3段階で実施しました。
1.EC2作成~CloudWatch設定まで
2.アラーム作成~SNS送信設定まで
3.スケジュール作成~動作検証

次の段落から詳細な構築手順となります。

IAMロールを作成

EC2インスタンス用にCloudwatchとAWS Systems Managerのアクセスポリシーを持ったIAMロールを作成します。
ユースケースでEC2を選択後、下記のポリシーを追加して作成します。

・CloudWatchAgentServerPolicy
・AmazonSSMFullAccess

EC2インスタンスの作成

インスタンスを作成します。設定は以下の通りです。

OS:Amazon Linux 2023
インスタンスタイプ:t2.micro
セキュリティグループ:22/tcpを許可(デフォルト)
IAMロール:先ほど作成したロール

その他の設定はすべてデフォルトで設定します。

Apache,CloudWatchエージェントのインストール

作成したインスタンスにSSHで接続後、ApacheとCloudWatchエージェントをインストールします。
〇Apacheのインストール
下記コマンドでApacheをインストールします。
sudo yum install -y httpd
Completeと表示されたら正常にインストール完了です。

〇CloudWatchエージェントのインストール
下記コマンドでCloudWatchエージェントをインストールします。
sudo yum install amazon-cloudwatch-agent
途中yes/noを聞かれますので、「yes」を入力します。
こちらもCompleteと表示されたら正常にインストール完了です。

CloudWatchエージェントの設定ファイルを作成

AWS Systems Managerのパラメータストア機能を使用して、CloudWatchエージェント用の設定ファイルを作成します。
Systems Manager画面からパラメータストアタブに移動後、パラメータの作成を押します。

各設定値を以下のように設定します。

名前:「AmazonCloudWatch-」から始まる任意の名前
利用枠:標準
タイプ:文字列
データ型:text
値:(下記を入力)

{
    "metrics": {
        "metrics_collected": {
            "procstat": [
                {
                    "exe": "httpd",
                    "measurement": [
                        "pid_count"
                    ]
                }
            ]
        }
    }
}

設定が完了したら、「パラメータの作成」ボタンを押して作成を完了させます。

AWS Systems Managerを使用して設定ファイルを展開

AWS Systems ManagerのRunCommand機能を使用して先ほど作成したパラメータをEC2内のCloudWatchエージェントに展開します。
RunCommandタブから画面に移動し、RunCommandボタンを押します。

各設定値を下記のように設定します。

コマンドドキュメント:AmazonCloudWatch-ManageAgent
ドキュメントのバージョン:デフォルト
アクション:構成
モード:ec2
オプションの構成ソース:ssm
オプションの構成場所:先ほど作成したパラメータの名前
オプションの再起動:はい
ターゲット:「インスタンスを手動で選択する」にし、作成したインスタンを選択する。ターゲット:「インスタンスを手動で選択する」にし、作成したインスタンを選択する。

他の設定はデフォルトのまま、実行ボタンを押します。
画面遷移後、ステータスが「成功」になっていれば正常に処理が完了しています。

動作確認

下記コマンドでApacheを起動します。
sudo systemctl start httpd

下記コマンドでApacheが起動したことを確認します。
ps -aux | grep httpd
もしくは、下記コマンドでも確認できます。
sudo systemctl status httpd

次に、Cloudwatchコンソールで実際にメトリクスが取得できているかを確認します。
すべてのメトリクスから「CWAgent」を選択します。

次に「exe,host,pid_finder」を選択します。

メトリクス内に表示されたhttpdにチェックを入れ、グラフが表示されることを確認します。
グラフが正常に表示されれば、Cloudwatchでメトリクスが正常に取得されています。

以上で検証環境が作成できました。

CloudWatchアラームの構築

次にCloudWatchを使用して、下記要件を満たした際にアラームが発報しSNSが発信されるようにします。

要件2:メトリクス名 procstat_lookup_pid_count =0の場合、SNSを使って、メール送信する。

Apacheの監視アラームを作成

Cloudwatch画面のアラーム状態タブから遷移し、「アラームの作成」を押します。

監視するメトリクスを選択します。「メトリクスの選択」ボタンを押した後に対象となるメトリクスを選択します。

条件は要件2を満たすために下記のように設定します。

また、アラームが発報した際にSNS機能を使用してメールを受け取れるよう設定します。

トピックを作成すると、設定したメールアドレス宛にサブスクリプション有効化のメールが届きますので、リンクをクリックして有効化してください。

他の設定値はデフォルトのままとして最後に「アラームの作成」ボタンを押します。

動作確認

作成したアラームが正常に動作するか確認します。
下記コマンドでApacheを停止します。
sudo systemctl stop httpd
また、下記コマンドでapacheのステータスを確認します。「dead」の表示があれば正常に停止しています。
sudo systemctl status httpd

上記コマンドでApache停止後、Cloudwatchアラームが発報するか確認します。
作成したアラームの履歴画面を確認すると、正常にアラーム状態へ更新されたことを確認できます。

また、設定したメールアドレス宛にメールが届きました。

以上で、Cloudwatchアラーム環境が構築できました。

EventBridge Schedulerの設定

次に、AWS EventBridge Schedulerを使用して下記要件を満たした際にアラームを自動停止・自動起動するスケジュールを作成します。

要件3:毎日4:00~5:00の間が監視不要なので、Amazon EventBridge Schedulerより CloudWatch アラームを無効化するスケジュールを作成する

ただし、今回の構築では動作確認のしやすやを考慮して、別の任意の時間帯でスケジュールを作成します。

IAMロールの作成

Amazon EventBridge Schedulerで利用するIAMロールを作成します。
IAMロール作成画面で「カスタム信頼ポリシー」を選択後、下記を入力します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "scheduler.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Cloudwatchへのアクセスを可能にするために、下記ポリシーを追加します。

CloudwatchfullaccessV2

「ロールの作成」ボタンを押して作成します。

EventBridgeスケジュールの作成

Amazon EventBridge SchedulerからCloudwatchアラームを自動停止・自動起動するスケジュールを作成します。

停止スケジュール作成

EventBridge画面のスケジュールタブから「スケジュールを作成」を押します。

今回は毎日定時にスケジュールされた操作を行いたいので、下記のようにパターンを設定します。
※今回は毎日15時にスケジュールが起動するように設定しました。

指定した時刻にスケジューラを呼び出したいので、フレックスタイムウィンドウは「オフ」にします。

また、タイムゾーンは今回「Asia/Tokyo」を選択します。

ターゲットの設定として、「すべてのAPI」を選択後に「CloudWatch」を検索し選択します。

その後、「DisableAlarmActions」を検索し選択します。
選択後に画面下部に入力画面が表示されるので、自分で作成したアラームの名前を入力します。

今回のスケジュールは毎日実行させるので、スケジュール完了後のアクションは「NONE」を選択します。
アクセス許可の箇所では先ほど作成したIAMロールを選択します。

他の設定はデフォルトのまま、「スケジュールの作成」ボタンを押します。
作成されたスケジュールのステータスが「有効」になっていれば正常に作成されています。

以上で、停止スケジュールが作成されました。

起動スケジュール作成

基本的には停止スケジュールの作成と同じです。
スケジュールパターンの設定で自動起動させる時間を設定します。
ターゲットの選択画面では「EnableAlarmActions」を検索し選択します。

また、今回は毎日16時にスケジュールが起動するように設定しました。

動作確認

作成したスケジュールが指定した時刻に正常に動作しているか確認します。
作成したCloudWatchアラームの履歴タブを確認すると、指定した時刻にアラームが無効化し、その後有効化されていることを確認できます。

まとめ

実際に業務で使用されるようなシステムを構築でき、とても勉強になりました。
また、Apacheプロセスの監視については下記ブログも参考にしました。
〇ApacheとTomcatプロセス監視
https://cloud5.jp/apache-tomcat-process-monitoring/

Last modified: 2023-10-16

Author