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

こんにちはgrasysの福嶌です。 ウマ娘面白いですね!僕の推しは ちゃんです。

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

ホストエラーについて

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

参考: 仮想マシンでホストエラーが発生して再起動しました。何が起こったのですか?



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

HEA01

ライブマイグレーションは利用者側は特に意識することは少ないですがこのホストエラーはインスタンスの再起動が行われるため意識しなければいけません。 弊社でも数百大規模などの台数が多いプロジェクトなどでは月に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"

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

HEA02
発生してる!

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'
)

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

HEA03
検知した!(おわり)

最後に

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

現場からは以上です!