ayumin.log

読みにくかったら脳内sedで整形してね

New Relic で始める監視

この記事は、HUITアドベントカレンダー 14日のものです。

qiita.com

前日はかりんとうさん

qiita.com

明日はkondoさんの記事です。

ブロックチェーンのパワー💪 - ああ's project

何をするの?

New Relic と Terraform で AWS 環境を監視も含めて自動構築する

監視の必要性

一般的にWEBアプリケーションは、開発する時間よりも運用する時間の方が長い。

特に最近ではDevOpsという単語に象徴されるように、開発と運用のサイクルを回し続けるスタイルが一般化されつつある。

ただサーバでアプリケーションを動かすだけでなく、アプリケーションのデータ(メトリクス)を収集分析し、それを元に更に開発を進めていくというスタイルで、それを実際に行うSREという業種もある。

まだすべての会社でとはいかないが、日本でも規模が大きいWEB系企業を中心にSREの導入が進んでいる。

New Relic とは?

簡単に言えば多機能監視SaaSである。詳しくは以下リンクを参照。

newrelic.com

特にアプリケーションのメトリクスを取るAPMが有名だが、今回は触れない。

内部監視から外形監視までできる上、NRQLというSQLライクなクエリ言語を備えており、メトリクスを取得するだけでなく、それを集計した見やすいダッシュボード作成や、アラートの作成も可能となっている。

アラートは勿論Slackなどにも投下可能。

Terraform とは?

インフラ構築自動化ツール。Infrastructure as Code の代表的なもので、普段はクラウド環境の構築自動化に使われる場合が多い。

様々な環境をproviderという形に抽象化し、HCLという一つの言語のみでそれら環境の構築を宣言的に記述できる。

勿論コードなので記述した環境はgit管理することもできるし、それを元にコマンド1つで環境の構築・破棄もできる。

そしてここからが本題だが、この環境というのはAWSGCPといったクラウドプロバイダだけでなく、ローカルのDockerコンテナ、主要クラウド事業者以外の管理など様々な場面で使える。

そして New Relic の provider も提供されており、Terraformによる自動構築が可能である。

つまり、Terraform 1つで、 AWSの環境を構築し、それに合う監視までも自動構築ができる。

これをしようというのが今回のテーマ。

今回構築するもの

今回はEC2を1インスタンス立てて、そのCPU使用率の監視を New Relic で行う。

実際にはEC2以外のRDSなどを使うケースもあるし、監視対象も外形監視を含め様々なものが必要だが、今回は簡易化のためそれらは省略している。

なおそれぞれのproviderのアカウント設定、Terraformのversion指定等は割愛する。その辺の細かい部分についてはそれぞれのdocを参照。

また、今回はデータ取得は Cloudwatch Metrics を使用する。その連携は

newrelic.com

の手順どおりに行う。

# EC2の構築
data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

resource "aws_instance" "nr_test" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t3.micro"
}


# New Relic の構築
resource "newrelic_alert_policy" "ec2" {
  name = "ec2"
}

resource "newrelic_nrql_alert_condition" "ec2_alert" {
  account_id                     = <NewRelic Account ID>
  policy_id                      = newrelic_alert_policy.ec2.id
  type                           = "static"
  name                           = "ec2"
  enabled                        = true
  violation_time_limit_seconds   = 360
  aggregation_window             = 60
  aggregation_method             = "event_flow"
  aggregation_delay              = 120
  expiration_duration            = 120
  open_violation_on_expiration   = true
  close_violations_on_expiration = true

  nrql {
    # EC2のインスタンスごとにCPU使用率の平均を取る
    query = "SELECT average(ec2. CPUUtilization) FROM Metrics FACET aws.instanceid
  }

  critical {
    operator              = "above"
    threshold             = 80 # CPU使用率80%以上でアラート
    threshold_duration    = 300
    threshold_occurrences = "ALL"
  }

  warning {
    operator              = "above"
    threshold             = 70
    threshold_duration    = 300
    threshold_occurrences = "ALL"
  }

まとめ

簡易的に、Terraformを使ってEC2とその監視基盤の自動構築をした。

全く関係ない雑記

最近作業中にBGMで色々聞いてるが、最近聞いた中だとマハラージャンの曲が良かった。