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

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

検知した!(おわり)

最後に

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

現場からは以上です!


株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。

grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud (GCP)、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。

お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。


採用情報
お問い合わせ