Akamai's cloud computing servicesのサーバーをMackerelで監視する

# Akamai's cloud computing servicesのサーバー監視について

サーバーを運用していくためには、監視システムとの連携が不可欠です。サーバーを監視を行うサービスは様々ありますが、今回は株式会社はてなが開発したMackerelを利用して Akamai's cloud computing services のサーバーの監視を行う方法を紹介します。
尚、構築はすべてTerraformで行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/bbafbd76-2695-231d-3df2-688cd3306daa.png)

## Mackerel（マカレル）とは

「Mackerel」は、株式会社はてなが提供している、オンプレミス、マルチクラウドなど様々な環境に対応したSaaS型サーバー監視サービスです。サーバー監視に加えて、クラウドサービスのメトリックやイベントを可視化して、複雑なサービス環境も全体を俯瞰してシンプルに管理できます。
また、Kubernetesなどのコンテナ環境の監視や機械学習による検知も行うことができます。
使い易いUIと豊富なAPIによる総合的な監視も行うことができ、Terraformにも対応しています。

https://ja.mackerel.io

## API Keyの準備

Terraformにて利用するAPI Keyの発行を行います。

以下を参考に、Linode API Keyを発行します。

https://www.linode.com/docs/products/tools/api/get-started/#get-an-access-token

以下を参考に、Mackerel API Keyを発行します。

https://mackerel.io/ja/api-docs/

取得した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の監視を設定しています。

```terraform
# 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
- メモリ
- ファイルシステム
- 機械学習を用いたロール内異常検知


https://registry.terraform.io/providers/mackerelio-labs/mackerel/latest/docs/resources/monitor


```terraform
# 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設定を行います。

```terraform
# 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の変数の設定を行います。


```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台のホストが登録されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/20ea0714-ebbe-15e5-9992-53f6a427b9dd.png)

各ホストのグラフの詳細にて、正常に値が取得できていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/d6b73591-45c8-fb45-ff34-d43a5ac6132b.png)

監視設定が正しく動作していることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/5a4cd91b-952c-8b1a-573d-44160bff218d.png)

今回は試しにNginxのプロセスを落としてみて、アラートが来ることを確認してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/3daf6ae7-096c-a92d-0d42-f1961ed544d4.png)

# まとめ

Terraformを利用することでAkamai's cloud computing servicesとMackrelを一括で扱うことができ、サーバーの作成から監視設定をまとめて行うことができます。
ぜひ様々なサービスと連携して、Akamai's cloud computing servicesの運用に活用していただければと思います。

# 関連記事

アカマイ・テクノロジーズ合同会社はQiitaでAkamai's cloud computing services関連など開発者向けの記事を掲載しております。

https://qiita.com/xenbase/items/52e2956a64cedc772bd9