Network Intelligence Center を試す

## はじめに
Google Cloud でネットワーク関連を統合したコンソールとして [Network Intelligence Center](https://cloud.google.com/network-intelligence-center?hl=ja) がある
個人環境で簡易的に試した内容を記載する

## Network Intelligence Center とは
Google Cloud ネットワークのオブザーバビリティ、モニタリング、トラブルシューティングを単一コンソールで可能にするサービス

- 主な利点 ([ドキュメント](https://cloud.google.com/network-intelligence-center?hl=ja#section-1))
    - 接続の問題を診断し、ネットワーク障害を防止
    - ネットワークのセキュリティとコンプライアンスが向上
    - インテリジェントなモニタリングで時間を節約

### 主な機能・料金
主な機能・料金は下記の通り (2023.10.15 時点)

| 主な機能 | 内容 ([ドキュメント](https://cloud.google.com/network-intelligence-center?hl=ja#section-2)) | 料金  ([ドキュメント](https://cloud.google.com/network-intelligence-center/pricing?hl=ja#network-intelligence-center-pricing)) |
|:--|:--|:--|
| ネットワーク トポロジ | 下記を可視化する<br> ・VPC ネットワークのトポロジ <br>・オンプレミス ネットワーク間のハイブリッド接続<br>・Google マネージド サービスへの接続 <br>・関連する指標 | ・現在すべてのユーザーが 100% 割引<br> (割引構成の変更は、90 日前の通知) <br> ・GCE 1 リソース時間ごとに $0.0011 <br> ・アドオン: インターネットと Google Cloud 間のトラフィック GCE リソース時間あたり \\$0.0008 |
| 接続テスト | ネットワーク エンドポイント間の接続を確認できる診断ツール | ・テスト 20 回まで無料/月<br>・テスト 21 回以上 $0.15 / テスト数 |
| パフォーマンス ダッシュボード | 全体のパフォーマンスと、プロジェクトのリソースのパフォーマンスを可視化する | 現在すべてのユーザーが 100% 割引 <br> (割引構成の変更は、90 日前の通知)|
| ファイアウォール インサイト | ファイアウォール ルールの使用状況に関するデータを使用して、構成の誤りを確認できる | ・初期評価時 : ルールごとに 1ドル <br>・その後の評価 : 評価するルール 1 つにつき 0.10ドル |
| ネットワーク アナライザ | VPC ネットワーク構成を自動的にモニタリングし、構成ミスや最適でない構成を検出する <br>基盤となるネットワークに起因する障害を特定し、根本原因の情報と考えられる解決策を提供する | ・現在すべてのユーザーが 100% 割引 <br> (割引構成の変更は、90 日前の通知) <br> ・GCE, GKE ノード : 1 リソース時間ごとに $0.0011|

[料金のドキュメント](https://cloud.google.com/network-intelligence-center/pricing?hl=ja#network-intelligence-center-pricing)に記載がある通り、現在(2023.10.15時点)100%割引が適用されている箇所があるが、今後90日前通知で課金に変わる可能性がある

![スクリーンショット 2023-10-09 15.18.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/1c049a61-a7e9-ad13-8e8f-68b7a32b3274.png)


## 試験実施
`Network Intelligence` の各機能を試験環境で試してみる

- Cloud Console 英語メニュー
![スクリーンショット 2023-10-15 19.12.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/9e9adaca-db56-9650-2518-2986f090f82d.png)

- Cloud Console 日本語メニュー
![スクリーンショット 2023-10-15 19.12.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/af3001e4-ef20-bdc5-44bb-125610fb36f4.png)


### 実施環境

共有 VPC 環境で複数のプロジェクトがある環境 (下記リンク先で作成された個人試験環境)

https://qiita.com/suzuyui/items/879dfa5d837a19c39a54

### 必要な権限

下記管理者と閲覧者は必要に応じて適用する

- [ネットワーク管理管理者 (roles/networkmanagement.admin)](https://cloud.google.com/iam/docs/understanding-roles#networkmanagement.admin)
- [ネットワーク管理閲覧者 （roles/networkmanagement.viewer）](https://cloud.google.com/iam/docs/understanding-roles#networkmanagement.viewer)
- モニタリング管理者 （roles/monitoring.admin）
- モニタリング閲覧者 （roles/monitoring.viewer）

[ファイアウォール インサイトの権限](https://cloud.google.com/network-intelligence-center/docs/firewall-insights/how-to/view-understand-insights?hl=ja#roles) は Firewall があるプロジェクト(共有VPCのホストプロジェクト)で権限付・操作が必要

- [Firewall Recommender 管理者（roles/recommender.firewallAdmin）](https://cloud.google.com/iam/docs/understanding-roles#recommender.firewallAdmin)
- [Firewall Recommender 閲覧者（roles/recommender.firewallViewer）](https://cloud.google.com/iam/docs/understanding-roles?hl=ja#recommender.firewallViewer)

### 必要な API
下記 API を必要に応じて各プロジェクトで有効化する

- `monitoring.googleapis.com`
    - すべてのプロジェクトで有効化する
- `firewallinsights.googleapis.com`
    - 共有VPCのホストプロジェクトで有効化する
- `networkmanagement.googleapis.com`
    - モニタリング対象先(サービスプロジェクトを含む全ての対象プロジェクト)で有効化する

### マルチプロジェクト モニタリング スコープ用プロジェクト
共有 VPC など複数のプロジェクトを前提にネットワークを構成している場合は、[指標スコープを追加](https://cloud.google.com/monitoring/settings/multiple-projects?hl=ja)する必要がある

[スコープ用プロジェクトに関するベスト プラクティス](https://cloud.google.com/monitoring/settings?hl=ja#create-multi)によると`スコープ用プロジェクトとして新しい Google Cloud プロジェクトを使用するか、リソースのないプロジェクトを使用すること`が推奨されているので、新しくプロジェクトを作成する

#### マルチスコープ用プロジェクトの作成

プロジェクトを作成して、必要な権限・API を有効化して、モニタリングするプロジェクトを紐付けする

<details><summary>　terraform code 例　</summary><div>

組織でフォルダ管理されている環境での例
`main.tf`, `terraform.tfvars` に環境で変わる変数は定義している
`terraform.tfvars` の `monitor_project_list` 変数で複数のプロジェクトの紐付けをリストで定義できるようにしている

```sh
$ tree
.
|-- api.tf
|-- folder.tf
|-- iam.tf
|-- main.tf
|-- monitored_project.tf
|-- project.tf
|-- terraform.tfvars
`-- vairables.tf
```

```api.tf
# プロジェクトの API 管理
resource "google_project_service" "main" {
  project                    = google_project.main.name
  disable_dependent_services = true

  for_each = toset([
    "monitoring.googleapis.com",        # Network Topology, Performance Dashboard, Network Analyzer のみであればこれだけでも使用可能
    "networkmanagement.googleapis.com", # Connectivity Tests で必要, Network Analyzer の対象先で有効化が必要
    # "firewallinsights.googleapis.com",  # Firewall Insights で必要, Firewall があるプロジェクトで有効化・実施が必要
  ])
  service = each.value
}

```

```folder.tf
# マルチプロジェクトでのモニタリング向けフォルダ
resource "google_folder" "folder" {
  display_name = var.folder_name
  parent       = var.parent_folder_name
}
```

```iam.tf
# フォルダ IAM 設定
resource "google_folder_iam_binding" "admin" {
  folder = google_folder.folder.name
  for_each = toset([
    "roles/monitoring.admin",
    "roles/networkmanagement.admin",
  ])

  role = each.value

  members = [
    join(":", ["group", var.org_monitoring_admin_group_email]),
  ]
}
```

```main.tf
terraform {
  required_version = "1.1.7"
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "=5.0.0" # 2023.10.14 Latest https://registry.terraform.io/providers/hashicorp/google/5.0.0/
    }
  }
  backend "gcs" {
    bucket = "YOUR_TERRAFORM_BACKEND_BACKET" # env manage terraform state bucket
    prefix = "YOUR_THIS_STATE_FILE_NAME"    # env manage terraform state file
  }
}

provider "google" {
  # export GOOGLE_APPLICATION_CREDENTIALS=YOUR_CREDENTIALS_PATH
}
```

```monitored_project.tf
## https://registry.terraform.io/providers/hashicorp/google/5.0.0/docs/resources/monitoring_monitored_project
resource "google_monitoring_monitored_project" "projects_monitored" {
  for_each      = toset(var.monitor_project_list)
  metrics_scope = join("", ["locations/global/metricsScopes/", google_project.main.id])
  name          = each.value
}
```

```project.tf
# プロジェクト作成
resource "google_project" "main" {
  name            = var.project_id
  project_id      = var.project_id
  billing_account = var.billing_account
  folder_id       = google_folder.folder.name

  depends_on = [
    google_folder.folder,
  ]
}
```

```terraform.tfvars
project_id         = "MONITORING_PROJECT_NAME"
parent_folder_name = "folders/XXXXXXXXXXXX"
folder_name        = "MONITORING_FOLDER_NAME"
billing_account    = "XXXXXX-XXXXXX-XXXXXX"
admin_group_email  = "gcp-network-admin@xxx.xxx"
monitor_project_list = ["YOUR_SHARED_VPC_PROJECT_ID", "YOUR_SERVICE_PROJECT1_ID",
"YOUR_SERVICE_PROJECT2_ID", ]
```

```vairables.tf
variable "project_id" {
  type = string
}

variable "parent_folder_name" {
  type = string
}

variable "folder_name" {
  type = string
}

variable "billing_account" {
  type = string
}

variable "location" {
  type    = string
  default = "asia-northeast1"
}

variable "org_monitoring_admin_group_email" {
  type = string
}

variable "monitor_project_list" {
  type = list(string)
}
```

</div></details>


### ネットワーク トポロジ

Cloud Console で`マルチプロジェクト モニタリング 用に作成したプロジェクト` を選択して `Network Intelligence` > `Network Topology` を開く

複数のプロジェクト (共有 VPC のホスト・サービスプロジェクト) を統合したトポロジ図を見ることができる。
アイコンをクリックすると対象の通信の Ingress/Egress トラフィックを図示できる

![スクリーンショット 2023-10-15 15.47.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/43486e00-aeab-2c46-c53c-223f631836e8.png)

トポロジのアイコンを開くとリージョン内の構造を表示できる (ここではオンプレ向け VPN とサブネット)

![スクリーンショット 2023-10-15 15.48.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/b8a21b40-f92f-2360-374d-86502f4008e9.png)

また、アイコンをクリックすると対象のトラフィックをグラフで表示できる

![スクリーンショット 2023-10-15 15.49.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/f7f1df18-54d7-a346-7361-6e337f9af3ed.png)

`DATA FLOWS` のタブを開くとトラフィック量を表で表示できる

![スクリーンショット 2023-10-15 15.49.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/c5656264-5e2c-76e0-4049-edec88692cb1.png)


### 接続テスト
Cloud Console で`マルチプロジェクト モニタリング 用に作成したプロジェクト` を選択して `Network Intelligence` > `Connectivity Tests` を開く

![スクリーンショット 2023-10-15 17.42.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/9bc4d4a5-6515-c19d-4ff1-bad451782a72.png)

`+ CREATE CONNECTIVITY TEST` をクリックして、試しに許可してな送信元 IP を指定して VM の Public IP 向けに接続テストを作成する (下記は作成例)

![スクリーンショット 2023-10-15 17.31.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/2ea1b53b-39ef-c863-bc22-74f6020918e5.png)

作成すると接続テストの一覧ができる (下記画像はFirewall でブロックされるのと許可している内容で試験作成した結果)

![スクリーンショット 2023-10-15 17.32.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/bf02e2c6-fb1f-3f6a-5cb7-6f8469b6c339.png)

下記画像はブロックされる接続テストをクリックして詳細を開いた例。Firewall rules でブロックされることがわかる。

![スクリーンショット 2023-10-15 17.34.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/fdc8fe06-0642-3138-12b9-238a63644c2c.png)

下記画像は許可される接続テストをクリックして詳細を開いた例。許可される Firewall rule 名が表示される。

![スクリーンショット 2023-10-15 17.35.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/36e5fb7d-c0d8-9ee7-c826-b1f4909ff6b4.png)


### パフォーマンス ダッシュボード
Cloud Console で`マルチプロジェクト モニタリング 用に作成したプロジェクト` を選択して `Network Intelligence` > `Performance Dashboard` を開く

![スクリーンショット 2023-10-15 17.52.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/ce17af2b-e292-80d8-07a8-1c417a202224.png)

あまりクラウドリソースがないので見れるところがなかった。インターネット向けのレイテンシで見れたのが上記の通り。

### ファイアウォール インサイト

Cloud Console で`マルチプロジェクト モニタリング 用に作成したプロジェクト` を選択して `Network Intelligence` > `Firewall Insights` を開く

![スクリーンショット 2023-10-15 18.35.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/4f00b1fb-5dac-81b0-c0e2-2a453282e6c8.png)


**設定を変えると費用が発生するので要注意** (初期評価時 : ルールごとに 1ドル)

`CONFIGURATION` をクリックして設定を開く

`OBSERVATION PERIOD` (観察期間) タブで実行間隔を設定できる (下記はデフォルトのまま)

![スクリーンショット 2023-10-15 18.50.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/323e58cc-cdb0-e482-e36a-f38dc0a96af7.png)

`ENABLEMENT` タブで有効化している評価設定を切り替えできる

![スクリーンショット 2023-10-15 18.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/aba6444d-7516-d602-1961-b3e277ffd0a5.png)

デフォルトでは `Disabled` になっているのでスイッチして Enable にする (下記はスイッチ時のポップアップ内容)

![スクリーンショット 2023-10-15 18.37.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/e7e818cd-9a56-4d19-fd52-4c40aba48d9a.png)

両方とも `Enabled` になったことを確認する

![スクリーンショット 2023-10-15 18.41.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/cb0191ee-a1de-ef4b-b789-abb7c10d9474.png)

有効化 (`Enabled`) にすると分析 (`Insights`) 結果が表示される (分析には最大24時間かかるものがあるので注意)

![スクリーンショット 2023-10-15 18.43.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/1df9a246-8c4b-cf12-c3d7-efb3c28079f9.png)

有効化したままだと定期的に費用が発生するので試験後は `Disabled` にする (評価するルール 1 つにつき 0.10ドル)

### ネットワーク アナライザ

Cloud Console で`共有 VPC のホストプロジェクト` を選択して `Network Intelligence` > `Network Analyzer` を開く

![スクリーンショット 2023-10-15 17.57.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/ac85331d-a426-21bb-d171-208ffc8a9481.png)

実施環境で分析結果を見ると、サブネット内の IP 使用率が少ないものが `Low` レベルで出ていることが確認できた

![スクリーンショット 2023-10-15 17.58.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/fb50ad15-bcde-b916-5e82-d26abe31958a.png)

## まとめ
Network Intelligence Center を簡易的に試した
試験したのが個人的なラボ環境でリソースが少ないため試せた範囲は狭いが、
商用ネットワークの運用には有用そうなサービスだった

## 参照

https://cloud.google.com/network-intelligence-center?hl=ja

https://cloud.google.com/network-intelligence-center/docs?hl=ja

https://cloud.google.com/network-intelligence-center/docs/network-topology/concepts/overview?hl=ja


https://cloud.google.com/monitoring/settings?hl=ja

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/monitoring_monitored_project

https://cloud.google.com/monitoring/settings?hl=ja#create-multi

https://cloud.google.com/composer/docs/terraform-cross-project-monitoring?hl=ja