背景
Zabbixを使っても良かったのですが、CloudWatchは専用サーバーも用意しなくいいし、UIも使い慣れているし属人化を防ぐうえでも優位な気がしたので監視サーバーとしてCloudWatchを選択しました。
実際の設定はもう少し複雑ですが、本記事で紹介する内容は以下を前提としています。
収集したいメトリクス:
- CPU使用率
- メモリ使用率
- Disk使用率
- 各種ログ(Laravelログが対象)
監視対象(例):
- DBサーバー
- APIサーバー
- WEBサーバー
- Redisサーバー
設定の流れ
CloudWatchでサーバー監視を行う場合、CloudWatch Agentを各サーバーにインストールして設定ファイルを反映させます、この設定ファイルは基本的にAWSパラメータストアに保存しておき、各サーバーにダウンロードして反映させるのが一般的なようです。
実際に私が実施した手順はバラバラで非効率的でしたが、以下の流れで設定していけば効率的だったと思います。
- 設定ファイルの設計・作成
- どういった設定ファイルを用意すべきか検討します
- 設定はAWSパラメータストアに保存
- IAMでAPIキー&シークレットを生成
- IAMで専用のユーザーを作成しAPIキー&シークレットを生成します
- 各サーバーで設定ファイルを反映
- AWS認証情報設定
- CloudWatch Agentインストール&設定
- CloudWatchダッシュボードとアラームの設定
- 記事が長くなるため、別記事で書こうと思います
設定ファイルの設計・作成
どういった設定ファイルを用意すべきか検討しますが、以下のポイントを考慮します。
- 1つのサーバーに複数の設定ファイルを適用することができる
- 取得するメトリクスは同じものである(CPU, Mem, Disk)
- ログ収集は管理画面サーバー、APIサーバーだけである
- 取得メトリクスは絞らないと料金がエグいことになるため、最低限にすること
まず、「取得するメトリクスは同じものである」ので、1つ「メトリクス収集用の設定ファイル」を作成します。ログ収集は各サーバーで対象のログファイルのパスが異なるため管理画面サーバー、APIサーバーで別々の設定ファイルを用意します、そのため以下3つの設定ファイルを用意すれば良さそうです。
- メトリクス収集用(全サーバーに適用)
- 管理画面サーバーのログ収集用
- APIサーバーのログ収集用
メトリクス収集用設定ファイルの例
極力取得するメトリクス(measurement)を少なくしているのと、diskでは “/” のパーティションのみディスク使用率を取得するようにしています、これを指定しないと全パーティションのディスク使用率を取得することになり料金が上がります。注意すべき点は取得メトリクスの種類の数によって料金が決まるところです。
パラメータストア上の名前:AmazonCloudWatch-prd-metrics
{
"agent": {
"metrics_collection_interval": 30,
"run_as_user": "root"
},
"metrics": {
"metrics_collected": {
"cpu": {
"measurement": [
"cpu_usage_user"
],
"metrics_collection_interval": 30,
"resources": [
"*"
],
"totalcpu": true
},
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 30,
"resources": [
"/"
]
},
"diskio": {
"measurement": [
],
"metrics_collection_interval": 30,
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 30
},
"net": {
"measurement": [
],
"metrics_collection_interval": 30,
"resources": [
"*"
]
},
"swap": {
"measurement": [
],
"metrics_collection_interval": 30
}
}
}
}以下ログ収集用設定ファイルの例
細かい設定内容は端折りますが、file_pathがサーバーごとに違うため、対象サーバー毎に作成します。
パラメータストア上の名前:AmazonCloudWatch-prd-api-logs
{
"agent": {"metrics_collection_interval": 30, "run_as_user": "root"},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/www/html/storage/logs/laravel-*.log",
"log_group_name": "prd-api-logs",
"auto_removal": false,
"log_stream_name": "{hostname}",
"timestamp_format": "[%Y-%m-%dT%H:%M:%S.%z]"
}
]
}
}
}
}IAMでAPIキー&シークレットを生成
以下「許可ポリシー」を設定した専用のIAMユーザーを作成し、アクセスキーを生成します。
- AmazonSSMManagedInstanceCore
- CloudWatchAgentAdminPolicy
- CloudWatchAgentServerPolicy
各サーバーで設定ファイルを反映
個々からは各サーバーにSSHして作成した設定ファイルを反映していきます。
ちなみにOSはUbuntu 22.04。
AWS認証情報設定
rootユーザーにAWS Profileを設定しておきます。
sudo mkdir /root/.aws
sudo vim /root/.aws/credentials
—------------------------------------
[AmazonCloudWatchAgent]
aws_access_key_id = ******
aws_secret_access_key = *******
region = ap-northeast-1
—------------------------------------CloudWatch Agent設定
# CloudWatch Agentをインストール
curl -LO https://s3.ap-northeast-1.amazonaws.com/amazoncloudwatch-agent-ap-northeast-1/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
# 設定ファイルをパラメータストアからダウンロードして反映
sudo amazon-cloudwatch-agent-ctl -a fetch-config -m onPremise -s -c ssm:
AmazonCloudWatch-prd-metrics
# 追加でログ収集用の設定ファイルを反映させる場合、以下コマンドで `append-config` します。
sudo amazon-cloudwatch-agent-ctl -a append-config -m onPremise -s -c ssm:AmazonCloudWatch-prd-api-logsここで数分待つとAWSコンソールのCloudWatch画面「すべてのメトリクス」にて「CWAgent」という項目が出現するはずです。
もしうまくいかない or エラーが出る場合は以下コマンドで確認できるはずです。
# ログが見たければ以下ファイルに書き込まれている
tail /var/log/amazon/amazon-cloudwatch-agent/amazon-cloudwatch-agent.log
# または以下コマンドでもログとステータスが確認できます
sudo systemctl status amazon-cloudwatch-agent本記事では一旦欲しいメトリクスをCloudWatchに飛ばす設定までを記事にしてみましたが、最大の考慮ポイントはAWS料金で、取得したいメトリクスや監視対象のサーバー数によっては高額になり「Zabbixのほうが良かった」となる可能性もあります。
例えば1サーバーで12個のメトリクスを監視する場合、月額3.60ドルとなり、10サーバーで36ドルになります(参考)、ただしこのメトリクスの種類ですが、試算が難しいので最初のうちはAWSの「Cost Explorer」画面で今月の日別のコストを確認することをおすすめします。
次回は多数の監視対象サーバーがあった場合に、どのようにアラームを設定しているか記事にしたいと思います。
次の記事ではCloudWatchダッシュボードやアラームで異常検知する設定をご紹介します。



