Windowsでカスタムメトリクスが表示されない問題を検証してみた

yujiota 2019年9月27日

皆さんこんにちは。クラウドエンジニアの大田です。
残暑いかがお過ごしでしょうか。9月も末になり、すっかり秋の空になりましたね。
季節の変わり目は気候が変化しやすく、体調を崩しがちな時期なので、皆さんもくれぐれもご自愛ください。

さて、今回のテーマは「Windowsでカスタムメトリクスが表示されない問題を検証してみた」です。
本記事の主なゴールは「カスタムメトリクスを取得できないときに疑うべき観点を知っていただくこと」でございます。
実際に弊社で起こった事例をもとにした検証内容をご紹介させていただきたいと思います。


もくじ

  1. 起こっていた問題
  2. カスタムメトリクスとは?
  3. 操作の流れ
  4. AWSに問い合わせたこと
  5. JSONの構文チェック
  6. 検証結果

 

1,起こっていた問題

Windows 2016のAmazon標準AMIで立ち上げたEC2インスタンスからカスタムメトリクスが取得できていない。CloudWatchに表示されていない。

同一アカウント内の他のインスタンスや他のお客様のアカウント内のインスタンスでは、カスタムメトリクスが正しく取得できているのに関わらず、一部のインスタンスのみ上手く表示されていない。
困った。さて、どうしよう。

使用する主要サービスはこちらです。

  • EC2
  • IAM
  • AWS Systems Manager(以下、SSM)
  • CloudWatch

本ケースの場合、確認したい点(前提条件)は下記の4つです。

  • 実行するEC2にIAMの管理ポリシー「AmazonEC2RoleforSSM」がアタッチされているロールが割り当てられているか?
  • SSMエージェントがインストールされており、起動している状態か?(※1)
  • EC2からインターネットに接続可能か?プライベート接続の場合はエンドポイントを使用しているか?(※2)
  • SSMのランコマンドで実行する「JSONの構文」は正しく記述されているか?

※1 SSMエージェントがプリインストールされているAMIについては、AWS公式ドキュメントの SSM エージェント の使用 をご確認ください。SSMエージェントがプリインストールされていないAMIへのインストールについても記載されています。

※2 プライベート接続の場合は下記のVPCエンドポイントが必須です。

  • com.amazonaws.ap-northeast-1.ssm
  • com.amazonaws.ap-northeast-1.ec2messages
  • com.amazonaws.ap-northeast-1.monitoring

要は「カスタムメトリクスを取得するための適切な設定ができていますか?」ということです。
今回はVPCエンドポイントは使用せず、インターネットアウトする形で検証します。

2,カスタムメトリクスとは?

前提知識として、そもそもカスタムメトリクスって何?という方向けです。
もう知ってるよ!という方は読み飛ばしていただいて構いません。

カスタムメトリクスとは、EC2インスタンスに対する監視(モニタリング)において、CloudWatchの標準モニタリング(5分間隔/無償)および詳細モニタリング(1分間隔/有償)以外で、独自に設定できる監視項目設定のことです。SSMエージェントとCloudWatchエージェントをEC2インスタンスにインストールすることで、EC2インスタンスのOS情報からユーザー自身で定義したメトリクス(=カスタムメトリクス)を収集できるようになります。

CloudWatchの標準または詳細モニタリングにおける監視項目は以下の通り。

  • CPU使用率
  • ディスクI/O
  • ネットワークI/O
  • ステータスチェック(EC2稼働状態)

カスタムメトリクスの監視設定可能な項目は以下の通り。

  • CPU詳細
  • ディスク詳細
  • メモリ使用率
  • ネットワーク詳細
  • プロセス情報

弊社でよく利用されているケースだと「ディスク使用量」や「メモリ使用率」の監視が挙げられます。
カスタムメトリクスを設定しておくことで、より詳細にリソースの監視ができるというわけですね。

それでは、実際の設定に移っていきましょう。

3.操作の流れ

冒頭でお伝えした通り、カスタムメトリクスの設定において考慮すべき点は以下の4つです。

  • 実行するEC2にIAMの管理ポリシー「AmazonEC2RoleforSSM」がアタッチされているロールが割り当てられているか?
  • EC2からインターネットに接続可能か?プライベート接続の場合はエンドポイントを使用しているか?
  • SSMエージェントがインストールされており、起動している状態か?
  • SSMのランコマンドで実行する「JSONの構文」は正しく記述されているか?

この4点さえ守れていれば、正しくカスタムメトリクスが取得できます。
なお、使用するサービスは4つでした。

  • EC2
  • IAM
  • SSM
  • CloudWatch

EC2とIAMロールは既に作成している前提で進めます。
さっそく操作手順を見ていきましょう。

■EC2の確認

まだSSM用のIAMロールは割り当てられていません。

■IAMロール(IAMの管理ポリシー「AmazonEC2RoleforSSM」がアタッチされているロール)をEC2に割当

無事にSSM用のIAMロールが割り当てられました。
念のため補足ですが、キャプチャのIAMロール名は私がIAMロールを作成した時に命名したもので、
中身はIAMの管理ポリシー「AmazonEC2RoleforSSM」がアタッチされているものです。

■SSMのマネージドインスタンスを確認

SSMエージェントがプリインストールされているAMIであれば、IAMロールを割り当て後にSSMエージェントが自動起動され、SSMのマネージドインスタンスとして表示されます。プリインストールされていないAMIの場合は、OSにRDP接続し、SSMエージェントインストール後に手動起動または再起動する必要があります。

ちなみにマネージドインスタンスとして表示されたEC2のIAMロールを外すと、SSMのサービス画面上にこのような警告が表示されます。

マネージドインスタンス化したEC2インスタンスは、SSMのセッションマネージャー等で動作確認しておくことをオススメします。

こんな感じで。


 

■SSMランコマンドの実行
マネージドインスタンス→[アクション]から[コマンド実行]を選択

「AWS-ConfigureCloudWatch」を選択

ランコマンドを実行するインスタンスを選択

カスタムメトリクス用のJSONを記述

実行!

早速CloudWatchのメトリクスを確認してみましょう。


…….
………

待てど暮らせど、カスタムメトリクスは表示されない。
全ての手順はクリアしているはず。何故なのか。

4.AWSサポートに問い合わせたこと

確実に問題を切り分けるため、AWSサポートに以下のことを問い合わせました。

  • インスタンス自体に問題がないか?
    →問題なし。
  • SSMエージェントやCloudWatchエージェントは正しく起動しているか?
    →問題なく起動していました。
  • 接続設定に問題がないか?(プロキシやプライベート接続が起因しないか)
    →SSMエージェントおよびCloudWatchエージェントが起動していれば、CloudWatchエンドポイントにアクセスできるので問題なし。

…となるとあとはJSON、お前か。

5.JSONの構文チェック

ここではJSONの中身の詳細説明は割愛し、問題の箇所のみピックアップします。
しかし、目視で構文チェックをするのはとっても骨が折れますので、すぐに構文チェックサイトを頼りましょう。

おや……?
エラーが出ました。ここでようやく、構文内(キャプチャ箇所)に不自然なスペースがあることに気付きます。
修正すると、、、

エラーが解消されました!
それでは、もう一度AWSに戻ってSSMランコマンドを実行してみましょう。

無事にカスタムメトリクスが表示されました。めでたしめでたし。
念のため、メトリクス項目が正しく設定されており、JSONで指定したNameSpaceがメトリクス名になっていることを確認しておきましょう。

6.検証結果

初歩的な問題でしたが、JSONの構文エラーが起きておりました。
JSONのコピー&ペースト時に何らかの形で余計な空白が挿入されてしまっていたようです。

注意すべきは、JSONの構文エラーがあっても SSM Run Command ではエラーを吐いてくれない点です。
そのため、事前に JSON構文チェック を行い、正しい記述であることを確認した上でのランコマンド実行をオススメします。
エンジニアとしての基本中の基本を改めて教わった気持ちになりました(汗

 

以上、「カスタムメトリクスが表示されない問題を検証してみた」でした。
ご拝読ありがとうございました。