Akamai's cloud computing servicesのサーバー監視について
サーバーを運用していくためには、監視システムとの連携が不可欠です。サーバーを監視を行うサービスは様々ありますが、今回は株式会社はてなが開発したMackerelを利用して Akamai's cloud computing services のサーバーの監視を行う方法を紹介します。
尚、構築はすべてTerraformで行います。
Mackerel(マカレル)とは
「Mackerel」は、株式会社はてなが提供している、オンプレミス、マルチクラウドなど様々な環境に対応したSaaS型サーバー監視サービスです。サーバー監視に加えて、クラウドサービスのメトリックやイベントを可視化して、複雑なサービス環境も全体を俯瞰してシンプルに管理できます。
また、Kubernetesなどのコンテナ環境の監視や機械学習による検知も行うことができます。
使い易いUIと豊富なAPIによる総合的な監視も行うことができ、Terraformにも対応しています。
API Keyの準備
Terraformにて利用するAPI Keyの発行を行います。
以下を参考に、Linode API Keyを発行します。
以下を参考に、Mackerel API Keyを発行します。
取得したAPI KeyをTerraformを利用する端末でexportします。
export TF_VAR_mackerel_api_key=XXXXXXXXXXXXXXXXXXXXXXXXX
export TF_VAR_linode_token=XXXXXXXXXXXXXXXXXXXXXXXXX
TerraformでLinodeインスタンスとMackerelエージェントをインストールする
今回のTerraformのファイルは以下の構成で作成しています。
➜ mackerel tree ./
./
├── instance.tf #Linode インスタンスを作成とMackerelエージェンとのインストール
├── mackerel.tf #Mackerel監視設定
├── terraform.tf #Providerの設定
└── variables.tf #変数の設定
instance.tfの設定
Linode インスタンスを作成し、Mackerelエージェントのインストールを行います。
Mackerelの設定ファイルには、名前、Nginxのプロセス監視、Syslogの監視を設定しています。
# vim instance.tf
resource "linode_instance" "web" {
count = var.node_count
label = "mackerel-web-${count.index + 1}"
image = var.web.image
region = var.region
type = var.web.type
authorized_keys = ["${chomp(file(var.public_ssh_key))}"]
group = var.web.group
swap_size = 256
root_pass = random_string.password.result
private_ip = true
provisioner "remote-exec" {
inline = [
# install NGINX
"export PATH=$PATH:/usr/bin",
"apt-get -q update",
"mkdir -p /var/www/html/",
"mkdir -p /var/www/html/healthcheck",
"echo healthcheck > /var/www/html/healthcheck/index.html",
"echo node ${count.index + 1} > /var/www/html/index.html",
"apt-get -q -y install nginx",
# install Mackerel agent
"wget -q -O - https://mackerel.io/file/script/setup-all-apt-v2.sh | MACKEREL_APIKEY=${var.mackerel_api_key} sh",
"apt-get -q -y install mackerel-check-plugins",
# Configure Mackerel agent
"echo 'display_name = \"mackerel-web-${count.index + 1}\"' >> /etc/mackerel-agent/mackerel-agent.conf",
"echo 'roles = [\"Env:prd\", \"Role:web\"]' >> /etc/mackerel-agent/mackerel-agent.conf",
"echo '[plugin.checks.check_nginx]' >> /etc/mackerel-agent/mackerel-agent.conf",
"echo 'command = [\"check-procs\", \"--pattern\", \"nginx\"]' >> /etc/mackerel-agent/mackerel-agent.conf",
"echo '[plugin.checks.check_oom]' >> /etc/mackerel-agent/mackerel-agent.conf",
"echo 'command = [\"check-log\", \"--file\", \"/var/log/syslog\", \"--pattern\", \"Out of memory\"]' >> /etc/mackerel-agent/mackerel-agent.conf",
# restart Mackerel agent to apply the configuration
"systemctl restart mackerel-agent"
]
connection {
type = "ssh"
user = "root"
password = random_string.password.result
host = self.ip_address
}
}
}
mackerel.tfの設定
今回のTerraformでは、以下のMackerelの監視設定を記載しています。
- CPU
- メモリ
- ファイルシステム
- 機械学習を用いたロール内異常検知
# vim mackerel.tf
resource "mackerel_monitor" "cpu_high" {
name = "cpu % is high"
is_mute = false
notification_interval = 10
host_metric {
metric = "cpu%"
operator = ">"
warning = 80
critical = 90
duration = 3
scopes = ["env:prd"]
}
}
resource "mackerel_monitor" "mem_high" {
name = "mem % is high"
is_mute = false
notification_interval = 10
host_metric {
metric = "memory%"
operator = ">"
warning = 80
critical = 90
duration = 3
scopes = ["env:prd"]
}
}
resource "mackerel_monitor" "filesystem_high" {
name = "filesystem % is high"
is_mute = false
notification_interval = 10
host_metric {
metric = "filesystem%"
operator = ">"
warning = 80
critical = 90
duration = 3
scopes = ["env:prd"]
}
}
resource "mackerel_monitor" "web_anomaly_detection" {
name = "web_anomaly detection"
notification_interval = 10
anomaly_detection {
scopes = ["role:web"]
warning_sensitivity = "insensitive"
critical_sensitivity = "normal"
max_check_attempts = 3
}
}
terraform.tfの設定
terraform.tfではlinodeとmackerelのProvider設定を行います。
# vim terraform.tf
terraform {
required_providers {
linode = {
source = "linode/linode"
}
mackerel = {
source = "mackerelio-labs/mackerel"
version = "~> 0.0.1"
}
}
}
provider "linode" {
token = "${var.linode_token}"
}
provider "mackerel" {
api_key = "${var.mackerel_api_key}"
}
variables.tfの設定
variables.tfにこれまで記載したTerraformの変数の設定を行います。
# vim variables.tf
variable "linode_token" {}
variable "mackerel_api_key" {}
variable "node_count" {
default = 2
}
variable "region" {
default = "ap-northeast"
}
variable "web" {
default = {
image = "linode/ubuntu20.04"
type = "g6-nanode-1"
group = "web"
}
}
variable "public_ssh_key" {
default = "~/.ssh/xxxxxxxxxxxxxxxxx.pub"
}
resource "random_string" "password" {
length = 32
special = true
upper = true
lower = true
numeric = true
}
Terraformの実行
terraformを実行して、設定を反映させます。
terraform init
terraform apply
Linodeのインスタンスが2台構築され、Mackerelエージェントの導入と監視設定が行われます。
Mackerelの確認
Mackerelのコンソールから2台のホストが登録されていることを確認します。
各ホストのグラフの詳細にて、正常に値が取得できていることを確認します。
監視設定が正しく動作していることを確認します。
今回は試しにNginxのプロセスを落としてみて、アラートが来ることを確認してみました。
まとめ
Terraformを利用することでAkamai's cloud computing servicesとMackrelを一括で扱うことができ、サーバーの作成から監視設定をまとめて行うことができます。
ぜひ様々なサービスと連携して、Akamai's cloud computing servicesの運用に活用していただければと思います。
関連記事
アカマイ・テクノロジーズ合同会社はQiitaでAkamai's cloud computing services関連など開発者向けの記事を掲載しております。