サーバ/インフラエンジニアを読んでみた

##概要
サーバ/インフラエンジニアという今年4月に出たばかりの本を読んでみた。
内容としては基礎的なことが書いてあり、初学者や改めて基礎を見直したい人にはおすすめの内容だった。
全体で10章から構成されており、個々のトピックがよくまとまっている。
今回はその中から自分なりに考えたことをざっくりとまとめていけたらと思い、ここに記す。
詳細は以下リンクから確認し、購入してください。
[サーバ/インフラエンジニア](https://gihyo.jp/book/2021/978-4-297-11944-7)

##第1章　エンジニアとして生きる
###インフラエンジニアとは？
レイヤとしての「インフラ」だけを切り出したエンジニアのこと

###技術力とは？
ハートビーツのエンジニアの倫理規定にある文を引用として以下に記していました。
>技術とは、
・結果を出す過程を構成し、実現するもの・ことの全体を技術と呼びます
　・技術を為す人＝技術者＝エンジニア
・ちなみに判断と行動の品質・程度・速度を決定するのは技能

そしてエンジニアのことも以下のように示しています。
>教わっていなければ自ら学び、世に適切な解決策がなければ自ら創るのがエンジニアです。

###成長とは？
社会人としての成長は学生の時と違うと、感覚的には掴んでいましたが言語化出来ていませんでした。
そんな時、以下文章に出逢います。
>社会人の成長とは、端的に以下の３要素で説明できると考えます
　・結果を実現すること
　・結果の期待値を維持すること
　・結果の期待値を高めること
社会人の成長は相手からの信頼で構成されていると言ってもよいです。

学生の頃と異なり、成長が自己完結しない点が社会人としての成長であると改めて認識した瞬間でもあった。
そして結果を出せるようになる為には学習が欠かせない。その学習の流れについて、次に説明がある。

###学びとはどういうことか？
結果を出せるようになるには、「論理的判断」と「倫理的判断」が必要と筆者は述べている。
その上で、忘れてはならないのが以下の学びのモデルである。
####学びのモデル
#####①入力：読書などの知識獲得活動や写経・チュートリアルなど型どおりの訓練をするフェーズ
#####②解釈：獲得した知識や体感をモデル化・抽象化し、原理原則を得るフェーズ
#####③出力：構築したモデルを援用。応用し、設計・実装など具体化を実践し実際の課題を解くフェーズ
#####④検証：課題の解決状況、解決の仕方を検証するフェーズ（検証結果の次の周回を入力とする）
継続的に学ぶ上では、鉄の意志でサイクルを回し切ること。検証の際に技術スタックを参考にどの要素が不足していたのか・過剰だったのか、自ら論理的に整理することが重要だとも述べている。
特に以下の文が個人的には刺さった。
>学びの段階から、正解を当てるのではなく、考え判断する訓練をしましょう

日本の教育課程のせいかつい答えを探そうとする自分がいる。でもそれは間違いで、正しくは「考えて判断する」ことが大切だと考えを見直した。

####どうなると「ある程度わかっている」か
>「ある程度わかっている」かを評価できるのは、自分より技術力の高い他者である

と筆者も述べている。その上で、
>「拙くても自力で課題を発見し解決できる」「その中で学び・成長できる」という2点を継続的に実現できるようになると、いい感じ

だと述べていた。よって、上で述べていたことを実践すればよいと認識した。

####「正しい情報」とは
エンジニア初期の頃よく思ったのが、「正しい」って何？という問いだった。
数多あるネットの知見から「正しい」を割り当てるのが難しかったからかもしれない。それもきっと前項で述べていた「学びのサイクル」が回りきっていなかったからかもしれない。そうは言っても、以下のように正しい情報について述べている。
>「正しい」は人の立場や数だけあるので注意してください。仕様の解釈としてどちらもあり得るというケースがままあり、現場レベルで、正しい/誤りという軸で考えるのは不毛です。

この一文を読んで、もっと早くにこの本に出会っておけばよかったと心の底から思った。

##第2章　ネットワークの基礎知識
####小まとめ
>・インターネットは世界中で繋がっている
・インターネットは小さなネットワークの集合体
・通信技術は階層化されている
・上位階層に提供する機能ややりとりの方法を規格として定義している

###IPv4とは

#####プライベートIPアドレス以外の、特定用途向けIPv4アドレス

|IPv4アドレス|名称|説明|
|:---|:---|:---|
|127.0.0.1~127.255.255.254|ループバックアドレス|自分自身を指すアドレス
|169.254.0.0~169.254.255.255|リンクローカルアドレス|同一リンク（ネットワークセグメント）で利用できるアドレス|

###マルチキャスト・エニーキャスト・ブロードキャスト

|名称|説明|目的や利用方法|
|:---|:---|:---|
|マルチキャスト|1対Nの通信のこと|複数のノードに一斉同報する|
|ブロードキャスト|条件付きのマルチキャスト|DHCPはブロードキャストを利用して設定情報を持つノードを探す|
|エニーキャスト|1対1だが特定の誰かでなくても良い通信|特定の情報を広く配布する時に利用する。CDNやDNS、NTPで利用される|

###ルーティングとは
通信相手が同じネットワークにいない場合、複数のネットワークに所属し、パケットを仲介するノードのことを「ルータ」という
ルータがパケットを仲介する処理のことを「ルーティング」というと述べている。
####ルーティングのやること
ルータがパケットを自分の次にどのノードに送出するのかを決定し、パケットを送出すること
各ノードは基本的にそれぞれが持つ「ルーティングテーブル」と呼ばれるルーティング規則集に則り、ルートを決定する
どのルーティング規則にも該当しなかった場合に採用する宛先を「デフォルトゲートウェイ」と呼ぶ。

####ルーティングの種類

|名称|説明|利用例|
|:---|:---|:---|
|スタックルーティング|予めルーティングテーブルを定義しておくこと||
|ダイナミックルーティング|予めルーティングテーブルを定義しないで動的に決めること|BGP|

####BGPって何？
>BGPはネットワークの集合をASとしてまとめ、AS単位で経路を制御すること

と、本文にありました。以下つづきです。
>ASごとに一意的なAS番号が割り当てられており、日本のJPNICがその番号を管理しています。
BGPでは各ASは他のASと直接接続の可否を交渉します。交渉は人の対話によって進められます。

###TCP/UDP
####コネクションとセッション
コネクションとセッションの違いについて、以下のような記述があった。
>通常、コネクションはTCPなどL4での、セッションはHTTPなどL7での一連のやりとりを指します。

###通信の質とは
通信速度は1秒あたりのデータ転送量を用いてByte/秒またはbit/秒で表す。
上記で表されたものは「帯域幅」と言われ、理論上最大性能を示す値としてよく利用されると述べられている。


##第3章　インターネットの基礎知識
####DNSとは
ドメイン名とIPアドレスを紐付けして利用する際、管理・利用する仕組みのこと

#####権威サーバとフルリゾルバ

|名前|機能|備考|
|:---|:---|:---|
|権威サーバ|名前解決の為の大元のデータを保持し、問い合わせに対して名前解決を行うサーバ||
|フルリゾルバ|権威サーバに問い合わせを行い、名前解決を行うサーバ。名前解決をした結果は一定期間保持し再利用する|フルリゾルバが別のフルリゾルバに聞きに行くことを「フォワーディング」と呼ぶ|

#####DNSレコード

|recode|意味|用途|
|:---|:---|:---|
|A|a host address|正引き|
|CNAME|the canonical name for an alias|エイリアス（別名に対する正式名を指定する時に使用）|
|TXT|text strings|ドメインの管理・活用のための属性情報|
|MX|mail exchange|メール配信先決定|
|SOA|marks the start of a zone of authority|そのゾーン情報のバージョンや有効期限などの基本的な情報|
|NS|an authoritative name server|ネームサーバ指定|
|PTR|a domain name pointer|逆引き|

#####権威サーバの構成
権威サーバはプライマリとセカンダリの冗長構成になっている。
プライマリ：大元のレコード定義を持ち、権威サーバとして振る舞う。マスタとも呼ばれる
セカンダリ：プライマリからレコード定義を受け取り、権威サーバとして振る舞う。スレーブと呼ばれる

####DNSの負荷分散
DNSの負荷分散を行う手法として「DNSラウンドロビン」というものがある。
問い合わせごとに並び順を入れ替えることで、クライアントに採用されるIPアドレスが分散し、結果的に負荷分散が出来るというもの。

####HTTPSとは
3つが保証されている
>・通信経路が暗号化されていること
・通信相手がドメイン名のとおりであること
・通信内容の改竄を検知できること

上記の2つ目である「通信相手がドメイン名のとおりであること」は、通信相手が正当に利用可能な人であることを確認することである。
流れとしては、
①サーバ（接続される側）がクライアント（接続する側）に証明書を提示する
②クライアントはその証明書から「システム管理者が証明書を取得し、所有していること」を検証する。

####PKIとは
Public Key Infrastructureのこと。要素技術として、公開鍵暗号・デジタル署名・デジタル証明書がある。

######データに対する処理の種類

|処理|元データの容量削減|元データの秘匿|元データの復元|
|:---|:---|:---|:---|
|符号化|×|×|○|
|圧縮|○|×|○|
|暗号化|×|○|○|
|ハッシュ化|△|○|×|

#####公開鍵暗号とは
暗号化と復号で同じ鍵を利用する方法を「共通鍵暗号方式」と呼ぶ
共有する鍵は「キーペア」と言う
相手に片方の鍵を送り、もう片方の鍵は自分用に運用することを「公開鍵暗号方式」と呼ぶ

#####デジタル署名とは
暗号技術を用いて2つのことを実現する
>・とあるデータに署名があった時、それが本人の署名であることを第三者が検証可能
・とあるデータに署名があった時、そのデータが署名された時のデータと同一であることを第三者が検証可能

上記2つの実現の為のやり方は以下方法を取る
①公開鍵暗号方式と同様キーペアを作る
②対象のデータをハッシュ化し、プライベートキーで所定の計算を行う
③署名されたデータに所定の計算を行なったものと渡された元データをハッシュ化したものを比較する

##第4章　サーバの基礎知識
#####OSの役割とは
ハードウェアとアプリケーションプログラムの仲介をすること
#####システムコールとは
カーネルの機能を実行する為のインターフェースのこと
システムコールという関数を呼び出す
#####APIとは
システムやプログラムの呼び出し・データのやりとりなどを行う為のインターフェースのこと
#####シンボリックリンクとは
ファイルやフォルダの代理人ファイルのこと
あるパスを参照する指示をファイルとして配置することが出来、元ファイルと同じように振る舞う
#####ハードリンクとは
同じパーティションなら作成できるファイルにつけたあだ名のこと
削除すると元データも削除される

####ソフトウェアの管理
#####パッケージバージョン管理
rpmコマンドなどで入れたパッケージのバージョンは、多くの場合３階層の数値で表すことが出来る
それは「x」「y」「z」で表すことを指し、それぞれ以下の表のように表すことが出来る
[セマンティックバージョニング](https://semver.org/lang/ja/)と呼ばれるルールに、バージョンの指定方法やバージョンの上げ方が記載されている

|表記|名称|説明|
|:---:|:---|:---|
|x|メジャーバージョン|パブリックAPIに対して後方互換性を持たない偏向が取り込まれた場合に上げなければならない|
|y|マイナーバージョン|後方互換性を保ちつつ、機能性をパブリックAPIに追加した場合に上げなければならない|
|z|パッケージバージョン|後方互換性を保ったバグ修正を取り組んだ場合に上げなければならない|


##第5章　仮想化の基礎知識
####コンテナとは
プログラム実行空間を隔離する技術の総称である
サーバ仮想化はハードウェアをソフトウェアで再現するが、コンテナはホストのリソースを隔離してコンテナに提供する
また、コンテナには2種類の志向性がある。「システムコンテナ」と「アプリケーションコンテナ」である

####アプリケーションコンテナとは
特定のアプリケーションプログラムのプロセスをコンテナとして実行するもの
OS全体ではなく、特定のプロセスをコンテナ化する
代表的なものとして「Docker」がある

#####アプリケーションコンテナの運用
１コンテナ１アプリケーションが鉄則
複数のコンテナをセットで使う場合は、それぞれに個別に手動で起動・管理するのではなく、セットで管理したくなる。
そこで、複数の・一連のアプリケーションコンテナをセットで管理する為の方法が「docker-compose」が生まれる

#####docker-composeとは
複数の・一連のアプリケーションコンテナをセットで管理する為の方法
やり方は、docker-compose.ymlファイルで構成を宣言的に定義する
docker-composeを用いて、ローカルPC内に開発環境と近しいものを作り、本番環境の差が小さい状態で開発を行うことが可能になる

#####Kubernetesとは
マルチホスト環境でコンテナベースのアプリケーションを上手く動かす為に用いられる
やり方はyamlファイルを用いて、設定ファイルを宣言的に記述してアプリケーションの状態を定義する
一連のコンテナ群＝「pod」と呼ぶ
移動基盤となるノードのうち、どのノードにどれだけの数のpodを配備するか、それらをどのように接続するか、Kubernetesを通じて設定・管理できる

####ストレージやネットワークの仮想化
仮想化する技術を「Software Defined XXX」と定義する
ストレージの場合は「Software Defined Storage」
ネットワークの場合は「Software Defined Network」

#####ネットワーク隔離技術
ネットワークを仮想化する技術として、VLANとVXLANがある

|名称|種類|説明|
|:---|:---|:---|
|VLAN||仮想的なLANセグメントを作る技術|
||ポートVLAN|1つの聞きポート単位で分割・接続し、仮想敵に複数台のスイッチを実現する|
||タグVLAN|L2ネットワーク上のトラフィックを隔離する技術|
|VXLAN||VLANの拡張版|

##第6章　ミドルウェアの基礎知識
####アプリケーションサーバとは
システムの中で受け取ったデータを解釈し、必要な処理を行い動的生成コンテンツの生成処理を行うサーバのこと
１リクセストの内容が複雑なので、１プロセスにかかるCPUやメモリが多く必要となる

#####オンライン処理とバッチ処理

|名称|説明|
|:---|:---|
|オンライン処理|処理要求を随時処理する|
|バッチ処理|処理要求を一括処理する|

#####アプリケーションサーバプログラム
素早く返事を返す為に、プログラム言語のランタイムと密に結合している
下記の表は、アプリケーションサーバプログラムとプログラム言語の対応表で、
その言語で記載することでアプリケーションサーバプログラムのレスポンスを早くなる

|プログラミング言語|アプリケーションサーバプログラム|
|:---|:---|
|PHP|php-ftp|
|Perl|plack|
|Python|gunicorn|
|Ruby|unicorn|
|Java|Apache Tomcat|

####ロードバランサーとは
負荷分散をするもの
L4で負荷分散するものとL7で負荷分散するものがある

#####切り離しとは
ロードバランサー内でヘルスチェックを行い、バックエンドが過負荷や応答不能になったら分散先バックエンドの一覧から対象を削除する処理のこと

#####ヘルスチェックとは
ロードバランサーが実施する負荷分散チェック
アクティブヘルスチェックとパッシブヘルスチェックがある

####プロキシとは
接続時に代理を実施するもの
大きくパフォーマンスを向上させるものとセキュリティを向上させる2つの役割を持つ
配置方法によってその役割が異なる

#####フォワードプロキシ
アクセスされた時にセキュリティ向上を目的として利用されることが多い
※作成する時は、各接続元での設定すること
具体的には、インターネットに繋ぐ前にフォワードプロキシを経由するようにするように設定する必要がある

#####リバースプロキシ
Webサーバの前に存在するもので、DoS攻撃などの盾となる役割を持つ
スケールアウトしやすい為、HTTPS接続を終端させて暗号化通信の復号処理をスケールアウトさせることもある

#####コンテンツキャッシュ
リバースプロキシ/CDNを上手に利用する為に使用するもの
「コンテンツを特定する何かの値」と「コンテンツ自身」のセットを有効期限つきで管理するもの
キャッシュを制御するレスポンスヘッダというものがある

####KVSとは
DBMSの一つで、SQLを使わないでデータの管理とデータ自身を保存・取り出す為のDBMS
構造がシンプルな為、ディスクへのデータを永続化しないことで高速にデータの読み書きが出来る
いわゆるNOSQLと呼ばれるもの

##第7章　Webサービス運用の基礎知識
####システムの大前提
>・システムは何もしないと壊れる
・システムはよくわからない状態になる

####システムの可用性とは
利用可能な状態である度合いのこと。
可用性を測る為にSLIと呼ばれる指標がある
SLIの目標値と「SLO」
システム利用者に対しての約束を「SLA」と呼ぶ

####運用フェーズでの情報共有
運用していく上で情報共有が欠かせない
情報には2種類あり、「ストック情報」と「フロー情報」がある

#####ストック情報とは
ストックする用の情報のこと
「ドキュメント」と「チケット」の2種類ある
ドキュメント：ナレッジベースのような唯一の最新版が用意に特定でき、変更履歴が追跡できるツールを利用する
wordなどで管理していたが、GitFlowなどを利用することが多くなってきている
チケット：課題管理に利用するITSやBTSが基盤となっている
１チケット1トピックを守り、1つずつcloseしていくと良い

#####フロー情報とは
フロー情報の基盤はチャット
メーリングリストにより管理していたが、チャットによって管理し始めている

####構成管理・変更管理
構成管理：システムの構成要素を把握・管理すること
変更管理：システムに対する変更を把握・管理すること
最近はインフラもソフトウェア化しており、IaCが望ましい形となりつつある

####デプロイ戦略について
巨大Webシステムの運用をしていく中で、様々なデプロイ戦略が磨かれてきた。
代表的なものは以下の表のようなもので、これらを使ってデプロイされている。

|デプロイ戦略|概要|
|:---|:---|
|Blue/Green Deployment|稼働環境をもう一式フルセットで用意し、一気に切り替える|
|Rolling Deployment|少数ずつ更新していく|
|Canary Deployment|少数を更新し、しばらく様子を見る。問題がなさそうなら他にも適用していく|


##第8章　セキュリティの基礎知識
Firewallの話が記載されていました。

##第9章　クラウドの基礎知識
クラウドネイティブという考え方がある。
クラウドネイティブ：クラウドコンピューティングに最適なシステムや取り組み全般のこと
また、他クラウドサービスの詳細について記載してある章でした。

##第10章　法律・ライセンスの基礎知識
エンジニアとして認識しておく必要のある法律関係の事柄が記載されていました。



##まとめ
エンジニアとして働いていく上で、基礎となる知見が多く含まれた1冊でした。
入社したばかりの新卒社員、また未経験からインフラエンジニアになりたいと思っている方にぜひ勧めたいと思う。