はじめに
こんにちは。AWS CLIが好きな福島です。
今回は、SSMを利用し、CloudWatchエージェントの導入から設定まで実施いたします。
AWS CLIだけで完結させたかったのですが、CLIではやりづらい部分があったため、一部、マネジメントコンソールを利用しています。
また今回は、Compute Optimizerでメモリ使用率を含めてEC2のインスタンスタイプの推奨を知りたい場合を想定し、 CloudWatchエージェントの設定(必要最小限)を実施します。
Compute Optimizerでメモリ使用率するためには、Windows、Linuxに応じて、以下の通り、メトリクスを取得する必要があります。 ※InstanceIdディメンションが含まれている必要があるのもポイントですね。(基本含まれているため、あまり気にしなくても大丈夫ですが。)
https://docs.aws.amazon.com/ja_jp/compute-optimizer/latest/ug/metrics.html#cw-agent
Linuxインスタンスでは、Compute Optimizerは、CWAgent名前空間のmem_used_percentメトリック、またはSystem / Linux名前空間のレガシーMemoryUtilizationメトリックを分析します。 Windowsインスタンスでは、Compute Optimizerは、CWAgent名前空間のMemory%Committed Bytes InUseメトリックを分析します。 さらに、名前空間にはInstanceIdディメンションが含まれている必要があります。 InstanceIdディメンションが欠落している場合、または独自のカスタムディメンション名で上書きした場合、ComputeOptimizerはインスタンスのメモリ使用率データを収集できません。 名前空間とディメンションは、CloudWatchAgent設定ファイルで定義されています。 詳細については、 『Amazon CloudWatchユーザーガイド』の「CloudWatchエージェント設定ファイルの作成」を参照してください。
前提
・EC2にSSMエージェントが導入されていること
・EC2にCloudWatchおよびSSMに必要な権限が付与されていること
やること
やることは、
①CloudWatchエージェントの導入
②パラメーターストアにCloudWatchの設定を追加
③CloudWatchエージェントの設定
④動作確認
です!
①CloudWatchエージェントの導入
CloudWatchエージェントの導入をしていきます。
Windows,Linuxともに同じコマンドで実行が可能です。
まずは、コマンドを実行する前に変数を定義します。
TargetTagKey=導入するサーバのタグキーを変数に定義します TargetTagValues=導入するサーバのタグバリューを変数に定義します(,区切りで5個まで指定可能) OutputS3=SSMの実行結果を保存するS3を定義します
定義例1)Nameタグで対象サーバを指定する場合
TargetTagKey=Name TargetTagValues=fk-test-cw-linux,fk-test-cw-windows OutputS3=ssmlogs-xxxxxxxxxx
定義例2)Systemタグに付与しているタグで対象サーバを指定する場合
TargetTagKey=System TargetTagValues=fk-test OutputS3=ssmlogs-xxxxxxxxxx
変数の定義が完了したら、以下のコマンドを実行します。
aws ssm send-command \ --document-name AWS-ConfigureAWSPackage \ --targets Key=tag:$TargetTagKey,Values=$TargetTagValues \ --parameters action=Install,name=AmazonCloudWatchAgent \ --output-s3-bucket-name $OutputS3
実行結果例
{
"Command": {
"CommandId": "528f113b-3ec9-4ae9-99e4-ca655c406d77",
"DocumentName": "AWS-ConfigureAWSPackage",
"DocumentVersion": "$DEFAULT",
"Comment": "",
"ExpiresAfter": "2021-05-27T04:06:42.106000+09:00",
"Parameters": {
"action": [
"Install"
],
"additionalArguments": [
"{}"
],
"name": [
"AmazonCloudWatchAgent"
]
},
"InstanceIds": [],
"Targets": [
{
"Key": "tag:Name",
"Values": [
"fk-test-cw-linux",
"fk-test-cw-windows"
]
}
],
"RequestedDateTime": "2021-05-27T01:06:42.106000+09:00",
"Status": "Pending",
"StatusDetails": "Pending",
"OutputS3BucketName": "ssmlogs-xxxxxxxxxxxxx",
"OutputS3KeyPrefix": "",
"MaxConcurrency": "50",
"MaxErrors": "0",
"TargetCount": 0,
"CompletedCount": 0,
"ErrorCount": 0,
"DeliveryTimedOutCount": 0,
"ServiceRole": "",
"NotificationConfig": {
"NotificationArn": "",
"NotificationEvents": [],
"NotificationType": ""
},
"CloudWatchOutputConfig": {
"CloudWatchLogGroupName": "",
"CloudWatchOutputEnabled": false
},
"TimeoutSeconds": 3600
}
}
正常に完了したかは、マネジメントコンソールから確認します。
https://ap-northeast-1.console.aws.amazon.com/systems-manager/run-command
以下の通り、ステータスが成功となっていれば、OKです!

②パラメーターストアにCloudWatchの設定を追加
SSMを利用して、CloudWatchエージェントの設定をする場合、SSMのパラメーターストアに設定値を定義する必要があります。
また、WindowsとLinuxによって、設定が異なるため、それぞれパラメーターストアを設定します。
1.パラメーターストアを開きます。
https://ap-northeast-1.console.aws.amazon.com/systems-manager/parameters/
2.パラメーターストアの作成をします。
・名前:任意(AmazonCloudWatch-WindowsやAmazonCloudWatch-Linuxなど)
・タイプ:文字列
・データ型:text
・値:LinuxまたはWindowsに応じて、以下を設定
※名前の先頭は、「AmazonCloudWatch-」で始める必要があります。
Linuxの設定
{
"metrics": {
"append_dimensions": {
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
}
}
}
}
Windowsの設定
{
"metrics": {
"append_dimensions": {
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"Memory": {
"metrics_collection_interval": 60,
"measurement": [
"% Committed Bytes In Use"
]
}
}
}
}
エージェント設定ファイルを Parameter Store に書き込み、次に Parameter Store からダウンロードするには、エージェント設定ファイルの名前を AmazonCloudWatch- で始める必要があります。ファイル名が AmazonCloudWatch- で始まらない CloudWatch エージェント設定ファイルがある場合、これらのポリシーを使用してファイルを Parameter Store に書き込んだり、Parameter Store からファイルをダウンロードしたりすることはできません。
以下のイメージでパラメータストアの設定ができればOKです!

③CloudWatchエージェントの設定
CloudWatchエージェントの設定を実施します。
利用するパラメーターストアが変わるため、 Windows,Linuxに応じて、「ConfigLocation」変数の値は、設定してください。
まずは、コマンドを実行する前に変数を定義します。
TargetTagKey=導入するサーバのタグキーを変数に定義します TargetTagValues=導入するサーバのタグバリューを変数に定義します(,区切りで5個まで指定可能) ConfigLocation=②で作成したパラメーターストア名をWindwos,Linuxに応じて、定義します。 OutputS3=SSMの実行結果を保存するS3を定義します
例1)Nameタグで対象サーバを指定する場合
TargetTagKey=Name TargetTagValues=fk-test-cw-windows ConfigLocation=AmazonCloudWatch-Windows OutputS3=ssmlogs-xxxxxxxxxx
例2)OSタグで対象サーバを指定する場合
TargetTagKey=OS TargetTagValues=Linux ConfigLocation=AmazonCloudWatch-Linux OutputS3=ssmlogs-xxxxxxxxxx
変数の定義ができたら、コマンドを実行します。
aws ssm send-command \ --document-name AmazonCloudWatch-ManageAgent \ --targets Key=tag:$TargetTagKey,Values=$TargetTagValues \ --parameters optionalConfigurationLocation=$ConfigLocation \ --output-s3-bucket-name $OutputS3
正常に完了したかは、マネジメントコンソールから確認します。
https://ap-northeast-1.console.aws.amazon.com/systems-manager/run-command
以下の通り、ステータスが成功となっていれば、OKです!

また、CloudWatchエージェントの設定はできたけど、自動起動設定って大丈夫と思われた方もいるのではないでしょうか。 私は、そう思い挙動を確認したところ、どうやら、SSMでCloudWatchエージェントの設定をする際(AmazonCloudWatch-ManageAgent)に合わせて、自動起動の設定をしてくれているようでした! さすがですね!
④動作確認
CloudWatchメトリクスからメモリ使用率を取得できてることを確認します。
Linux,Windowsに応じて、以下の通り、メトリクスが保存されているはずです。
Linuxの場合 すべて > CWAgent > ImageId,InstanceId,InstanceType
Windowsの場合 すべて > CWAgent > ImageId,InstanceId,InstanceType,objectname
Linuxの場合、「mem_used_percent」、
Windwosの場合、「Memory % Committed Bytes In Use」
のメトリクスが取得されていればOKです!

おまけ
おまけ① CloudWatchエージェントの設定をOSから確認してみる
Linuxの場合 「/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d」配下に 「ssm_AmazonCloudWatch-Linux」という名前でファイルが作成されます。
[root@ip-10-88-1-22 amazon-cloudwatch-agent.d]# pwd
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d
[root@ip-10-88-1-22 amazon-cloudwatch-agent.d]#
[root@ip-10-88-1-22 amazon-cloudwatch-agent.d]# ls -rlt
total 4
-rw-r--r-- 1 root root 538 May 21 12:27 ssm_AmazonCloudWatch-Linux
[root@ip-10-88-1-22 amazon-cloudwatch-agent.d]#
[root@ip-10-88-1-22 amazon-cloudwatch-agent.d]# cat ssm_AmazonCloudWatch-Linux
{
"metrics": {
"append_dimensions": {
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
}
}
}
}
[root@ip-10-88-1-22 amazon-cloudwatch-agent.d]#
Windowsの場合
「C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs」配下に 「ssm_AmazonCloudWatch-Windows」という名前でファイルが作成されます。

おまけ② CloudWatchエージェントの導入有無を確認する方法
CloudWatchが導入されているか分からない場合、以下のコマンドで導入有無を確認できます。
まず、変数を定義します。
InstanceID=インスタンスIDを定義
Linuxの場合
aws ssm list-inventory-entries --instance-id "$InstanceID" \ --type-name "AWS:Application" \ --filters "Key=Name,Values=amazon-cloudwatch-agent" \ --query "[InstanceId,Entries[0].InstalledTime,Entries[0].Name,Entries[0].Version,Entries[0].PackageId,Entries[0].Publisher]" \ --output text
Windowsの場合
aws ssm list-inventory-entries \ --instance-id "$InstanceID" \ --type-name "AWS:Application" \ --filters "Key=Name,Values=Amazon CloudWatch Agent" \ --query "[InstanceId,Entries[0].InstalledTime,Entries[0].Name,Entries[0].Version,Entries[0].PackageId,Entries[0].Publisher]" \ --output text
※LinuxとWindowsでコマンドの違いは、「--filters」で指定している値だけです。
導入されている場合
i-0f31b321b7d4692c8 2021-05-21T00:00:00Z Amazon CloudWatch Agent 1.3.50739 {3224DF74-5564-4269-B07C-F66EDE741F83} Amazon.com, Inc.
導入されていない場合
i-083c76fd5a360d2cf None None None None None
また、CloudWatchエージェントを導入したからといってすぐにデータが更新されるわけではないため、その点はご注意ください。
終わりに
今回は、SSMでCloudWatchエージェントの導入から設定まで実施してみました。
どなたかのお役に立てれば幸いです。