オンプレのネットワーク機器のメトリクスをCloudWatchで表示する

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井 亮です。

クラウドシフトを進めてサーバーのほとんどを AWS 上で稼働させたとしても
ネットワーク機器や一部のサーバーはオンプレに残すことはあると思います。

オンプレ時代は監視サーバーでネットワーク機器を監視していましたが、
クラウド移行をしてしまい監視サーバーが存在しなくなってしまった、しかし、監視は必要、
そんなご要望に応えて EC2 からオンプレ機器の監視を考えてみました。

構成

AWS とオンプレは DirectConnect または VPN で接続されています。

EC2 には CloudWatch Agent と collectd がインストールされています。
OS は Amazon Linux 2 です。

collectd snmp プラグインでネットワーク機器の情報を取得し
collectd が CloudWatch Agent と連携し最終的に CloudWatch へメトリクスが送信されます。

実装

それでは実装していきます。

EC2 用 IAM ロールの作成

EC2 に紐付ける IAM ロールを作成します。
CloudWatch Agent に必要です。

マネジメントコンソールで IAM ロール を開きます。
ロールの作成 をクリックします。
このロールを使用するサービスを選択 から EC2
ユースケースの選択 から EC2 Role for AWS Systems Manager を選択します。
次のステップ:タグ をクリックします。
次のステップ:確認 をクリックします。
任意の名前を付けてロールを作成します。

EC2 インスタンスの作成

EC2 インスタンスを作成します。
最新の Amazon Linux 2 AMI を選択ください。
作成する EC2 インスタンスには前の手順で作成したロールを紐付けます。

EC2 インスタンス手順作成は割愛します。

ソフトウェアのインストール

作成した EC2 へログインして以下のコマンド実行します。

$ sudo yum update -y
$ sudo amazon-linux-extras install -y epel 
$ sudo yum install -y collectd
$ sudo yum install -y collectd-snmp

collectd.conf の編集

/etc/collectd.conf を編集します。

下の行を探して先頭の "#" を外します。

LoadPlugin network

"<Plugin network>" という箇所を探して以下を追記します。
Username と Password の値は例です。
任意の文字列に置き換えてください。

<Plugin network>
  <Server "127.0.0.1" "25826">
    SecurityLevel "Encrypt"
    Username "user"
    Password "secret"
  </Server>
</Plugin>

上記は本エントリを満たすための最低限の設定です。
Manpage collectd.conf(5) を参照してご自身のシステムに合わせたチューニングをお願いします。

auth_file の作成

collectd と CloudWatch Agent 間の通信を暗号化します。
暗号化復号化に必要な Username と Password をファイルに記述します。
Username と Password は前の手順で collectd.conf に記述したものと同一です。

$ sudo vi /etc/collectd.d/auth_file
user: secret

collectd-snmp の設定

collectd から snmp で情報を収集するための設定を行っていきます。

以下は設定例です。
ユーザーレベルとシステムレベルの CPU 使用率を取得しています。
(手元にネットワーク機器がなかったため良い例が出せず申し訳ないです)

基本的には以下の構成で対象を記述していきます。
Data 部分で OID と返される値の定義。
Type の指定は /usr/share/collectd/types.db に記述があります。

Host 部分で対象機器の IP アドレスやコミュニティ名を指定します。

$ sudo vi  /etc/collectd.d/snmp.conf
LoadPlugin snmp
<Plugin snmp>
  <Data "ssCpuUser">
    Type "cpu"
    Table false
    Instance ""
    Values "1.3.6.1.4.1.2021.11.9.0"
  </Data>
  <Data "ssCpuSystem">
    Type "cpu"
    Table false
    Instance ""
    Values "1.3.6.1.4.1.2021.11.10.0"
  </Data>

  <Host "Example-CpuUser">
    Address "10.0.2.92"
    Version 2
    Community "securecom"
    Collect "ssCpuUser"
    Interval 60
  </Host>
  <Host "Example-CpuSystem">
    Address "10.0.2.92"
    Version 2
    Community "securecom"
    Collect "ssCpuSystem"
    Interval 60
  </Host>
</Plugin>

ネットワーク機器が提供している MIB から必要な情報をピックアップして
collectd で収集すべきものを上記ファイルに記述していきます。
ネットワーク機器がどのような情報を返してくるかによって記述の仕方が変わってきます。
実際の機器に合わせた設定を Manpage collectd-snmp(5) を参照して頑張って記述します。

collectd の起動

以下のコマンドを実行して collectd を起動します。
”active (running)” になっていることを確認します。

$ sudo systemctl enable collectd.service
$ sudo systemctl start collectd.service
$ sudo systemctl status collectd.service
● collectd.service - Collectd statistics daemon
   Loaded: loaded (/usr/lib/systemd/system/collectd.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-07-12 09:51:55 UTC; 12s ago
   Docs: man:collectd(1)
           man:collectd.conf(5)
 Main PID: 3549 (collectd)
   CGroup: /system.slice/collectd.service
           └─3549 /usr/sbin/collectd

おまけ

ログファイルの確認は以下のコマンドです。

$ journalctl -u collectd 

SSM Agent の最新化

CloudWatch Agent をインストールする前に SSM Agent を最新化します。

ランコマンド を開きます。

コマンドの実行 をクリックします。

AWS-UpdateSSMAgent を探し、ラジオボタンにチェックを入れます。

ターゲットインスタンス から前の手順で作成したインスタンスを選択します。

出力オプション で任意の S3 バケットを選択します。
Run Command の出力はコンソールでは2500文字しか表示されず、日本語が文字化けします。
エラー時の解析を容易にするため、及び、実行証跡を残すために必ず S3 バケットを出力するようにします。

実行 ボタンをクリックすると処理が実行されます。
実行の詳細が表示されるので成功することを確認します。

プロセス監視用 CloudWatch Agent 設定ファイルの作成

特定プロセスを監視する設定ファイルを作成します。
設定ファイルはパラメータストアに格納します。

パラメータストア を開きます。

パラメータの作成 をクリックします。

<パラメータの詳細> 画面では以下の値を入力します。

項目 設定値
名前 AmazonCloudWatch-collectd
説明 説明文を入力します
利用枠 標準を選択します
タイプ 文字列を選択します
以下参照
{
   "metrics":{
      "metrics_collected":{
         "collectd":{
            "name_prefix":"My_collectd_metrics_",
            "collectd_security_level":"encrypt",
            "collectd_auth_file":"/etc/collectd.d/auth_file",
            "metrics_aggregation_interval":60
         }
      }
   }
}

設定ファイルの反映

設定ファイルを CloudWatch Agent に反映します。

ランコマンド を開きます。

コマンドの実行 をクリックします。

AmazonCloudWatch-ManageAgent を探し、ラジオボタンにチェックを入れます。

コマンドのパラメータは以下のようにします。
※記載の無いパラメータはデフォルトのまま

  • Action → Configure (append)
  • Optional Configuration Location → AmazonCloudWatch-collectd

ターゲットインスタンス から前の手順で作成したインスタンスを選択します。

出力オプション で任意の S3 バケットを選択します。
Run Command の出力はコンソールでは2500文字しか表示されず、日本語が文字化けします。
エラー時の解析を容易にするため、及び、実行証跡を残すために必ず S3 バケットを出力するようにします。

実行 ボタンをクリックすると処理が実行されます。
実行の詳細が表示されるので成功することを確認します。

確認

CloudWatch メトリクス を開きます。

CWAgenthost, type の順に展開します。
指定した値が取得されていることが確認できます。

まとめ

運用を考慮すると "One Console" (今回は CloudWatch) で一元管理することは有用です。
CloudWatch に集約出来れば、Event/Alarm などと組み合わせた運用の仕組みも一本化可能です。

今回は CloudWatch/CloudWatch Agent に寄せる方法を試してみました。
collectd の設定など少々 techie でメンテナンス性は優れているとは感じません。

EC2 に Zabbix 等のツールをインストールする方法もあります。
運用する方が管理しやすい方法を選んで頂くのが一番だと思います。

参考

新しいCloudWatch Agentでメトリクスとログの収集が行なえます
CloudWatch エージェントを使用して Amazon EC2 インスタンスとオンプレミスサーバーからメトリクスとログを収集する
Manpage collectd.conf(5)
Manpage collectd-snmp(5)

以上、吉井 亮 がお届けしました。