CloudWatch AgentをEC2にログインせずに設定してみた

はじめに

こんにちは、望月です。

CloudWatch Agentの設定をSystems Manager(SSM)を利用しEC2にログインせずに設定してみました。CLI操作が苦手な人や、複数台に対し処理を行うことができるため台数多くて1台づつログインし設定するのが大変といった方に向いているかと思います。

やってみた

前提

対象のEC2はすでに作成済みでSSMやCloudWatchを利用するため、パブリックIPが割り当てられています。 プライベートIPのみでインターネット接続ができない場合、別途PrivateLinkの設定が必要となります。下記ブログを参考に設定しましょう。

プライベートサブネットに配置したEC2にAWS Systems Manager Session Managerを使ってアクセスする

CloudWatch Agentでちょっとハマった話

また、プロセス情報取得のため「httpd(apache)」がインストール済みとなります。

  • Amazon Linux 2
    • amazon-ssm-agent
    • バージョン:2.3.372.0
    • httpd
    • バージョン:2.4.39-1

IAMロールの作成

マネージメントコンソール:『IAM』 → 『ロール』

EC2に割り当てるIAMロールを作成します。例で「ec2-cloudwatch-role」という名前をつけています。

  • アタッチするマネージドポリシーは以下2つになります。
    • AmazonEC2RoleforSSM
    • CloudWatchAgentServerPolicy

IAMロールのEC2割り当て

マネージメントコンソール:『EC2』 → 『インスタンス』

対象のEC2に先程作成したIAMロールを割り当てします。

SSMにEC2インスタンスが認識されたことを確認

マネージメントコンソール:『EC2』 → 『マネージドサービス』

SSMの対象として、EC2インスタンスが認識されたことを確認します。リトライのタイミングなどで認識に時間がかかる可能性があるため、必要であれば、EC2インスタンスの再起動を行います。

CloudWatch Agentのインストール

マネージメントコンソール:『EC2』 → 『コマンドの実行』

CloudWatch Agentのインストールを行います。対象のEC2を選択、下記指定し、実行します。

  • コマンドのドキュメント: AWS-ConfigureAWSPackage
    • Action: install
    • Name: AmazonCloudWatchAgent
    • Version: latest

コマンドのドキュメントを指定します。

Action、Name、Versionを指定します。

パラメータストアに設定追加

マネージメントコンソール:『EC2』 → 『パラメータストア』

パラメータストアにCloudWatchの設定を追加します。パラメータストアで設定を管理することで、複数サーバで同一設定を行う場合など、大変便利です。

ここでは設定をLinuxとapache、用途ごとに分けています。マネージドポリシーの権限で読み込み可能なパラメータストアが「AmazonCloudWatch-*」となっているため、名前をつけるときは気をつけましょう。

設定の詳細については、下記ドキュメントを確認してください。

CloudWatch エージェント設定ファイルを手動で作成または編集する - Amazon CloudWatch

AmazonCloudWatch-linux

Linux用の設定になります。CPU, メモリ, ディスク及びmessagesログを転送する設定を入れています。

{
    "metrics": {
        "append_dimensions": {
            "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
            "ImageId": "${aws:ImageId}",
            "InstanceId": "${aws:InstanceId}",
            "InstanceType": "${aws:InstanceType}"
        },
        "metrics_collected": {
            "cpu": {
                "measurement": [
                    "cpu_usage_idle",
                    "cpu_usage_iowait",
                    "cpu_usage_user",
                    "cpu_usage_system"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ],
                "totalcpu": false
            },
            "disk": {
                "measurement": [
                    "used_percent",
                    "inodes_free"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "diskio": {
                "measurement": [
                    "io_time"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "mem": {
                "measurement": [
                    "mem_used_percent"
                ],
                "metrics_collection_interval": 60
            },
            "swap": {
                "measurement": [
                    "swap_used_percent"
                ],
                "metrics_collection_interval": 60
            }
        }
    },
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/log/messages",
                        "log_group_name": "messages",
                        "log_stream_name": "{instance_id}"
                    }
                ]
            }
        }
    }
}

AmazonCloudWatch-linux-web

apache用の設定になります。プロセス及びerrorログを転送する設定を入れています。

プロセスについては"pid_file"で作成プロセスを見るほかに"exe"でプロセスの名前なども見ることができます。

procstat プラグインでプロセスメトリクスを収集する - Amazon CloudWatch

{
    "metrics": {
        "metrics_collected": {
            "procstat": [
                {
                    "pid_file": "/var/run/httpd/httpd.pid",
                    "measurement": [
                        "cpu_time",
                        "cpu_usage",
                        "memory_locked",
                        "memory_rss",
                        "memory_vms",
                        "num_threads",
                        "pid",
                        "pid_count"
                    ]
                }
            ]
        }
    },
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/log/httpd/error_log",
                        "log_group_name": "errorlog",
                        "log_stream_name": "{instance_id}"
                    }
                ]
            }
        }
    }
}

CloudWatch Agentに設定反映

マネージメントコンソール:『EC2』 → 『コマンドの実行』

パラメータストアに追加したCloudWatchの設定をEC2インスタンスに反映させます。

  • コマンドのドキュメント: AmazonCloudWatch-ManageAgent
    • Action: configure
    • Mode: ec2
    • Optional Configuration Source: ssm
    • Optional Configuration Location: AmazonCloudWatch-linux
    • Optional Restart: yes

コマンドのドキュメントを指定します。

Action、Mode、Optional Configuration、Optional Restartを指定します。

引き続き、apache用の設定を反映します。Actionが「configure (append)」と設定の追加となるので注意しましょう。

  • コマンドのドキュメント: AmazonCloudWatch-ManageAgent
    • Action: configure (append)
    • Mode: ec2
    • Optional Configuration Source: ssm
    • Optional Configuration Location: AmazonCloudWatch-linux-web
    • Optional Restart: yes

CloudWatchの確認

マネージメントコンソール:『CloudWatch』 → 『メトリクス』 and 『ログ』

メトリクス及びログを確認し、対象のEC2インスタンスの情報が増えていることを確認します。ログについてはCloudWatch Logsではログは監視用途の一時的な保管を行う形とし、長期保存の場合はS3で行ったほうがコストを抑えることができるため、必要に応じ保持期間を変更するのがオススメです。

CloudWatchのメトリクス

CloudWatchのロググループ

まとめ

EC2にログインせずにCloudWatch Agentのインストールを行い、CloudWatchで必要な情報を取れるように設定してみました。Systems Managerを活用することで、簡単に設定することができます。

Systems Managerは、ほかにも様々なことができるので、ぜひ活用していきましょう!