【AWS CLI】SSMでCloudWatchエージェントの導入から設定(Windows,Linux)まで実施してみた

記事タイトルとURLをコピーする

はじめに

こんにちは。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"
                ]
            }
        }
    }
}

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent.html

エージェント設定ファイルを 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エージェントの導入から設定まで実施してみました。
どなたかのお役に立てれば幸いです。

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。

AWS資格12冠。2023 Japan AWS Partner Ambassador/APN ALL AWS Certifications Engineer。