たびとの旅路 ~電脳砂漠の冒険譚~

フロッピー頼りに歩き、クラウドの地平を見つめる今日まで。見つけたオアシス、迷い込んだ砂の迷宮、全てこの羊皮紙に。

第二章:異世界に、魂を宿せ ~Linuxと.NETで創る、gRPCのゴーレム~

旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。

前回の旅で、我々はWindows(Microsoft製OS)という文明化された大地に、gRPC(高性能RPC通信フレームワーク)のゴーレムを錬成した。しかし、真の冒険者は、安住の地に留まらない。今回は、WSL2/Ubuntu(Windows上のLinux環境)という、より原生的な、しかし無限の可能性を秘めた大地で、再び同じゴーレムを創り出す儀式に挑む。

プログラムの魂そのものは同じだ。しかし、大地が違えば、儀式の作法もまた、微妙に異なってくる。これは、Linux(UNIXベースのOS)という新たな大地で、.NET 6(Microsoftの開発フレームワーク)の魔法を使いこなし、IPアドレス(ネットワーク識別番号)という光の糸で、二つの世界を繋ぐまでの、一人の魔法使いの冒険の記録である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • gRPCという名のゴーレムを、Windowsだけでなく、Linuxの大地でも錬成したいと願う者
  • HTTP/2という光の道を、異なるOS間で繋ぐことに興味がある探求者
  • WSL2/Ubuntuでのネットワーク設定に悩む開発者
  • クロスプラットフォーム開発の実践的な知識を求める実務家

砂漠の道標

  • gRPC - Google開発の高性能RPC(Remote Procedure Call)フレームワーク。HTTP/2ベース。
  • WSL2 - Windows Subsystem for Linux 2の略。Windows上でLinux環境を動作させる仮想化技術。
  • .NET 6 - Microsoftのオープンソースなクロスプラットフォーム開発フレームワーク。
  • Ubuntu - Debian系の人気Linuxディストリビューション。WSL2での標準選択肢の一つ。
  • IPアドレス - ネットワーク上の機器を識別する番号。IPv4では「192.168.1.1」のような形式。
  • launchSettings.json - ASP.NET Coreのローカル開発設定ファイル。起動URL等を定義。
  • 0.0.0.0 - 全てのネットワークインターフェースで待ち受けることを示す特殊なIPアドレス。
  • NLog - .NET用の高機能ログ出力ライブラリ。ファイル、コンソール等へのログ出力が可能。
  • 自己署名証明書 - 認証局を介さず自身で発行したSSL/TLS証明書。開発・テスト環境で使用。

第一の儀式:大地を整える(事前準備)

まず、我々が今立っているWindowsという大地と、これから旅するLinux(WSL2/Ubuntu)という大地の、正確な座標を知る必要がある。ipconfig(Windows用ネットワーク情報表示コマンド)の呪文で、Windows側のIPv4アドレス(ネットワーク識別番号)を読み解き、それをnlog.config(NLogログ設定ファイル)という名の羅針盤に刻み込む。これが、二つの世界を繋ぐための、最初の重要な儀式だ。

第二の儀式:Linuxの大地に、ゴーレムを召喚する

WSL2/Ubuntu(Windows上のLinux環境)という祭壇で、dotnet new grpc(gRPCプロジェクト新規作成コマンド)という短い呪文を唱える。すると、大地は応え、gRPCゴーレムの素体が、我々の目の前に現れる。

$ mkdir GrpcGreeter
$ cd GrpcGreeter
$ dotnet new grpc  # gRPCテンプレートからプロジェクト作成

NLog(.NET用ログ出力ライブラリ)という、ゴーレムの声を聴くための魔法の耳を追加し、儀式の準備は整った。

魂の設計図を書き換える

Windows版と違い、Linux版のゴーレムに外界の声を届けさせるには、launchSettings.json(ASP.NET Core開発設定ファイル)という名の魂の設計図を、自らの手で書き換える必要がある。 applicationUrl(アプリケーション起動URL)に記されたlocalhost(自端末のみアクセス可能)という内なる言葉を、0.0.0.0(全ネットワークインターフェースで待ち受け)という、全世界に向けた開かれた言葉へと書き換えるのだ。

{
  "profiles": {
    "GrpcGreeter": {
      "applicationUrl": "http://0.0.0.0:5045;https://0.0.0.0:7045",  // 全てのIPで待ち受け
      // ...
    }
  }
}

儀式の執行

dotnet build(プロジェクトビルド)で魂を練り上げ、dotnet run(アプリケーション起動)で命を吹き込む。 コンソールに響き渡る「Now listening on...」という神託こそが、ゴーレムがLinuxの大地で確かに息づいている、何よりの証だ。

$ dotnet run
Building...
INFO : Now listening on: http://0.0.0.0:5045   # HTTPポートで待ち受け開始
INFO : Now listening on: https://0.0.0.0:7045  # HTTPSポートで待ち受け開始
INFO : Application started. Press Ctrl+C to shut down.
...

Log2Console(ログビューアアプリケーション)という真実の鏡を覗き込めば、その魂の鼓動を、より詳細に感じ取ることもできる。

Log2Console によるログの確認

真実の鏡が、ゴーレムの魂の鼓動を映し出す

最終儀式:二つの世界を繋ぐ

Windowsの世界から、gRPCクライアント(gRPC通信を行うアプリケーション)という名の魔法で、Linuxの大地にいるゴーレムと対話する。 ip a show dev eth0(ネットワークインターフェース情報表示コマンド)で突き止めた、Ubuntu(WSL2のLinux環境)の座標(IPアドレス:ネットワーク識別番号)を正確に指定する。

# Ubuntuの座標を突き止める(eth0インターフェースのIPアドレス)
$ ip a show dev eth0
    inet 172.18.126.178/20 ...  # このIPアドレスがWSL2のUbuntuの座標

そして、クライアントのプログラムに、その座標を刻み込む。自己署名証明書(開発用SSL証明書)という結界を信頼する、という誓いを立てることを忘れずに。

// 異世界の座標(WSL2 UbuntuのIPアドレスとHTTPSポート)
var server = "https://172.18.126.178:7045";

var option = new GrpcChannelOptions()
{
    HttpClient = new HttpClient(new HttpClientHandler
    {
        // 自己署名証明書という結界を、信頼する(開発環境専用設定)
        ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator,
    })
};
var channel = GrpcChannel.ForAddress(server, option);
// ...

呪文を唱えれば、「Hello World」という、二つの世界が繋がった証の言葉が返ってくるだろう。

サーバとクライアントのログを確認する

真実の鏡に映る、二つの世界の魂の対話

羊皮紙を巻く前に

Windows版に続き、WSL2/Ubuntu(Windows上のLinux環境)というLinuxの大地でも、無事にgRPC(高性能RPC通信)のゴーレムを錬成することができた。プログラムの魂そのものは同じでも、大地が違えば儀式の作法も変わる。その違いを乗り越えることこそが、真の冒険者の証なのだ。

Linux版gRPCの重要なポイント

  1. launchSettings.jsonの書き換え - localhost0.0.0.0に変更することで、外部ネットワークからのアクセスを許可。これがなければWindowsからLinux上のサーバへアクセスできない
  2. IPアドレスの正確な特定 - ip a show dev eth0コマンドでWSL2のIPアドレスを確認。WSL2は起動の度にIPが変わる可能性があるため、毎回確認が必要
  3. 自己署名証明書の信頼設定 - クライアント側でServerCertificateCustomValidationCallbackを使用し、開発環境専用として証明書検証を無効化
  4. クロスプラットフォームの実証 - 同じ.NET 6コードがWindowsとLinuxの両方で動作することを確認。真のポータビリティの実現

この旅で得た教訓

IPアドレス(ネットワーク識別番号)でアクセスするためのlaunchSettings.json(開発設定ファイル)の書き換えは、一見些細な変更に見えるが、これがなければ異なる環境間での通信は成立しない。大地が違えば作法も変わる。しかし、その違いを知り、乗り越えることこそが、我々冒険者の知恵となるのだ。

まとめ

この旅で得た知見は、次の冒険、すなわち「Docker」(コンテナ仮想化技術)という異次元の箱庭でのゴーレム錬成へと繋がっていく。Linuxという原生的な大地での経験は、より高度な錬金術への確かな礎となるだろう。

この羊皮紙が、同じようにWindowsの安住の地から、Linuxという広大な荒野へ旅立とうとする、未来の冒険者の助けとなることを願う。

おっと、どうやら相棒が腹を空かせたようだ。今日はこのへんで筆を置くとしよう。

砂漠で見つけた魔法のランプ

ラクダの独り言

ご主人が、この前は窓の世界でゴーレムを創っていたかと思えば、今度はペンギンの世界で同じことをやっている。俺に言わせりゃ、どっちの世界で創ろうが、どうせ荷物は運んでくれねえんだ。それに、窓だペンギンだと世界を行ったり来たりして、そんなに忙しくしてどうするんだ?一つの世界で落ち着けばいいのによ。そんなことより、そろそろ俺の餌の時間をだな…。まったく、やれやれだぜ。