旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。
前回の旅で、我々はWindows(Microsoft製OS)という文明化された大地に、gRPC(高性能RPC通信フレームワーク)のゴーレムを錬成した。しかし、真の冒険者は、安住の地に留まらない。今回は、WSL2/Ubuntu(Windows上のLinux環境)という、より原生的な、しかし無限の可能性を秘めた大地で、再び同じゴーレムを創り出す儀式に挑む。
プログラムの魂そのものは同じだ。しかし、大地が違えば、儀式の作法もまた、微妙に異なってくる。これは、Linux(UNIXベースのOS)という新たな大地で、.NET 6(Microsoftの開発フレームワーク)の魔法を使いこなし、IPアドレス(ネットワーク識別番号)という光の糸で、二つの世界を繋ぐまでの、一人の魔法使いの冒険の記録である。
この羊皮紙のあらまし
- この羊皮紙のあらまし
- この羊皮紙が導く者
- 砂漠の道標
- 第一の儀式:大地を整える(事前準備)
- 第二の儀式:Linuxの大地に、ゴーレムを召喚する
- 最終儀式:二つの世界を繋ぐ
- 羊皮紙を巻く前に
- 砂漠で見つけた魔法のランプ
- ラクダの独り言
この羊皮紙が導く者
- 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(ログビューアアプリケーション)という真実の鏡を覗き込めば、その魂の鼓動を、より詳細に感じ取ることもできる。
最終儀式:二つの世界を繋ぐ
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の重要なポイント
- launchSettings.jsonの書き換え -
localhostを0.0.0.0に変更することで、外部ネットワークからのアクセスを許可。これがなければWindowsからLinux上のサーバへアクセスできない - IPアドレスの正確な特定 -
ip a show dev eth0コマンドでWSL2のIPアドレスを確認。WSL2は起動の度にIPが変わる可能性があるため、毎回確認が必要 - 自己署名証明書の信頼設定 - クライアント側で
ServerCertificateCustomValidationCallbackを使用し、開発環境専用として証明書検証を無効化 - クロスプラットフォームの実証 - 同じ.NET 6コードがWindowsとLinuxの両方で動作することを確認。真のポータビリティの実現
この旅で得た教訓
IPアドレス(ネットワーク識別番号)でアクセスするためのlaunchSettings.json(開発設定ファイル)の書き換えは、一見些細な変更に見えるが、これがなければ異なる環境間での通信は成立しない。大地が違えば作法も変わる。しかし、その違いを知り、乗り越えることこそが、我々冒険者の知恵となるのだ。
まとめ
この旅で得た知見は、次の冒険、すなわち「Docker」(コンテナ仮想化技術)という異次元の箱庭でのゴーレム錬成へと繋がっていく。Linuxという原生的な大地での経験は、より高度な錬金術への確かな礎となるだろう。
この羊皮紙が、同じようにWindowsの安住の地から、Linuxという広大な荒野へ旅立とうとする、未来の冒険者の助けとなることを願う。
おっと、どうやら相棒が腹を空かせたようだ。今日はこのへんで筆を置くとしよう。
砂漠で見つけた魔法のランプ
- 第一章:古の魔法は死んだ。王の帰還だ。 ~WCFからgRPCへ、魂の継承儀式~ | Windows環境でのgRPC実装を記した前回の冒険記録
- ASP.NET Core gRPC チュートリアル - Microsoft Docs | Microsoft公式のgRPC実装ガイド
- NLog with ASP.NET Core 6 - GitHub | NLogによるログ管理の実践的な古文書
- WSL2 ネットワーク設定 - Microsoft Docs | WSL2ネットワーク設定の詳細を記した公式文書
ラクダの独り言
ご主人が、この前は窓の世界でゴーレムを創っていたかと思えば、今度はペンギンの世界で同じことをやっている。俺に言わせりゃ、どっちの世界で創ろうが、どうせ荷物は運んでくれねえんだ。それに、窓だペンギンだと世界を行ったり来たりして、そんなに忙しくしてどうするんだ?一つの世界で落ち着けばいいのによ。そんなことより、そろそろ俺の餌の時間をだな…。まったく、やれやれだぜ。