インフラエンジニアというお仕事
はじめに
3年前に現職に転職して、主にインフラエンジニアとして働くことが多く、あらためてどんな仕事をしているかをまとめてみました。インフラエンジニアに興味を持った方がインフラエンジニアとはどんな仕事なのか、ということを理解したり、インフラエンジニアって仕事に興味を持ってもらいインフラエンジニアになりたい!と思うきっかけになれば幸いです。内容はわかりやすさを重視しているため、厳密には違う部分もありますが、予めご了承ください。
インフラとは
ITにおけるインフラとはもともと、ネットワーク、サーバとサーバにインストールするOS、ミドルウェア(MW)、ソフトウェア(SW)を指していて、これをセットアップするのがインフラエンジニアと言われておりました。また、ネットワークについてはネットワーク専門のネットワークエンジニアが構築することもありました。そのため、データセンターから場所を借りて、サーバやネットワーク機器を購入・設置など物理的な仕事が多分にありました。ネットワークやサーバのセットアップが終わったらその上に乗せるアプリケーションを開発するエンジニアに引き渡します。
ですが、新しい技術によって徐々に物理的な仕事が少なくなっていきました。その技術が仮想化です。
仮想化技術
少し話は戻りますが、OSとはそもそもハードウェア(HW)を制御するソフトウェアになります。OSがあることで他のプログラムは簡単にメモリを管理したり、ネットワークを通して他のサーバと通信することができます。
仮想化とは従来はHWとOSは1:1だったのを1:Nに変える技術になります。HWに仮想化基盤をインストールすると、その仮想化基盤の上に複数のOSを立てることができるようになりました。これまでOSが担っていたHWの制御を仮想化基盤が担うようになりました。これにより、新しいシステム開発をする際に「これだけのメモリをもったサーバが何台購入」、といった手続きが減り仮想化基盤に対し必要なスペックのサーバを必要な数だけ払い出すことで済むようになりました。これは以下のような恩恵があります。
・すぐにサーバを払い出せるためシステム開発がスピードアップされる
・サーバのリソース(CPU、メモリ、ディスク)を簡単に変えられるため、無駄なリソースが発生しにくくなりコストを低減できる
・急激なシステムへのアクセスが発生しても、リソースを柔軟に変えられるため機会損失を減らすことができる(テレビでECサイトが紹介され、急激にアクセスが増えサーバが停止してしまうとせっかく売上を上げるチャンスがなくなってしまいます)
この技術を使って新しいサービスが出てきました。クラウドです。クラウドという言葉は色々使われるのですが、ここではIaaS(Infrastructure as a Service)のことを言い、インフラをサービスとして提供することです。
クラウド(IaaS)
これまで、HWを購入してデータセンターに設置しセットアップしてからようやくサーバを使えるようになっていたのが、クラウドサービスではブラウザの操作で10分ほどで完了するようになりました(サーバの設定値はあらかじめ決める必要がありますが)!
クラウドサービスのメリットは色々あるのですが、以下のようなものがあります。
・サーバ構築の時間が短縮され、システム開発の時間を圧縮できる
・複数のデータセンターをまたいだシステム構成を簡単に構築できるので信頼性の高いサービスを作ることができる
・使った分だけ課金されるのでコスト削減がしやすい
・HWや仮想化基盤の管理をしなくてよくなる→運用費用の削減
・資産をもたなくてよいので減価償却しなくてよくなる(税制面で優位)
などがあります。
要するにシステムへの時間的、金銭的投資を少なくなるため、クラウドサービスを使うことで自社の価値提供へ集中することができるようになりました。
一方、デメリットはないかというともちろんそんなことはなく、
・大規模システムを自社に抱えている場合は必ずしもコスト削減にならないケースもある
・クラウド事業者(AWS、Azure、GCP等)のサービスの仕様に沿ったシステムを作ることでベンダーロックになってしまう
・クラウド事業者といえでも障害が発生しないわけではない、クラウド事業者の推奨する構成でシステムを構築しても障害が発生しないわけではない
といったものもありますが、構築するシステムの要件を慎重に見極めればこれらに対応することは可能です。
また、会社の個人情報など機密情報をクラウドに置くことに不安を感じる、という心理的なものもありますが、こういった不安は年々少なくなってきていて、金融や公共系の業界でもクラウドはよく使われるようになっています。
クラウド(PaaS)
IaaSはサーバやネットワークを提供するサービスですが、サーバの上に載せたソフトウェアを含めてサービス提供するPaaS(Platform as a Service)というものもあります。例えばデータベース(DB)を使いたいときには、サーバにDBソフトウェアをインストールしてセットアップする必要がありますが、DBのPaaSでは最初からDBがインストールされたサーバを提供されます。一般的にDBのソフトウェアの管理(データのバックアップやパッチ適用など)はクラウド事業者がやってくれるため、運用が楽になります。
インフラエンジニアのお仕事
前置きが長くなりましたが、今現在はこれらIaaSやPaaSなどのクラウド事業者が提供するサービスを組み合わせてインフラ構築というのがインフラエンジニアの主流の業務になってきています。未だに世界のシステムのうち95%はオンプレミス(自社が契約したデータセンターにシステムを置くこと)にあるという統計もあるので、オンプレミスの仕事も多いと思います。ただし、新規構築はクラウドが多くなってきていると感じます。
さて、クラウドサービスを組み合わせて構築するには、基本的にはWEBブラウザでポチポチしながら作っていくわけですが、物理のHWを使って構築するのとは大きな違いがあります。サーバにせよ、ネットワークにせよソフトウェアによって仮想化されているので、コードでインフラを定義できすることができます。このことをIaC(Infrastructure as Code)といいます。あくまでイメージで実際には存在しないコードですが、例えば、、
ネットワーク作成:
名前: network-A
ネットワークアドレス: 172.30.0.0/16
のように書くだけでネットワークを構築できてしまいます。このIaCの利点はなんでしょうか。
例えば、あらかじめインフラをコード化しておけば障害が発生したときに、同じ環境を別の場所へ再構築し復旧させるようなことも簡単にできます。また、同じ環境を別の国や地域に作るときにも最初に作ってしまえば、あとは簡単に複製することができます(クラウドサービスでは色々な国や地域に環境を作ることができます)。以前、AWSの東京リージョンで大規模障害が発生し復旧まで6時間程度かかり、様々な企業のサービスや業務に影響が出たことがありました。このときにSORACOMというIoT向けのSIMを発行する会社があるのですが、1~2時間(記憶が定かではないですが)でサービスを復旧させました。これはおそらく、サービス提供に関連するインフラをすべてコード化させておき、東京以外のリージョンや別のクラウド事業者で同じ環境を構築したと想像できます。
このIaCという考えは、サーバやネットワークだけでなく、サーバのOSの設定やOSにインストールするソフトウェアにも適用することができます。
なお、サーバで動作する自分たちが開発したプログラムの搭載もツール等を使って簡単に行うことができます。この開発したプログラムを搭載する一連のプロセスのことをCI/CDといいます。
CI/CDとは
もともとシステム開発は大きな塊で一斉に開発していましたが、システムが大きくなればなるほど複雑になり、障害が発生しやすいくなります。また、開発をスタートさせてからシステムの提供が完了するまで時間がかかり、昨今のビジネスのスピードに合わなくなりつつありました。そこでシステムの単位を小さく分け、できるだけ細かいシステムや機能ごとにリリースするようになってきました。
その流れの中で、作ったプログラムを早く環境へ反映(デプロイといいます)するためのツールが開発されました。そのツール群やプロセスのことをCI/CDといいます。CI(Continuas Integration)は継続的インテグレーションのことで、CD(Continuas Delivery)は継続的デリバリーのことです。
具体的にはリポジトリというプログラムを格納するところに開発したプログラムを格納すると、そのプログラムのコードのチェック、コンパイル(コードからコンピュータが理解できる形式にすること)やテストがされ、本番環境などへプログラムを配置、プログラムが正常に動作しているかテスト、といったプロセスがあります。また、リポジトリはバージョン管理ができるため、プログラムが正常に動作しないときには古い安定的に動作するバージョンへから戻すこともできます。
このCI/CDのメリットは以下の通りです。
・プログラムを作成、修正したらすぐにサービスへ組み込むことができます
・プログラムを修正するたびに脆弱性がないかをチェックすることができるのでセキュリティを高めることができます
・プログラムを修正するたびに動作に不具合がないかテストをすることができるのでバグを少なくすることができます
・手作業で同じことをやると、ミスする可能性はありますが、CI/CDでプログラムをサービスへ反映するときの結果は常に同じです(1度ちゃんと動作するように設定すれば何度やっても正常に動作します)
CI/CDの構築についてもインフラエンジニアが担当することが多いです。
システム開発の「機能」と「非機能」
システム開発では大きく分けて、機能と非機能という言葉があります。機能は欲しいシステムの機能そのものです。例えばECサイトであれば以下のようなものがあります。
・商品の一覧を表示する機能
・商品を購入できる機能
・商品を管理する機能
・etc.
これらはシステムがほしい人が、オリジナリティを出し独自のものを要求すればするほど、自分達でプログラム言語を書いて開発、またはお金を払って開発会社へ発注する必要があります。機能面を開発するのはアプリケーションエンジニアになります。
一方の非機能はこれら機能以外のものを指します。例えば、システムが簡単に停止しないように複数のサーバを構築し、1台壊れても他のサーバで処理をできるようにしたり、データベースのディスクが壊れたときに復旧できるようにバックアップを取ったり、サーバが不正アクセスされデータを抜き取られないようにセキュリティを高めたりすることです。これらは費用をかければかけるほど高い性能になるので、バランスを見ながら設計・構築する必要があります。これら非機能の多くはインフラエンジニアが検討することが多いです。
なお、システム開発委託において一般的に委託元は機能についてはちゃんと理解しているため、基本的な機能不備が発生しにくいのですが、非機能を理解していないため、障害が問題になることが比較的多いです。そのため、IPAという公的機関が「非機能要求グレード」という非機能のガイドラインを公開してくれてます。これに沿って要件を考えることによって非機能の不備が発生しにくいシステム開発ができます。
おわりに
インフラエンジニアの仕事とは何か?が少しはイメージできるようになったのであれば幸いです。もともとインフラエンジニアに必要なサーバやネットワーク機器の勉強はHWがないと難しかったのですが、今はクラウドで簡単にインフラを構築できますし書籍やネット上の情報もたくさんあります。またプログラムは書けないといったイメージが強かったインフラエンジニアですが、今はコードを書く機会が多いです。
アプリケーションを開発するエンジニアに比べて何をやるのかがわかりにくいインフラエンジニアは、目指す人も少ないと思われるため、今後人材が不足していくことが予想されます(まあ、少子高齢化でIT化が遅れている日本では、セキュリティ、データサイエンティスト、DX人材などなどあらゆる人材が不足しているのですが)。興味を持った方はぜひインフラエンジニアを目指していただければと思います。また、ITをやっている人はみんなある程度インフラを勉強したほうがよいエンジニアになるれると思います。
この記事が気に入ったらサポートをしてみませんか?