【AWS】EFSのクライアント接続数をCloudWatch Alarmで監視する

cloudwatchアイキャッチ画像

はじめに

EFSを利用している環境で、EFSにクライアントが接続されているかを監視したいという要件がありました。

今回の環境では、EFSへのクライアント接続数は基本的に1台です。

そのため、以下の要件でCloudWatch Alarmを作成しました。

  • EFSクライアント接続数を監視
  • 基本の接続数は1
  • 一時的に2になる可能性あり
  • 接続数が0になった場合にALARM
  • ALARM時のみSNS通知
  • OK状態への復旧通知は不要
  • CloudFormationでAlarmを構築

今回は、CloudFormationでEFSのクライアント接続数監視用CloudWatch Alarmを作成する方法を紹介します。

EFSのクライアント接続数を確認する

まず、監視対象のEFSを確認します。

EFSコンソールからファイルシステムを確認できます。

CloudWatchでEFSのメトリクスを監視する場合、AWS/EFS 名前空間の ClientConnections メトリクスを利用できます。

ClientConnections は、ファイルシステムへのクライアント接続数を表すメトリクスです。

標準クライアントを使用する場合、マウントされたEC2インスタンスごとに1接続として扱われます。ClientConnections は FileSystemId ディメンションを使用し、利用可能な統計は Sum です。

今回のように「接続数が0になったことを検知したい」という要件では、ClientConnections をCloudWatch Alarmの監視対象としました。

CloudFormationのパラメータ

今回は、デプロイ時に以下の2つをパラメータとして指定できるようにしました。

  • EFS File System ID
  • SNS Topic ARN

CloudFormationのデプロイ画面では、以下のように入力します。

EFS File System IDは、EFSコンソールから確認できます。

CloudFormationテンプレート

以下が今回作成したCloudFormationテンプレートです。

AWSTemplateFormatVersion: '2010-09-09'

Description: >
  CloudFormation template for monitoring EFS client connections
  with a CloudWatch Alarm.

Parameters:
  # 監視対象のEFSファイルシステムID
  # パラメータ指定がない場合は、以下のEFS IDをデフォルト値として使用する
  EfsFileSystemId:
    Type: String
    Default: fs-xxxxxxxxxxxxxxxxx
    Description: EFS File System ID

  # CloudWatch Alarm通知先のSNS Topic ARN
  # パラメータ指定がない場合は、以下のARNをデフォルト値として使用する
  AlarmTopicArn:
    Type: String
    Default: arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:xxxxx-sns
    Description: SNS Topic ARN for CloudWatch Alarm notifications

Resources:
  # EFSクライアント接続数監視用CloudWatch Alarm
  #
  # EFSへのクライアント接続数が0となった場合に
  # ALARM状態とする
  EfsClientConnectionsAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      # EFSクライアント接続数が1未満となった場合にALARM
      AlarmDescription: >
        EFS client connections are less than 1.

      # EFSのClientConnectionsメトリクスを監視
      Namespace: AWS/EFS
      MetricName: ClientConnections

      # 監視対象のEFSファイルシステム
      Dimensions:
        - Name: FileSystemId
          Value: !Ref EfsFileSystemId

      # 1分間のクライアント接続数を合計して評価
      Statistic: Sum
      Period: 60

      # 1回の評価でALARM判定
      EvaluationPeriods: 1

      # クライアント接続数が1未満(0)となった場合にALARM
      Threshold: 1
      ComparisonOperator: LessThanThreshold

      # メトリクス欠損時は異常として扱う
      TreatMissingData: breaching

      # ALARM状態への遷移時のみSNS通知
      # OK状態への遷移時は通知しない
      AlarmActions:
        - !Ref AlarmTopicArn

ClientConnectionsの監視条件

今回のポイントは、以下の設定です。

Threshold: 1
ComparisonOperator: LessThanThreshold

LessThanThreshold は、監視値がしきい値を下回った場合に条件成立となります。

そのため、今回の設定では以下のような判定になります。

ClientConnectionsAlarm状態
0ALARM
1OK
2OK

今回の環境では、基本的な接続数は1ですが、一時的に2台となる可能性があります

そのため、LessThanOrEqualToThreshold ではなく、LessThanThreshold を指定しました。

TreatMissingDataについて

今回は以下を設定しています。

TreatMissingData: breaching

TreatMissingData は、CloudWatch Alarmの評価時にメトリクスデータが欠損していた場合の扱いを指定する設定です。

breaching を指定すると、欠損データを異常値として扱います。CloudWatchでは、breachingnotBreachingignoremissing の4種類の扱いを指定できます。

今回は、EFSの接続状態を監視する目的であり、メトリクス欠損も異常として扱いたいと考えたため、breaching を指定しました。

※ TreatMissingData の適切な値は監視対象や運用要件によって変わるため、環境に応じて検討が必要です。

OK通知は設定しない

今回、AlarmにはSNS通知を設定しています。

AlarmActions:
  - !Ref AlarmTopicArn

一方で、OKActions は設定していません。

CloudWatch Alarmでは、AlarmActions はALARM状態への遷移時、OKActions はOK状態への遷移時に実行されます。

今回は、

EFSの接続数が0になった場合に通知したい

という要件でした。

そのため、

接続数 1 → 0
        
      ALARM
        
      SNS通知

という動作にしています。

復旧時に通知が不要だったため、OKActions は設定していません。

障害発生時だけ通知したい場合は、OK通知を設定しないという選択肢もあります。

CloudWatch Alarmの作成結果

CloudFormationをデプロイすると、CloudWatch Alarmが作成されます。

今回は、ClientConnections が1以上のため、Alarm状態は OK となっています。

CloudWatch Alarmのグラフ上でも、ClientConnections の値を確認できます。

まとめ

今回は、EFSのクライアント接続数をCloudWatch Alarmで監視しました。

今回のポイントは以下です。

  • AWS/EFS の ClientConnections メトリクスを利用
  • FileSystemId で監視対象のEFSを指定
  • ClientConnections < 1 でALARM
  • Statistic は Sum
  • 監視間隔は1分
  • ALARM時のみSNS通知
  • OK通知は設定しない
  • CloudFormationでAlarmをコード管理

EFSへの接続が失われた場合に検知したい場合、ClientConnections メトリクスを利用することで比較的シンプルに監視を構築できます。

今回はCloudFormationで作成しましたが、Alarmの設定値をコードとして管理できるため、環境構築時の設定漏れ防止にもつながると感じました。