【実務・中級編】 5GにおけるSBAのサービス登録・発見を行うNRF(Network Repository Function)の挙動 – 家庭用ネットワーク・IoT・モバイル通信実践ガイド

5Gコアの「司令塔」を理解する:NRFにおけるサービス登録と発見の裏側

5Gコアネットワーク(5GC)の設計に携わっていると、しばしば「SBA(Service Based Architecture)」という言葉に突き当たります。従来の4G(EPC)が、特定の機能を持つノードが複雑な専用線で結ばれた「点と点の関係」だったのに対し、5GCはまるでマイクロサービスアーキテクチャそのもの。その中心で「誰がどこにいるのか」を管理する、いわばネットワーク版の「DNS兼サービスディスカバリ」が今回解説する NRF(Network Repository Function) です。

現場のエンジニアにとって、NRFは単なる仕様上の存在ではありません。NF(Network Function)同士が疎通できない際、パケットキャプチャを開いてNRFへの HTTP POST が201で返っているか、あるいは403で拒絶されているかを確認する瞬間、私たちはこの仕組みの重要性を痛感するのです。

—

1. NRFの役割:サービス登録と発見のメカニズム

SBAにおいて、AMFやSMFといった各NFは、起動時に自身のプロフィールをNRFに登録します。これを NF Registration と呼びます。そして、他のNFからサービスを呼び出す際(NF Discovery)、NRFに対して「このサービスを提供できる奴はどこだ?」と問い合わせを行います。

この通信は全て RESTful API、つまり HTTP/2 上の JSON で行われます。インフラエンジニアとしては、この HTTP リクエストのヘッダーやボディの構造を、TCPDump や Wireshark で瞬時に読み解けるようになっておくことが、トラブルシューティングの第一歩です。

—

2. 実践:NF登録(NF Profile Registration)のコード例

NFが起動し、NRFに自身の情報を登録する際のフローを考えてみましょう。ここでは、Pythonの requests ライブラリを用いたイメージで解説します。実際の実務では HTTP/2 対応のライブラリが必須ですが、ロジックは以下の通りです。

import requests
import json

# NRFのエンドポイント(実際はDiscoveryで取得したFQDNを使用)
nrf_url = "https://nrf.local.5gc/nnrf-nfm/v1/nf-instances/amf-01"

# 登録するNFプロファイルの構造体
nf_profile = {
    "nfInstanceId": "amf-01-uuid-1234",
    "nfType": "AMF",
    "nfStatus": "REGISTERED",
    "ipv4Addresses": ["192.168.1.10"],
    "nfServices": [
        {
            "serviceInstanceId": "namf-comm",
            "serviceName": "namf-comm",
            "versions": [{"apiVersionInApiRoot": "v1"}],
            "scheme": "https",
            "apiPrefix": "https://amf.local.5gc:8080"
        }
    ]
}

# NRFへPUTリクエストを送信して登録
# 冪等性を考慮し、初回登録にはPUTが使われることが多い
response = requests.put(nrf_url, json=nf_profile, headers={"Content-Type": "application/json"})

if response.status_code == 201:
    print("登録成功:NRFがNFを認識しました")
else:
    print(f"登録失敗:{response.status_code} - {response.text}")

実務のTips

  • nfInstanceId: これは必ず UUID で管理してください。インフラの自動スケーリングでNFが再起動するたびにIDが変わると、NRFのデータベースがゴミデータで溢れかえります。
  • heartbeat: NRF登録後、NFは定期的に PATCH メソッドで自身の生存報告(Heartbeat)を送る必要があります。これを忘れると、NRF側で NFStatus が SUSPENDED になり、通信が遮断されます。

—

3. NF発見(NF Discovery)のクエリ設計

次に、あるNFが他のサービスを呼び出す際の「検索」フェーズです。例えばSMFがPCFを探す際、以下のような curl コマンドに近いリクエストが飛び交います。

# NRFに対して、特定のサービスタイプを持つNFを検索する
curl -v -X GET \
  "https://nrf.local.5gc/nnrf-disc/v1/nf-instances?target-nf-type=PCF&requester-nf-type=SMF" \
  -H "Accept: application/json"

この際、NRFは target-nf-type だけでなく、sNssai(ネットワークスライスのID)や dnn(データネットワーク名)などを条件に追加してフィルタリングを行います。

—

4. トラブルシューティングの勘所

現場でよく遭遇するのは、「NRFまでは到達しているのに、検索結果が空(200 OKだがリストが空)になる」というケースです。

1. スコープの不一致: 登録時の sNssai 情報と、検索時のクエリパラメーターが微妙に一致していないことがよくあります。大文字・小文字、あるいは sNssai 内の sst(Slice/Service Type)の値が正しいか、JSONの階層を疑ってください。
2. 証明書エラー: NRFとの通信は基本的に TLS 必須です。mTLS(相互認証)が求められる環境では、クライアント側の証明書の期限切れや、信頼されたCA証明書がインポートされていないことが原因の9割を占めます。
3. APIバージョンのミスマッチ: apiVersionInApiRoot で指定したバージョンと、リクエスト先のURIが合致しているか確認してください。

最後に

NRFは5GCという巨大なパズルを繋ぐ接着剤です。この動きを理解していれば、ベンダーのブラックボックス的な機器であっても、どこでパケットが迷子になっているのか、論理的に追い詰めることができます。

まずは、あなたの環境のNRFに対して GET リクエストを投げ、現在登録されている NF Profile を覗いてみることから始めてみてください。そこには、ネットワークの「現在」が全て書き込まれています。

コメント

タイトルとURLをコピーしました