Amazon RDS for PostgreSQL の空き容量を CloudWatch Alarm で監視してみた

2022.03.16

こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。

CloudWatch Alarmを利用すると、サービスのメトリクスに設定したしきい値に応じて通知を受け取ることができます。

たとえば「RDSの空き容量が指定の値を下回ったときに通知する」などを実現することができます。先日、別のエントリで「Amazon RDS for PostgreSQL の空き容量を確認する」というメトリクスを作成したのですが、これを利用してCloudWatch Alarmの作成を行ってみたいと思います。

やりたいこと

今回は「Amazon RDS for PostgreSQL の空き容量が指定の値を下回ったときに通知する」ということをやってみたいと思います。

要件としては以下のような感じです。

  • とある Amazon RDS for PostgreSQL の1インスタンスを対象とする
  • 空き容量の変化はとても緩やかなので、1日〜2日ぐらいの間隔で検出できればよい
  • 空き容量がだいたい1GBを下回ったら通知がほしい
  • 既に通知用のSNSトピックは用意されているので、このSNSトピック(に登録されているメールアドレス)に通知したい

なお、今回は1つのアラームしか作成していませんが、本番環境では以下のナレッジでも紹介されているように「よりしきい値の低い2つ目の重大アラームを作成する」ということは重要だと思います。(クリティカルな状態を検出するためのアラーム)

アラームを作成してみた

では、アラームを作成していきます。

メトリクスの選択

先日以下のエントリで作成したメトリクスがあるので、このメトリクスを流用します。

このメトリクスの「グラフ化したメトリクス」タブにおける「アクション」にアラームアイコンがあり、こちらをクリックすると作成済みのメトリクスをもとにアラームを作成できます。

今回はこちらをクリックしてアラームを作成します。

メトリクスと条件の指定

まずは「メトリクス」の指定をします。今回は先程選択したメトリクスがそのまま表示されているので基本的には変更しません。

「統計」については空き容量の低下を検出したいという想いがあるので「平均」ではなく「最小」に変更しました。

「期間」は「1日」なのでだいぶ長いのですが、今回はこのままでOKとします。本番環境などではおそらく「5分」など短い期間に設定することが多いと思います。

この「期間」の意味は「メトリクスを評価する期間」となっており、今回の例だと「1日あたり1回の評価」となります。少しややこしいのですが、この評価は後述する「データポイント」1つになります。

次に「条件」の指定をします。

今回は「空き容量がだいたい1GBを下回ったら通知がほしい」という要件から以下のような条件としています。なお、数値の単位は「バイト」なので厳密には「1,000,000,000バイト」ではなく「1024 * 1024 * 1024 = 1,073,741,824バイト」ですが、わかりやすくするために変えています。

また「アラームを実行するデータポイント」は「1/1」としました。ここが個人的に一番理解が難しいと思うところです。

今回の例も含めて、イメージをしやすいようにいくつかパターンをまとめてみます。

期間 データポイント どれくらいの範囲での評価 どのように評価するか
1日 1/1 直近1日 1日のうちに1度でもしきい値を下回ったら検知
1日 3/3 直近3日 すべての日でしきい値を下回ったことがあったら検知
1日 2/3 直近3日 いずれか2日において、しきい値を下回ったことがあったら検知

この「アラームの評価」については以下の公式ドキュメントにも記載されています。

アクションの設定

「アクションの設定」では、先程設定した条件で検出がなされたときのアクションを定義します。

まずは「通知」の設定です。

今回は「空き容量がだいたい1GBを下回ったら通知がほしい」という要件なので「アラーム状態」になったらSNSトピックに通知をするように設定します。また、SNSトピックは今回は既存のトピックを利用します。

トピックを選択すると、トピックに設定したEメールアドレスが表示されて便利ですね。

この他にも「Auto Scaling アクション」、「EC2 アクション」、「Systems Manager アクション」を設定できますが、今回は利用しません。

名前と説明を追加

ここではアラームの名前と説明を設定します。

適宜、適切なものを設定して次へ進みます。

プレビューと作成

最後に設定内容をプレビュー確認します。

問題なければ画面下部の「アラームの作成」でアラームが作成されます。

アラーム通知を試してみる

では、実際にどのようなアラーム通知が来るかを試してみたいと思います。

が、今回設定した条件だとすぐには通知が来ないので、テストとして「期間」を「1分」、「しきい値」を「5GB 以下」に変更して試してみました。

設定後に検出されると以下のようにメール通知が届きました!

なお、通知内容としては以下のような内容となっています。

You are receiving this email because your Amazon CloudWatch Alarm "RDS-foo-bar-FreeStorageSpace-Alarm" in the Asia Pacific (Tokyo) region has entered the ALARM state, because "Threshold Crossed: 1 out of the last 1 datapoints [4.17456128E9 (15/03/22 02:14:00)] was less than or equal to the threshold (5.0E9) (minimum 1 datapoint for OK -> ALARM transition)." at "Tuesday 15 March, 2022 02:15:18 UTC".

View this alarm in the AWS Management Console:
https://ap-northeast-1.console.aws.amazon.com/cloudwatch/deeplink.js?region=ap-northeast-1#alarmsV2:alarm/RDS-foo-bar-FreeStorageSpace-Alarm

Alarm Details:
- Name: RDS-foo-bar-FreeStorageSpace-Alarm
- Description:
- State Change: OK -> ALARM
- Reason for State Change: Threshold Crossed: 1 out of the last 1 datapoints [4.17456128E9 (15/03/22 02:14:00)] was less than or equal to the threshold (5.0E9) (minimum 1 datapoint for OK -> ALARM transition).
- Timestamp: Tuesday 15 March, 2022 02:15:18 UTC
- AWS Account: XXXXXXXXXXXX
- Alarm Arn: arn:aws:cloudwatch:ap-northeast-1:XXXXXXXXXXXX:alarm:RDS-foo-bar-FreeStorageSpace-Alarm

Threshold:
- The alarm is in the ALARM state when the metric is LessThanOrEqualToThreshold 5.0E9 for at least 1 of the last 1 period(s) of 60 seconds.

Monitored Metric:
- MetricNamespace: AWS/RDS
- MetricName: FreeStorageSpace
- Dimensions: [DBInstanceIdentifier = XXXXXXXXXXXX]
- Period: 60 seconds
- Statistic: Minimum
- Unit: not specified
- TreatMissingData: missing


State Change Actions:
- OK:
- ALARM: [arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:cm-ootaka-daisuke-sandbox]
- INSUFFICIENT_DATA:

おまけ

以上で通知をさせることはできましたが、メール通知だと文字ばかりなので通知内容が少し分かりづらい面もあるかと思います。

もしSlackが利用可能な場合には、以下のエントリにあるようにAWS Chatbotと組み合わせてSlackに通知してあげると通知内容がパッと見て分かるので、こちらのほうが分かりやすいですね。

まとめ

以上、Amazon RDS for PostgreSQL の空き容量を CloudWatch Alarm で監視してみました。

データポイントの考え方が少し難しいですが、そこを理解してしまえば簡単に設定できるかなと思いました。異常検知を行いたい場合にとても便利なサービスなので活用していきたいですね。

どなたかのお役に立てば幸いです。それでは!