Oracle Cloud Infrastructure コンピュート・インスタンスの死活監視

### はじめに
Oracle Cloud Infrastructure（OCI）の死活監視について記載しています。OCIのMonitoringサービスとアラーム機能を使用して、特定の閾値を超えた場合に通知を受け取る仕組みを構築します。

公式ドキュメントの「リソースが稼働中または停止の例」にある通り、CpuUtilizationメトリックを利用しての死活監視を行っております。

https://docs.oracle.com/ja-jp/iaas/Content/Monitoring/Concepts/alarmsbestpractices.htm#createsets__UpDownExample


### 環境構築
#### 開発準備
今回も環境はTerraformで構築しています。ソースコードは以下となります。
```tf
# OCIプロバイダーの設定
provider "oci" {
  region = "ap-tokyo-1"
  auth   = "InstancePrincipal"
}

# 通知トピックの作成
resource "oci_ons_notification_topic" "test_notification_topic" {
  compartment_id = var.monitoring_compartment_ocid
  name           = "TestNotificationTopic"
  description    = "Notification topic for test alerts"
}

# 通知サブスクリプションの作成（例: Email）
resource "oci_ons_subscription" "test_notification_subscription" {
  compartment_id = var.monitoring_compartment_ocid
  topic_id       = oci_ons_notification_topic.test_notification_topic.id
  protocol       = "EMAIL"
  endpoint       = var.notification_email
}

# アラームの作成（CPU使用率が80%を超えた場合に通知）
resource "oci_monitoring_alarm" "cpu_usage_alarm" {
  compartment_id              = var.monitoring_compartment_ocid
  display_name                = "High CPU Usage Alarm"
  namespace                   = "oci_computeagent"
  query                       = "CpuUtilization[1m]{resourceId = \"${var.instance_id}\"}.mean() > 80"
  severity                    = "CRITICAL"
  is_enabled                  = true
  metric_compartment_id       = var.monitoring_compartment_ocid
  body                        = "CPU usage is above 80%."
  destinations                = [oci_ons_notification_topic.test_notification_topic.id]
  repeat_notification_duration = "PT1H"
  pending_duration            = "PT5M"
}

# 変数の定義
variable "monitoring_compartment_ocid" {
  description = "The OCID of the compartment for monitoring resources"
}

variable "notification_email" {
  description = "The email address to receive notifications"
}

variable "instance_id" {
  description = "The OCID of the Compute instance to monitor"
}
```

Terrafoemで詰まったポイント
 - インスタンスの指定方法
TFファイルの通り以下で指定してるのですが、このインスタンスの指定の仕方がわからなくwebやドキュメント見てもわからなかったので、今回もChatGPT先生に聞きました。``\"``の箇所など自力では難しいだろうなぁと思いました。

```
query    = "CpuUtilization[1m]{resourceId = \"${var.instance_id}\"}.mean() > 80"
```


Terraformコードを実行する際に、対象インスタンスのOCIDや通知先のメールアドレス、コンパートメントIDを指定します。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/db64cbd7-7cbc-c2a7-510f-87154e3ee2d3.png)


### 構築環境確認
構築した監視システムが正しく設定されているかどうかを確認するため、以下の手順で、通知トピック、サブスクリプション、アラームが正しく設定されていることを確認します。

1. 通知トピックの確認
OCIコンソールの「開発者サービス > 通知 > トピック」メニューから、作成されたトピックを確認しました。
(付箋で隠している箇所はアラートが発報される私のメールアドレスが入っています)
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/88233d7e-39e8-5002-e630-4ee4f300e815.png)


1. 通知サブスクリプションの確認
通知を受け取るためのサブスクリプション設定が正しいかどうかを確認します。トピックが作成されると、設定したメールアドレス宛に確認メールが届きます。ここで「Confirm subscription」をクリックします。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/9734b587-a504-1e1b-a442-a3159367b898.png)

1. サブスクリプションの検証結果
「Confirm subscription」をクリックすると、``「Subscription confirmed」``と表示される画面に遷移します。この画面が表示されることで、通知先メールアドレスが正しくサブスクライブされていることが確認できます。これでアラームが発生した場合に通知を受け取ることができます。(付箋で隠している転移はアラート発砲先の私のメールアドレスが入っています)
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/b66638b1-3232-e18e-7c28-319de3524e38.png)

1. アラームの確認
アラームが正しく設定されていることを確認します。コンソールの「監視および管理 > モニタリング > アラームの定義」に移動し、作成した「High CPU Usage Alarm」が存在し、正しく設定されていることを確認します。

![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/1aadbdcf-2672-95ed-bbc7-dd70335f5401.png)


### アラート発報
監視アラートが正常に動作するかを確認するため、CPU使用率が閾値を超えたときにアラートが発報されるかをテストします。

1. アラート情報の事前確認
事前にアラートが、CPUが``80%``を超えた時になっていることを確認します。
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/76901610-6bce-d478-77e8-8d2f5818e9e4.png)

1. アラームの設定変更
テストのために、アラーム条件を一時的に変更します。CPU使用率が``0%``を超えたときにアラートを発報するように設定を変更します。
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/a229177c-1577-ce9e-9453-3416d8528d18.png)

1. アラート発生の確認
設定を変更すると、すぐにアラートが表示されました。アラートが発報された場合、アラームに炎が燃えているアイコンが表示され、アラートが状態であることを確認できます。
![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/022c478a-c56e-b0df-6c86-024ed07e6636.png)

1.  メール通知の確認
最後に、アラートが発報された際に設定したメールアドレスに通知が届いていることを確認します。メールを受信することで、監視設定が正しく機能していることが確認できます。
![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/946cf856-0c0a-41c8-fb90-6562ceafc922.png)

### おわりに
OCIでCPU使用率の監視(死活監視)を設定する方法を記載しました。Terraform(リソース・マネージャー)で何回かエラーがでて実機でアラートの設定などをして切り分けを行ったりしましたが、環境のパラメータ値の保証の観点などで今回もやっぱりTerraformが良いかなと思いました。


参考リンク
 - oci_monitoring_alarm

https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/monitoring_alarm

 - oci_ons_notification_topic

https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/ons_notification_topic