オンプレサーバーの監視をCloudWatchでやってみた – その1

環境・プラットフォーム

背景

Zabbixを使っても良かったのですが、CloudWatchは専用サーバーも用意しなくいいし、UIも使い慣れているし属人化を防ぐうえでも優位な気がしたので監視サーバーとしてCloudWatchを選択しました。

実際の設定はもう少し複雑ですが、本記事で紹介する内容は以下を前提としています。

収集したいメトリクス:

  • CPU使用率
  • メモリ使用率
  • Disk使用率
  • 各種ログ(Laravelログが対象)

監視対象(例):

  • DBサーバー
  • APIサーバー
  • WEBサーバー
  • Redisサーバー

設定の流れ

CloudWatchでサーバー監視を行う場合、CloudWatch Agentを各サーバーにインストールして設定ファイルを反映させます、この設定ファイルは基本的にAWSパラメータストアに保存しておき、各サーバーにダウンロードして反映させるのが一般的なようです。
実際に私が実施した手順はバラバラで非効率的でしたが、以下の流れで設定していけば効率的だったと思います。

  1. 設定ファイルの設計・作成
    • どういった設定ファイルを用意すべきか検討します
    • 設定はAWSパラメータストアに保存
  2. IAMでAPIキー&シークレットを生成
    • IAMで専用のユーザーを作成しAPIキー&シークレットを生成します
  3. 各サーバーで設定ファイルを反映
    • AWS認証情報設定
    • CloudWatch Agentインストール&設定
  4. 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ダッシュボードやアラームで異常検知する設定をご紹介します。



オフショア開発ならCRAID!

オフショア開発とは、システム開発業務などを海外の開発会社や海外子会社に委託することです。

CRAIDは東証プライム上場のフリービット株式会社の子会社です。CRAIDのオフショア開発拠点「フルスピードテクノロジーズ」は、当初は月間3000億ものリクエスト処理にも対応できる自社システム開発を行うためのオフショア開発部門として始まりました。各グループ会社の開発やクライアント様の受託開発やラボ型開発も多く手掛けております。

CRAIDやオフショア開発に関して、お気軽にお問い合わせください。

この記事を書いた人

社内経歴としては、社内システムの開発・保守から始まり、セブ開発拠点の立ち上げメンバーとしてフィリピン駐在、その後日本に帰国し受託開発やオフショア開発事業に参画し、様々な開発プロジェクトに参加しております。

taroshinをフォローする
環境・プラットフォーム開発・運用ツール開発技術
CRAID オフショア開発ブログ
タイトルとURLをコピーしました