---
title: "ホストエラーのアラートをTerraformで作って試すの段 | grasys blog"
url: "https://blog.grasys.io/post/fukushima/hosterroralert/"
description: "こんにちはgrasysの福嶌です。 ウマ娘面白いですね！僕の推しは グ ラ ス ワ ン ダ ー ちゃんです。 Google Compute Engineを利用/運用しているとホストエラーを意識することがあります。今回はTerraformを利用してCloud Monitoringでホストエラーのアラートを作成をしてみま…"
---

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

-   ![](/_astro/noicon.CTHOhNiB_1HMs6A.webp)[fukushima](/authors/fukushima/)
-   公開日：2021年4月7日
-   カテゴリー：[Tech](/categories/tech/)
-   タグ：[#Cloud Logging](/tags/cloud-logging/)[#Cloud Monitoring](/tags/cloud-monitoring/)[#Terraform](/tags/terraform/)

![ホストエラーのアラートをTerraformで作って試すの段](/_astro/og-image.DDSiu2Ny_XHpDd.webp)

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

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

## ホストエラーについて

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

> 参考: [仮想マシンでホストエラーが発生して再起動しました。何が起こったのですか？](https://cloud.google.com/compute/docs/faq?hl=ja#hosterror)

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

![物理ホストの障害によってCompute Engineインスタンスが再起動する流れ](/_astro/01-01-7-2bc76b18.BPPCaUju_Z2uPasH.webp)

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

### 今回のゴール

この記事では弊社では[Terraformをよく使うため](https://codezine.jp/article/detail/13697)TerraformでCloud Monitoringでホストエラーのアラートを作成しダミーのログを送って検知できることをゴールとします。

### 作成する流れ

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

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

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

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

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

Plain textcontent\_copy

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

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

Plain textcontent\_copy

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

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

![Cloud Loggingでcompute.instances.hostErrorを絞り込んだログ](/_astro/02-02-7-1024x373-2cde7bc2.BBUaoo4f_9qHxv.webp)

発生してる！

### tfファイルの作成

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

1.  ログベースの指標でホストエラーの指標を作成する場合はこのリソースを利用します。- [google\_logging\_metric](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/logging_metric)
2.  アラートの通知先を作成する場合はこのリソースを利用します。- [google\_monitoring\_notification\_channel](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/monitoring_notification_channel)
3.  アラートの作成はこのリソースを利用します。- [google\_monitoring\_alert\_policy](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/monitoring_alert_policy)

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

Plain textcontent\_copy

```
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](https://pypi.org/project/google-cloud-logging/)を使って作成します。

Plain textcontent\_copy

```
#!/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'
)
```

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

![ダミーのホストエラーログをCloud Monitoringが検知したアラート画面](/_astro/03-03-7-705x1024-1a7d8186.DBwKLcV7_2sAIrA.webp)

検知した！(おわり)

### 最後に

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

現場からは以上です！

## この記事を書いた人

[![](/_astro/noicon.CTHOhNiB_Z24aAgM.webp)](/authors/fukushima/)

### [fukushima](/authors/fukushima/)

fukushimaのプロフィールと執筆記事をご覧いただけます。

[プロフィールと記事一覧](/authors/fukushima/)
