WorkSpaces環境のOSリソースをモニタリングする

CloudWatchエージェント(以下、CWエージェント)を導入してみたら簡単にできた、という記事です。
AWSドキュメントに明記されていませんが、一応、AWSの技術サポートに聞いてもこの方式は否定されませんでした。

当初はLambda関数でSSMドキュメント「AWS-ConfigureCloudWatch」を定期実行すればいい、という考えでした。ただ、Lambda関数でWorkSpaces環境のカスタムメトリクス取得はできた一方で、不規則にデータをロストしたり、取得できないメトリクスがあったり、動作がいまいちな結果に。。

CWエージェント方式であれば、PULL型ではなくPUSH型でデータを自動収集できるため、スケールする際の考慮をマネージドサービス(CloudWatch)に任せられるの点もメリットです。
以下のような流れを踏むと、CloudWatchカスタムメトリクスとして、WorkSpaces環境のOSリソース情報を自動取得できるようになります。

SSMアクティベーション
CWエージェントインストール
CWエージェント設定
CWエージェント起動

 

AWSサービス構成

AWSサービス観点では、次の点がtipsになります。
必要な内容は基本的に全てAWSドキュメントに記載されている通りです。
ドキュメントとしてまとまっていないだけで、必要な部分をピックアップして設定していくことになります。

・WorkSpaces環境をオンプレWindows Server環境とみなす
→EC2以外でSSMやCWエージェントを使用する場合はこの方式を使えば何とかなりそう。
・CWエージェント起動時のモードでは「ec2」を指定する必要がある
→IAM認証情報を読み取れないエラーを回避するため。。
・SSMアクティベーション時に関連付けるIAMロールはWorkSpaces環境でも認識されるが、IAMアクセスキーをOS環境変数に設定する必要がある
→1時間でIAM認証情報が失効し、CWエージェントが1時間しか情報収集できないため。。。

 

SSMアクティベーション

ハイブリッド環境での AWS Systems Manager の設定 の通り、SSMアクティベーション(IDとコード)を作成します。
フォローアップとしては、SSMアクティベーションと関連付けるIAMロールがAWSコンソールから作成できない点です。(IAMロール作成時の信頼関係にSSMがでてこない)
そのため、本記事で検証した際は、SSMを信頼関係とするIAMロールをAWS CLIから作成してます。まあ、できない旨は書いてないのですが、そこはAWSドキュメントに同じです。
SSMアクティベーションの作成自体は、AWSコンソールからも可能です。
IDとコードがバナーのように表示されますが、それを非表示にすると二度と確認できない点も要注意です。

SSMアクティベーション

アクティベーション作成後、AWSドキュメント記載のPowerShellコマンドを実行すると、SSMエージェントをインストールできます。

##SSMアクティベーション情報
$code = "activation-code"
$id = "activation-id"
##リージョン
$region = "region"

$dir = $env:TEMP + "\ssm"
New-Item -ItemType directory -Path $dir -Force
cd $dir

##SSMエージェントインストール
(New-Object System.Net.WebClient).DownloadFile("https://amazon-ssm-$region.s3.amazonaws.com/latest/windows_amd64/AmazonSSMAgentSetup.exe", $dir + "\AmazonSSMAgentSetup.exe")
##SSMエージェント起動
Start-Process .\AmazonSSMAgentSetup.exe -ArgumentList @("/q", "/log", "install.log", "CODE=$code", "ID=$id", "REGION=$region") -Wait

##SSMマネージドインスタンス確認
Get-Content ($env:ProgramData + "\Amazon\SSM\InstanceData\registration")
Get-Service -Name "AmazonSSMAgent"

SSMのマネージドインスタンスとしてWorkSpacesが登録できると、CWエージェント導入の準備完了です。 SSMのマネージドインスタンス

 

CWエージェントインストール

オンプレミスサーバーに CloudWatch エージェントをインストールする の通り、SSMドキュメント「AWS-ConfigureAWSPackage」を実行するとCWエージェントがインストールできます。
インストールされると、サービス一覧にも表示されます。 CWエージェント インストール

 

CWエージェント設定

CloudWatch エージェント設定ファイルを作成するの通り、CWエージェントを設定します。
初めてCWエージェントを導入する際は、AWSが用意したセットアップウィザードを使えば設定ファイルを生成してくれます。
ウィザードの中身はやや長いため(ログでは約200行)ご紹介を割愛しますが、CUIベースで初めてでも分かりやすくなっています。

ウィザードの最後には、SSMパラメータストアに設定値(JSONファイル)を保存できます。使わない手はないので、事前にSSM権限のIAMアクセスキーをご用意ください。

##########
## 前略 ##
Please check the above content of the config.
The config file is also located at 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]:
 
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-windows]
 
Which region do you want to store the config in the parameter store?
default choice: [us-east-1]
ap-northeast-1
Please provide credentials to upload the json config file to parameter store.
AWS Access Key:
--------------------
AWS Secret Key:
---------------------------------------
Successfully put config to parameter store AmazonCloudWatch-windows.
Please press Enter to exit...
 
Program exits now.
 
C:\Program Files\Amazon\AmazonCloudWatchAgent>

 

CWエージェント起動

CloudWatch エージェントを開始する の通り、とは実はいかないですが、SSMドキュメント「AmazonCloudWatch-ManageAgent」を実行してCWエージェントを開始します。

SSMアクティベーション時にWorkSpaces環境をオンプレ相当にみなしてうまく行ったため、ここでも[Mode]を[onPremis]に指定しましたが、IAM権限のエラーが出て起動できません。。
回避策としては次の2点。
・「AmazonCloudWatch-ManageAgent」実行時のmodeはec2を指定する
→IAM認証情報を読み込もうとする挙動(フォルダパス?)が違うらしいです。

・WorkSpacesにIAM認証のOS環境変数を設定する →"AWS_REGION"、"AWS_SECRET_ACCESS_KEY"、"AWS_ACCESS_KEY_ID"の3つです。
→権限としては「CloudWatchAgentServerPolicy」と「AmazonEC2RoleforSSM」のAWS管理ポリシーでOKです。

CWエージェントの起動が成功すると、SSMドキュメントの実行結果は以下のようなログでした。

Region: ap-northeast-1
credsConfig: map[]
Successfully fetched the config and saved in C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\ssm_AmazonCloudWatch-windows-workspaces.tmp
Start configuration validation...
Valid Json input schema.
No csm configuration found.
Configuration validation first phase succeeded
Configuration validation second phase succeeded
Configuration validation succeeded

 

CWエージェント設定のポーリング間隔にもよりますが、デフォルト設定(60s)であれば、時間をおかずにCloudWatchにWorkSpacesのOSリソース情報が収集され始めます。

▼メモリ使用率 WorkSpacesのメモリ使用率

▼CPU使用率やディスク使用率、NWやストレージのI/Oなど WorkSpacesのCPU使用率

なお、CWエージェントが収集するメトリクス群は、仕様として定義されています。 下記ページご参照。 CloudWatch エージェントの事前定義されたメトリクスセット

 

最後に

CWエージェント起動後にリッスンポートを確認してみたら、通信プロトコルUDPでした。 CWエージェントはStatsDで動いているらしいので、そのUDPモードでCloudWatchにメトリクスデータを送信しているようです。
StatsD

A network daemon that runs on the Node.js platform and listens for statistics, like counters and timers, sent over UDP or TCP and sends aggregates to one or more pluggable backend services (e.g., Graphite).

「VDI環境のOSリソース情報をみる必要あるのか」という元々のジレンマはありますが、やはり必要に迫られるケースは存在します。そのような際でも、ランニングコストを最低限に抑えて実現できるのは、AWSマネージドサービスです。 AWSのサービス仕様として理屈上は問題ないはずなので、そのうちドキュメントに正式取り込みされることを願ってます。

 

 

このブログの著者

 

 

アプリケーション開発バナー   AWS相談会