grasys blog

ホストエラーのアラートをTerraformで作って試すの段

文●fukushima/grasys 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

本記事はgrasysが提供する「grasys blog」に掲載されたホストエラーのアラートをTerraformで作って試すの段を再編集したものです。

 こんにちはgrasysの福嶌です。 ウマ娘面白いですね!僕の推しはグラスワンダーちゃんです。

 Google Compute Engineを利用/運用しているとホストエラーを意識することがあります。今回はTerraformを利用してCloud Monitoringでホストエラーのアラートを作成をしてみましょう。

ホストエラーについて

 Google Compute Engineを利用/運用しているとホストエラーを意識することがあります。今回はTerraformを利用してCloud Monitoringでホストエラーのアラートを作成を行ないます。 ホストエラーとは、仮想マシンをホストしている物理マシンで、仮想マシンがクラッシュするようなハードウェアまたはソフトウェアの問題が発生したことを意味します。

 ホストエラーについて大雑把に説明すると以下の図のようになります。

 ライブマイグレーションは利用者側は特に意識することは少ないですがこのホストエラーはインスタンスの再起動が行なわれるため意識しなければいけません。 弊社でも数百大規模などの台数が多いプロジェクトなどでは月に2~3件ほど発生します。(ただしリージョンや月によって変動するので決まって発生する訳でもありません!)

今回のゴール

 この記事では弊社ではTerraformをよく使うためTerraformでCloud Monitoringでホストエラーのアラートを作成しダミーのログを送って検知できることをゴールとします。

作成する流れ

 今回アラートを作成する流れとしては以下の設定をTerraformで行ないます。

 1.ログベースの指標でホストエラーの指標を作成する
 2.アラートの通知先を作成
 3.アラートの作成

 その後、最後に実際に検知するかダーミーのログを送ってテストを行ないます。

ホストエラーのログについて

 ホストエラーはCloud loggingにVMインスタンスのcompute.instances.hostErrorとして出力されます。今回はログベースの指標を作るにあたり以下の条件で絞ります。

 resource.type=: gce_instance # ログのリソース
 operation.producer: compute.instances.hostError # ホストエラーが発生したイベント

 そのためフィルタする条件は以下になります。

 resource.type="gce_instance" operation.producer="compute.instances.hostError"

 試しに上記のフィルタでログを出してみましょう。(試したのは長いこと使われている社内のプロジェクト)

 発生してる!

tfファイルの作成

 それではtfファイルを作りましょう。

 1.ログベースの指標でホストエラーの指標を作成する場合はこのリソースを利用します。- google_logging_metric

 2.アラートの通知先を作成する場合はこのリソースを利用します。- google_monitoring_notification_channel

 3.アラートの作成はこのリソースを利用します。- google_monitoring_alert_policy

 そんなこんなで完成したtfファイルは以下になります。

resource "google_logging_metric" "grasysblog-loggingMetric" {
  name        = "hostError/metric"
  description = "ホストエラーのログベースの指標"
  filter      = "resource.type=\"gce_instance\" operation.producer=\"compute.instances.hostError\""
  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "INT64"
  }
}

# 今回はメールに送信します
resource "google_monitoring_notification_channel" "grasysblog-notification-fukushima" {
  display_name = "メールアドレスは☆(ゝω・)vヒミツッ"
  type         = "email"
  labels = {
    email_address = "メールアドレスは☆(ゝω・)vヒミツッ"
  }
}

resource "google_monitoring_alert_policy" "grasysblog-hostError-alertPolicy" {
  display_name          = "compute.instances.hostError"
  combiner              = "OR"
  notification_channels = [google_monitoring_notification_channel.grasysblog-notification-fukushima.name,]
  conditions {
    display_name      = "compute.instances.hostError"
    condition_threshold {
      filter          = "metric.type=\"logging.googleapis.com/user/hostError/metric\" AND resource.type=\"gce_instance\""
      comparison      = "COMPARISON_GT"
      duration        = "0s"
      threshold_value = 0
      aggregations {
        alignment_period   = "60s"
        per_series_aligner = "ALIGN_SUM"
      }
    }
  }

  documentation {
    mime_type = "text/markdown"
    content   = "本文: ブログで書いたやつ"
  }

  depends_on = [
    google_logging_metric.grasysblog-loggingMetric,
  ]
}

 これをapplyすれば諸々作成されアラートも作成されます! しかし待っていてもホストエラーは発生しません。次にダミーのログを流して実際に検知をさせてみましょう。

テストをしてみる

 実際にログを送るコード書いてみましょう(filterに引っかかればいい書き殴りコードを!)今回はPythonでgoogle-cloud-loggingを使って作成します。

#!/usr/bin/env python
#coding:utf-8

import google.cloud.logging

res = google.cloud.logging.Resource(
    type="gce_instance",
    labels = {
        "project_id": "grasys-dev",
        "instance_id": "xxxxxxxxxx",
        "zone": "asia-northeast1-a",
        },
)

log_name = "compute.googleapis.com%2Factivity_log"
client = google.cloud.logging.Client()
logger = client.logger(log_name)
logger.log_struct(
    {"event_subtype": "compute.instances.hostError.test"},
    operation={"producer": "compute.instances.hostError"},
    resource=res,
    severity='INFO'
)

 そしたらこのスクリプトを実行してみましょう。そうすると…

 検知した!(おわり)

最後に

 ホストエラーが発生しても、焦らずとりあえず深呼吸をしてからプロセスが起動してるか確認する。

 現場からは以上です!

■関連サイト

過去記事アーカイブ

2021年
03月
04月
05月
06月
07月
08月
09月
10月
11月
2020年
04月
05月
08月
09月
10月
11月
12月
2018年
09月
2017年
06月
2014年
07月