CloudWatch Agent の config.json を SSM パラメータストアに移行する

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

SRE2課 佐竹です。
CloudWatch Agent の config.json を AWS Systems Manager Parameter Store に移行する方法を記載します。

はじめに

前回のブログ「AWS Compute Optimizer にメモリのメトリクスを含める方法」では、CloudWatch Agent の config.json を設定するにあたり、RDPしてWindows OS内部から設定しました。これにより CloudWatch Agent の設定ファイルの理解は進んだかと思われますが、各サーバ内部に設定ファイルが存在していると、まとめて更新するときに非常に手間がかかります。この設定は現在「AWS Systems Manager Parameter Store」に外出しが可能です。

AWS Systems Manager パラメータストア

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-parameter-store.html

上記公式ドキュメントから引用します。

暗号化、通知、モニタリング、監査のために、以下の AWS のサービスとの統合を設定します。

AWS Key Management Service (AWS KMS)
Amazon Simple Notification Service (Amazon SNS)
Amazon CloudWatch
AWS CloudTrail

上記の通り、CloudWatch において SSM パラメータストアが利用可能です。今回は、前回設定した Config.json をこのSSM パラメータストアに移行する手順を紹介します。CloudWatch Agent の設定までは「AWS Compute Optimizer にメモリのメトリクスを含める方法」を先にご確認ください。

SSM パラメータストアに config.json を設定する

AWS Systems Manager ⇒ Parameter Store ⇒ Create parameter に進みます。

パラメータのNameに「AmazonCloudWatch-config」と今回は名付けました。以下の仕様にはご注意ください。

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 からファイルをダウンロードしたりすることはできません。

補足ですが、パラメータの名前は後から変更ができません。
TypeはStringのままで、Value に config.json を記載します。今回は前回と異なり、Agentのログファイルを出力するパスを記載しないものを用意しました。

{
    "metrics": {
        "metrics_collected": {
            "Processor": {
                "metrics_collection_interval": 60,
                "measurement": [
                    "% Idle Time",
                    "% Interrupt Time",
                    "% User Time",
                    "% Processor Time"
                ],
                "resources": [
                    "*"
                ]
            },
            "LogicalDisk": {
                "metrics_collection_interval": 60,
                "measurement": [
                    "% Free Space"
                ],
                "resources": [
                    "*"
                ]
            },
            "Memory": {
                "metrics_collection_interval": 60,
                "measurement": [
                    "Available Bytes",
                    "% Committed Bytes In Use"
                ]
            }
        },
        "append_dimensions": {
            "InstanceId": "${aws:InstanceId}",
            "InstanceType": "${aws:InstanceType}"
        },
        "aggregation_dimensions": [
            [
                "InstanceId",
                "InstanceType"
            ],
            []
        ]
    }
}

以前は冒頭に以下の内容を記載していたのですが、今回はこれを外して差分としています。

"agent": {
        "metrics_collection_interval": 60,
        "logfile": "C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\Logs\\amazon-cloudwatch-agent.log"
    },

画面右下の「Create parameter」を押下して作成を完了します。念のため完成したパラメータを確認します。

問題なさそうです。

SSM を実行する前に file_config.json を確認する

Windowsでは以下に記載するパスの配下に、「file_config.json」という名前のファイルができています。

C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs

これは、前回のブログで紹介しました、 config.json を読み込ませるための以下のコマンドを実行した際に作成されるファイルです。

./amazon-cloudwatch-agent-ctl.ps1 -a fetch-config -m ec2 -c file:config.json

このファイルの中身は、手動で作成したファイルである「config.json」と内容は同じであり、こちらが実際に CloudWatch Agent にて利用されている実態ファイルです。この後 SSM を利用して Parameter Store より config.json を配信しますが、それによりここがどう変化するのか確認します。

SSM から config.json のパラメータを配信する

SSM にて Run command で [AmazonCloudWatch-ManageAgent] を実行することで配信できます。公式ドキュメントでは「こちら」に記載があります。EC2 Instance には前ブログで設定をしました以下2つの IAM Role が付与されていることを SSM の実行前に確認してください。

  1. CloudWatchAgentServerPolicy
  2. AmazonSSMManagedInstanceCore

まずは SSM の Run command 実行コンソールより「AmazonCloudWatch-ManageAgent」を選択します。

選択したら、以下の項目を入力します。

「Optional Configuration Location」に先ほど設定したパラメータストアの値を入力します。今回は [AmazonCloudWatch-config] となります。Optional Restart ですが、デフォルト yes のままとします。サービスを再起動しない限り CloudWatch Agent に変更後の設定が反映されないため基本的には再起動してください。なお、CloudWatch Agent サービスが停止している状態であればこの「yes」によってサービスが起動しますのでサービスを起動したいという目的でも利用可能です。SSMを実行したい対象の Instance も選択できましたら、右下にある「Run」を押下して実行します。

Run command が正常に実行されたことが確認できました。

SSM を実行した後に file_config.json を確認する

Windowsでは以下に記載するパスの配下に、「file_config.json」という名前のファイルができていますと先ほど記載しました。

C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs

このパスを確認すると、ファイル名が変更されていることがわかります。

名称は拡張子なしの「ssm_AmazonCloudWatch-config」となっていました。

念のため、ssm_AmazonCloudWatch-config のファイルの中身を確認すると、上図の通りログのパス設定が削除された json が配置されており、このことからもSSM パラメータストアから配信されたことがわかります。

CloudWatch Agent の起動ログを確認する

以下のパスに出力されているログを確認してみます。

C:\ProgramData\Amazon\AmazonCloudWatchAgent\Logs

amazon-cloudwatch-agent.log が CloudWatch Agent の起動ログです。SSM パラメータストア の設定を行う前は、起動時に以下のログが出力されていました。

2020/07/16 04:39:07 Reading json config file path: C:\ProgramData\Amazon\AmazonCloudWatchAgent\\amazon-cloudwatch-agent.json ...
C:\ProgramData\Amazon\AmazonCloudWatchAgent\\amazon-cloudwatch-agent.json does not exist or cannot read. Skipping it.
2020/07/16 04:39:07 Reading json config file path: C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\file_config.json ...
Valid Json input schema.
No csm configuration found.
No log configuration found.
Configuration validation first phase succeeded

「Reading json config file path: C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\file_config.json」 とある通り、 config.json を読んでいたことがわかります。SSM パラメータストア の設定を行った後は、起動時に以下のログが出力されます。

2020/07/16 05:45:16 Reading json config file path: C:\ProgramData\Amazon\AmazonCloudWatchAgent\\amazon-cloudwatch-agent.json ...
C:\ProgramData\Amazon\AmazonCloudWatchAgent\\amazon-cloudwatch-agent.json does not exist or cannot read. Skipping it.
2020/07/16 05:45:16 Reading json config file path: C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\ssm_AmazonCloudWatch-config ...
Valid Json input schema.
No csm configuration found.
No log configuration found.
Configuration validation first phase succeeded

「Reading json config file path: C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\ssm_AmazonCloudWatch-config」とログが変化しています。このことから、SSM パラメータストアにて配信を行うと「C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs」配下に配置される設定ファイルが変更となることで、CloudWatch Agent の設定に変更が加わることがわかりました。

つまり、もし SSM パラメータストアから元のローカル config.json に戻されたい場合は、「amazon-cloudwatch-agent-ctl.ps1」を実行して頂ければ元の設定である file_config.json に戻すことも可能です。

まとめ

本ブログでは、前回のブログ「AWS Compute Optimizer にメモリのメトリクスを含める方法」で紹介した CloudWatch Agent の定義ファイルである config.json を AWS Systems Manager Parameter Store に移行する方法について記載しました。移行にあたり、設定がどのように CloudWatch Agent サービスへ反映されるのかも CloudWatch Agent の起動ログと共に解説しました。
SSM パラメータストアにすることで、サーバ内部に入らなくとも設定を反映できるようになるため、複数台の設定をまとめて管理する場合はSSM パラメータストアに外出しされることを推奨いたします。

補足:CentOSの場合は弊社ブログ「はじめてのCloudWatch Agent導入 (SSM & CentOS)」が参考になると思われます。

本ブログが何かのお役に立ちましたら幸いです。
ではまたお会いしましょう。

この記事を書いた人:佐竹 陽一(Yoichi Satake)。SRE2課所属。AWS資格12冠。2010年1月からAWSを利用してきました。AWSのコスト削減、最適化を得意としています。