後輩: 「先輩、AWSの資格取りたいんで、VPCとか勉強してる所なんですけど、それが何の為にあるかいまいちわかりません。いろんな機能あるし、必要なんですか?」
先輩: 「うーむ。ネットワークの基礎が分かってないと、AWSのVPCみたいな応用の部分、ちっとも腑に落ちないんだよ。🚫」
後輩: 「え、そうなんですか?」
先輩: 「うん。だってさ、ネットワークの基本って、道路や電車の線路みたいなもの。データがどうやって流れるか、どこを通って目的地に着くか、そういうことが基本になるんだよ。🚄🛤️」
後輩: 「なるほど、基本の流れを知らないと...」
先輩: 「そうそう、例えばさ、VPCってのは、AWS上にプライベートなネットワーク空間を作ること。でも、この「プライベートなネットワーク空間」という概念がピンとこないと、VPCの真価が理解できないんだ。」
後輩: 「プライベートなネットワーク空間...」
先輩: 「そう。VPCでやるのは、自分だけの安全なエリアを作って、そこにサーバーやデータベースを配置するわけ。だから、外部からのアクセスをどう制御するか、内部でのデータのやり取りがどうなってるか、そういうネットワークの知識がないと、VPCを上手く設計するのは難しいんだよ。🏗️🔒」
後輩: 「そういうことか。ネットワークの知識が先に必要なんですね。(汗)」
先輩: 「まさにその通り!🎯 VPCはただのツール。そのツールを使いこなすには、基本の「土台」が必要なんだ。ネットワークの基本を理解していれば、VPCを使って、セキュリティが高く、効率的なシステムを作れるようになるんだ。」
後輩: 「でも、そんなの知ってますよ!ソーシャルネットワークとか、人脈が広い時にネットワークが広いっていう、あれですよね!」
先輩: 「それは日常生活で使う「ネットワーク」で、俺が言っているのはシステム開発という文脈でのネットワーク! 」
後輩: 「それでしたら多分大学の時の講義でやったから多分いけます!」
先輩: 「じゃあ、今後輩くんが繋がってるパソコンは、ネットワーク層から見てどういう経路を辿ってインターネットにアクセスして、どうやって戻ってくるか説明できる?」
後輩: 「ネットワーク層...?(何それ)ちょっとわかりません」
先輩: 「ざっとこんな感じ⭐︎↓」
- 後輩くんがパソコンでウェブブラウザを開く
- ウェブサイトのURLを入力
- ブラウザがDNSリクエストを生成
- DNSリクエストがローカルネットワークを通じてデフォルトゲートウェイに送信される
- デフォルトゲートウェイがリクエストをISPのDNSサーバーに転送
- DNSサーバーがURLをIPアドレスに解決
- 解決されたIPアドレスがパソコンに戻る
- ブラウザがHTTPリクエストを生成(IPアドレスを使用)
- HTTPリクエストがデフォルトゲートウェイを通じてISPのルーターに送信される
- ISPのルーターがリクエストをインターネットに転送
- リクエストが複数の外部ルーターを経由
- リクエストが目的地のサーバーのネットワークに到達
- サーバーのローカルルーターがリクエストをサーバーに転送
- サーバーがリクエストを受け取る
- サーバーがリクエストを処理
- 必要なデータがデータベースやファイルシステムから取得される
- サーバーがHTTPレスポンスを生成
- HTTPレスポンスがサーバーのローカルルーターに送信される
- レスポンスがサーバーのネットワークを通じてインターネットに転送される
- レスポンスが複数の外部ルーターを経由
- レスポンスがISPのルーターに到達
- ISPのルーターがレスポンスをデフォルトゲートウェイに転送
- デフォルトゲートウェイがレスポンスをパソコンに転送
- ブラウザがレスポンスを受け取る
- ブラウザがレスポンスを解析
- ウェブページがブラウザに表示される
- ユーザーがウェブページを閲覧
- 追加リクエスト(画像やスクリプトのロード)が必要な場合は、再度リクエスト
- 各追加リクエストに対して、同様のプロセスが繰り返される
- ブラウザセッションの終了
後輩「ネットワーク勉強します」
なんかいっぱいステップがあるのはわかったけど、結局何で大切なの?
後輩「僕はプログラミングがしたいのに!!!」
先輩「まあその気持ちもわからなくもないけど、ソフトウェア開発、システム開発の観点からもとても大切なんだよ」
後輩「正直あまりピンときません。。(僕はpythonとかNext.jsとか、かっこいい言語を使って働きたい、ハァハァ」
先輩: 「ネットワークが大切な理由を説明する前に、まずはレストランの例え話から始めようか。🍴」
後輩: 「レストラン?どういうことですか?」
先輩: 「ソフトウェア開発って、実はレストランで料理を作るプロセスに似てるんだ。考えてみて。レストランでは、一人のシェフがすべてをやるわけじゃないよね。仕込み担当、調理担当、盛り付け担当...と、それぞれの専門家が協力して一つの料理を完成させる。」
後輩: 「なるほど、チームワークが大事ってことですね。」
先輩: 「そうそう、そのチームワークが、まさにネットワークの役割なんだ。開発では、各々のコンピュータやシステムがチームメンバーのように機能して、データをやり取りしたり、命令を出したり受け取ったりして、プロジェクトを進めるんだよ。」
後輩: 「それで、ネットワークが上手くいってないと、全体の作業が滞るってことですか?」
先輩: 「正解!🎯 例えば、ソフトウェア開発では、コードだけじゃなくて、そのコードがどうやって他のシステムやサービスと連携するかが重要なんだ。ウェブアプリを作る時に、データベースや認証サービス、メールサービスなど、さまざまな外部システムとやり取りするでしょ?」
後輩: 「はい、そうですね。」
先輩: 「このときネットワークが上手く設定されていないと、サービス間でのデータのやり取りが遅くなったり、最悪繋がらなかったりするんだ。データベースからのレスポンスが遅れば、ユーザーの待ち時間が長くなるし、メールサービスが繋がらないと、重要な通知が届かない。これじゃあ、ユーザー満足度は下がるばかりだよね。」
後輩: 「確かに、それは良くないですね...」
先輩: 「さらに、セキュリティの面でもネットワークは重要だよ。ネットワークがしっかりしていないと、外部からの攻撃に弱くなるんだ。データの流れをコントロールして、不正なアクセスを防ぐのもネットワークの大事な役割だからね。」
後輩: 「セキュリティは大事ですよね。」
先輩: 「そしてね、クラウドサービスを使う現代の開発では、ネットワークの設計が直接コストにも影響するんだ。データ転送量が多いと料金が高くなるから、効率的なネットワーク設計はコスト削減にもつながるよ。」
後輩: 「へー、経済的な側面もあるんですね。」
先輩: 「まとめると、ネットワークはデータのやり取りを効率的にするため、セキュリティを保ち、コストを管理するために不可欠なんだ。だから、ネットワークを理解することは、良いソフトウェアを作る上で絶対に必要なスキルなんだよ。🌟」
後輩: 「なるほど、ネットワークって本当に色んなところで大切なんですね。勉強してみます!」
先輩: 「いいね!分からないことがあったらいつでも聞いてくれ。一緒に学んでいこう!👍」