AWS Systems ManagerとCloudWatchでオンプレミスサーバーを監視しよう!

Amazon CloudWatch, Amazon Web Services, AWS Systems Manager

こんにちは。プラットフォーム技術部の齊藤(沙)です。

システムを構築し運用するときに切っても切っても切り離せないのが監視ですね。監視レベルに差はあるものの、システムを運用する上で監視はなくてはならないものでしょう。

そこで、今回は2017年12月にリリースされた Amazon CloudWatch Agent についてご紹介します。

これは今までAmazon CloudWatchへ監視データやログファイルを送信するためにあった様々なツールを統一したものです。クラウドでもオンプレミスでも、LinuxでもWindowsでも実行でき、メトリクスとログファイルを取り扱えます。

Amazon CloudWatch Agentにより収集されるメトリクスについては、こちらに詳細が載っています。

今回はオンプレミスサーバーの代わりに自分のPC上の仮想マシン(VM)へAmazon CloudWatch Agentを導入し、AWSで監視する設定をご紹介します。

利用するAWSサービス

以下のAWSサービスを利用します。

Amazon CloudWatchAmazon CloudWatch(以下、CloudWatch)
AWSリソースと、AWS で実行しているアプリをリアルタイムでモニタするサービス
AWS Systems ManagerAWS Systems Manager(以下、SSM)
AWS で利用しているインフラストラクチャを可視化し、制御するためのサービス
AWS Identity and Access ManagementAWS Identity and Access Management(以下、IAM)
AWS リソースへのアクセスを安全に制御するためのウェブサービス

導入方法

VMをCloudWatchで監視出来るまでの道のりは以下の通りです。(前提:OSはCentOS7/AWS CLIをVMに導入済み)

今回はSSMでVMを管理出来る状態も見たいので、SSMを利用した手順としています。

  1. CloudWatch Agentに必要なIAMユーザー作成
  2. SSMにVMを登録
  3. CloudWatch Agentを設定
  4. CloudWatch Agentを実行

AWSコンソールでの作業とVMでの作業が混在するため、各手順の最初に◆マーク◆で作業環境を記載しています。

CloudWatch Agentに必要なIAMユーザー作成

◆AWSコンソール上での作業◆

CloudWatch AgentがCloudWatchにメトリクスを書き込むために必要なIAMユーザーを作成します。また今回はSSMを使用してCloudWatch Agentをインストール・設定するため、必要なポリシーは以下の2つとなります。

以降の作業でユーザーを利用するため、作成後にはアクセスキーIDとシークレットアクセスキーをメモしておいてくださいね。

  • CloudWatchAgentServerPolicy
  • AmazonEC2RoleforSSM

IAM Management Console のナビゲーションペインからユーザーを選択し、以下の設定値でIAMユーザーを作成してください。

IAMユーザー作成・各設定値

パラメータ設定値備考
ユーザー名watchtest1必須
ユーザー名には半角英数字のほかに _+=,.@- のいずれかを使用できます
アクセスの種類プログラムによるアクセス必須
アクセスキー IDとシークレットアクセスキーを有効にします
アクセス許可の設定既存のポリシーを直接アタッチ
上記2個のポリシーを選択
必須

補足

必須ではないですが、同一のCloudWatch Agent設定ファイルをSSMのParameter Storeに保存して複数サーバーから利用出来るようにするには別のIAMユーザーが必要になります。必要なポリシーは以下の2つです。同一の設定ファイルを利用する機会は多いと思うので、今回はこのIAMユーザーも作成します。

  • CloudWatchAgentAdminPolicy
  • AmazonEC2RoleforSSM

IAM Management Console のナビゲーションペインからユーザーを選択し、以下の設定値でIAMユーザーを作成してください。

IAMユーザー作成(任意)・各設定値

パラメータ設定値備考
ユーザー名watchtest2必須
ユーザー名には半角英数字のほかに _+=,.@- のいずれかを使用できます
アクセスの種類プログラムによるアクセス必須
アクセスキー IDとシークレットアクセスキーを有効にします
アクセス許可の設定既存のポリシーを直接アタッチ
上記2個のポリシーを選択
必須

SSMへVMを登録

早速CloudWatch AgentをVMにダウンロードしたいのですが、その時に使用するSSMのSystems Manager Run Command はSSMにVMを登録しないと利用出来ません。ここではSSMのセットアップについて説明します。

サービスロールを作成

VMとSSMが通信するために、SSMに対して権限を付与します。

◆VMでの作業◆

以下の信頼ポリシー (この例では SSMService-Trust.json) のテキストファイルを作成します。ファイル拡張子 (.json) を付けてこのファイルを保存します。ファイルの配置場所の指定はありません。

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

ちなみに、上記のVersionとはAWS側が指定している日付ですので、このファイルを作成した日付などへ変更すると次のコマンド実行時に以下のようなエラーになってしまいます。

「An error occurred (MalformedPolicyDocument) when calling the CreateRole operation: The policy must contain a valid version string」

次に、上で作成したファイル(SSMService-Trust.json)を配置したディレクトリ上で以下のコマンドを実行し、サービスロール(SSMServiceRole)を作成します。

aws iam create-role --role-name SSMServiceRole --assume-role-policy-document file://SSMService-Trust.json

最後に、以下のコマンドを実行してSSMからVMへコマンドを実行出来るようにします。

aws iam attach-role-policy --role-name SSMServiceRole --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM

VMのアクティベーションを作成

このアクティベーションを利用することにより、オンプレミス・VMを問わずあらゆるサーバーを簡単に登録して、SSM で管理出来るようになります。

◆VMでの作業◆

以下のコマンドを実行してアクティベーションを作成します。

aws ssm create-activation --default-instance-name MyServers --iam-role SSMServiceRole --registration-limit 10 --expiration-date '2018-10-21 00:00:00' --region us-east-2

アクティベーション作成・オプションについて

オプション説明
default-instance-nameマネージドインスタンスのデフォルト名
iam-role1つ前の手順で作成したサービスロール名を選択
registration-limitAWS に登録するサーバーと VM の合計数を指定
デフォルトは 1
expiration-dateアクティベーションの有効期限
作成日から30日以内を指定(30日より長い期限だとエラーになります)
デフォルトは1日
regionSSMをサポートしているリージョンを指定する
リンク先のRegion列を指定
デフォルトはus-west-2(米国西部オレゴン)

正常に実行されるとアクティベーションコードとアクティベーション ID が出力されるので、それらはメモしておきます。

AWSコンソール上でも以下のように認識されています。

アクティベーションの作成

SSMへVMを登録

AWSリージョンからSSM エージェントをダウンロードしてVMにインストールします。それにより、SSMにそのVMがマネージドインスタンスだと認識されます。

◆VMでの作業◆

以下のコマンドを実行します。
“activation-code” ”activation-id” は、アクティベーション作成時にメモした文字列に置き換えます。

mkdir /tmp/ssm
curl https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm -o /tmp/ssm/amazon-ssm-agent.rpm
sudo yum install -y /tmp/ssm/amazon-ssm-agent.rpm
sudo systemctl stop amazon-ssm-agent
sudo amazon-ssm-agent -register -code "activation-code" -id "activation-id" -region us-east-2
sudo systemctl start amazon-ssm-agent

コマンド実行後、「RegistrationKey does not exist」や「Error occurred fetching the seelog config file path:~」と最初に出力されますが少し待つと「Successfully registered the instance with AWS SSM using Managed instance-id:****」となり、終了します。

正常に登録されると、VMのIPアドレス・コンピューター名(ホスト名)が認識され、「Pingの状態」がオンラインとなります。

これにてようやく、SSMへのVM登録が完了です。

SSMにVMがマネージドインスタンスだと認識させる。

CloudWatch Agentを設定

CloudWatch Agentインストールと設定について説明します。

CloudWatch Agentインストール

◆AWSコンソール上での作業◆

SSMのナビゲーションペインから「ランコマンド」、「コマンドを実行」を選択します。他、設定値は以下を参照下さい。

CloudWatch Agentインストール・各設定値

パラメータ設定値備考
コマンドのドキュメントAWS-ConfigureAWSPackage
Actioninstall
NameAmazonCloudWatchAgent
Versionlatestデフォルトは最新版をインストール
ターゲットインスタンスの手動選択前の手順で作成したマネージドインスタンスを
指定していることを確認する
今回は「MyServers」

正常終了すると以下のように、「ステータス」が成功となります。

コマンドの実行

CloudWatch Agentを設定

◆VMでの作業◆

始めに、以下コマンドで AmazonCloudWatchAgent プロファイルを作成します。コマンド実行時に、アクセスキーIDを求められるため”CloudWatch Agentに必要なIAMユーザー作成”にて作成した一つ目のIAMユーザー(今回はwatchtest1)のアクセスキーIDとシークレットキーを指定してください。プロキシ・認証情報・リージョン情報が必要であれば、/opt/aws/amazon-cloudwatch-agent/etc/common-config.tomlを編集します。(ここでは割愛します。)

aws configure --profile AmazonCloudWatchAgent

続いて、設定ファイルを作成します。ウィザードと設定ファイル手動作成の二種類方法があるが、今回はウィザードについて説明します。ウィザードでは、一連の質問に答えることで簡単に設定ファイルが作成されます。ウィザード実行コマンドと質問内容は以下の通りです。質問に対する回答もデフォルト値が示されており、選択しやすくなっています。

実行コマンド

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

質問内容

On which OS are you planning to use the agent?
1. linux
2. windows
default choice: [1]:
選択 1
Trying to fetch the default region based on ec2 metadata...
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [2]:
選択 2
Please make sure the credentials and region set correctly on your hosts.
Refer to http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
Do you want to turn on StatsD daemon?
(StatsDは、Node.js上で稼動するデータ収集デーモン)
1. yes
2. no
default choice: [1]:
選択 1
Which port do you want StatsD daemon to listen to?
8125 (デフォルト)
What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:
選択 1
What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:
選択 4
Do you want to monitor metrics from CollectD?
(CollectDとは、SNMP等を使用せずに単体で動作する、サーバの統計情報を収集するためのオープンソースソフトウェア、導入していない場合はインストールする)
1. yes
2. no
default choice: [1]:
選択 1
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
選択 1
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
選択 1
Would you like to collect your metrics at high resolution (sub-minute resolution)? 
This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:
選択 4
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
選択 1
(それぞれの監視対象は、Amazon CloudWatch - ユーザーガイドを参照ください)
(https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/acw-ug.pdf#page=87)
Current config as follows:
{ ・・・・・・json形式で、config内容が出力されます。ここでは割愛します。
}
Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:
選択 1
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
選択 2
(CloudWatch Log Agentは利用しないため、2を選択)
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
2
(今回はログ監視はしないため、2を選択)
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{ ・・・・・・json形式で、config内容が出力されます。ここでは割愛します。
}
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:
選択 1
What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-linux]
入力 AmazonCloudWatch-linux
Which region do you want to store the config in the parameter store?
default choice: [us-east-2]
入力 us-west-2
(アクティベーションを作成したリージョンを指定)
Which AWS credential should be used to send json config to parameter store?
1. XXXXXXXXX....(From SDK)
2. YYYYYYYYY....(From Profile: AmazonCloudWatchAgent)
3. Other
default choice: [1]:
選択 3
(一番初めの CloudWatch Agentに必要なIAMユーザー作成 にて作成した二つ目のIAMユーザーを利用します)
Please make sure the creds you used have the right permissions configured for SSM access.
Please provide credentials to upload the json config file to parameter store.
AWS Access Key:
入力 ZZZZZZZZZ.....
AWS Secret Key:
入力 XYZXYZXYZXYZXYZXYZ....

正常終了すると、以下が表示されます。

Successfully put config to parameter store AmazonCloudWatch-linux.
Program exits now.

設定ウィザードで作成したAmazonCloudWatch-linuxは、SSMのナビゲーションペインからパラメータストアを選択すると以下のように確認出来ます。

パラメータの作成

今回はデフォルト(Basic)で監視対象になっていない、「確率されたTCP接続の数」を監視出来るように設定ファイルを変更しましょう。

上記のキャプチャ画面からAmazonCloudWatch-linuxを選択し、編集を押下すると直接編集出来ます。以下を設定ファイルに追加し変更の保存を押下すると、直ぐに反映されます。

"netstat": { 
 "measurement":[
   "tcp_established"
 ], 
 "metrics_collection_interval": 60 
},

各パラメータについて

パラメータ意味
netstat収集する TCP 接続状態と UDP 接続メトリクスを指定
measurement収集する netstat メトリクスの配列を指定
複数指定可能
metrics_collection_intervalnetstat メトリクスを収集する頻度を指定

CloudWatch Agentを実行

◆AWSコンソール上での作業◆

CloudWatch Agentをインストールした時と同様に、SSMのナビゲーションペインから「ランコマンド」、「コマンドを実行」を選択します。他、設定値は以下を参照下さい。

CloudWatch Agent実行・各設定値

パラメータ設定値備考
コマンドのドキュメントAmazonCloudWatch-ManageAgent
Actionconfigure設定
ModeonPremise今回はVMのため
Optional Configuration Sourcessm設定ファイルの保存
Optional Configuration LocationAmazonCloudWatch-linux手前の手順にて、SSMのParameter Storeへ
保存する設定ファイル名に指定した文字列を記載
ターゲットインスタンスの手動選択CloudWatch Agentをインストールしたサーバーを選択
今回は「MyServers」

CloudWatch 結果

上記導入手順完了し、CloudWatchにてダッシュボードを作成すると以下のようにデータを取得出来ていることを確認出来ました。

CloudWatchにて作成したダッシュボード

まとめ

ここまでで、AWS Systems ManagerにVMを登録しランコマンドを使用して、Amazon CloudWatch Agentをセットアップ・監視出来るところまで確認しました。

1台のみの監視設定をやってみましたが、複数台のサーバーを監視する場合もパラメータストアを利用して簡単に設定出来そうですね。

次回はCloudWatch Logの利用方法についても検証していきたいです。

  • 株式会社アークシステムの来訪管理・会議室予約システム BRoomHubs
  • 低コスト・短納期で提供するまるごとおまかせZabbix