⚙️

インフラ基礎から分かるサーバーレス

2023/10/09に公開

はじめに

未経験からWeb系エンジニアに転職して2ヶ月がたった子犬です。
社内では基本的にインフラ環境をサーバーレスで用意することが多く、そもそもインフラの理解が浅い私にとって分からないことだらけだったのでまとめておきます。

対象とする読者

インフラの知識が浅い人、サーバーレスについて知りたい人

大前提

サーバーレスを理解するための基礎知識をまとめておきます。
不要な方は読み飛ばしてもらってOKです!

そもそもサーバーとは?

サーバーとは、プログラムを実行し、コンテンツを提供するコンピューターのことです。
これに対してコンテンツを受け取る側のことをクライアントといいます。

OSとは?

OSとは、「オペレーティング・システム(Operating System)」の略で、システム全体を管理し、さまざまなアプリケーションを動かすための最も基本的なソフトウェアのことです。OSはクライアントOSとサーバーOSに分類されます。
クライアントOSの具体例としては、Windows、macOS、Android、iOSなどが挙げられ、
サーバーOSにはUNIX系、Linux系(RHEL・CentOS・Ubuntuなど)、Windows系が挙げられます。

アプリケーション

アプリケーションとは、ある特定の機能や目的のために作られたソフトウェアです。
Word、Excel、VSCodeなど、わたしたちが普段「アプリ」と呼んでいるものですね。

ミドルウェア

OSとアプリケーションの間に存在するソフトウェアです。
ミドルウェアの具体例として以下のものが挙げられる

  • Webサーバー(HTML・CSS・画像ファイルなどWebページを構成するデータを扱うためのサーバー)
  • DBサーバー(システムが取り扱うデータを一元管理しているサーバー)
  • APサーバー(Webサーバーのリクエストを受けて、DBサーバーと情報のやり取りをするプログラムを実行するためのサーバー)

オンプレミス

オンプレミスとは自社内でサービス運用に必要なリソース(サーバーやネットワーク機器など)を管理する方法のことです。

クラウド

クラウドとは社外で準備されたサーバーやネットワークをインターネットを通じて利用し、サービスを運用する方法のことです。
後述する仮想化技術によって、クラウドを利用し仮想サーバーを用意するだけで、簡単にシステムを運用できるようになりました。

本題

サーバー仮想化

従来では1つのハードウェアにつき、1つのOSが基本でしたが、仮想化技術によって、1つのハードウェア上で複数のOSを動かすことができるようになりました。
サーバー仮想化にはいくつかタイプがあるのですが、今回はハイパーバイザー型とコンテナ型についてのみ言及します。

ハイパーバイザー型

ハイパーバイザー型仮想化とは、仮想化ソフトウェアをサーバーへ直接インストールし仮想マシンを稼働させ、各仮想マシン(仮想サーバー)毎にゲストOSをインストールする方法です。

AWSのEC2(Elastic Compute Cloud)、GCPのGCE(Google Compute Engine)、MicrosoftのAVM(Azure Virtual Machines)などが有名ですね。
EC2では、ユーザーは用途に応じてOSやCPU、メモリを選択し、インスタンスを作成します。
すると、AWSが用意している物理サーバー上で、Nitro Hypervisorという仮想化ソフトウェアを動かし、仮想サーバー(インスタンス)が作成されます。

コンテナ型

コンテナ型仮想化とはホストOS上にコンテナエンジンという仮想化ソフトウェアをインストールし、コンテナと呼ばれるアプリケーションの実行環境を用意する方法です。

ハイパーバイザー型と異なるのは、コンテナ型はホストOS上で動くため、ゲストOSのインストールが不要であることです。
コンテナエンジンとしてはDockerがデファクトスタンダードですが、Red Hat製のPodmanというツールもあるようです。
https://podman.io/
コンテナ型を使ったクラウドサービスとしてはAwsのECS(Elastic Container Service)・EKS(Elastic Kubernetes Service)、GCPのGKE(Google Kubernetes Engine)、MicrosoftのAzure Kubernetes Service(AKS)
※コンテナやECSについては本記事では説明しきれないため省略させていただきます。

サーバーレス

サーバーレスとはサーバー周りの管理をせずにサービスを運用する方法のことです。サーバーレスを採用することで、サーバーの管理(下記イメージの青い部分)はクラウド提供者に任せて、開発者はアプリケーション(赤い部分)の開発に集中することができます。

サーバーレスなサービスとしてはAwsのLambda、GCPのCloud Functions、MicrosoftのAzure Functionsなどがあります。

AWS Lambda

AWS Lamdaは実行したいプログラムをアップロードするだけで利用できるサーバーレスコンピューティングサービスです。
EC2ではOSやミドルウェアの設定・拡張性の管理、ECSではコンテナの管理・可用性の管理などが必要になりますが、Lamdaではそのような設定は不要になります。
Lamdaは現時点では、Node.js、Python、Java、Go、Rubyなどに対応しています。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html

メリットとデメリット

メリット

  • サーバーの管理が不要(前述の通りOSやミドルウェアの存在を意識しなくて良い)
  • セキュリティ(各ソフトウェアやミドルウェアのアップデートやパッチ適用、検証作業等の必要がない)
  • コスト(実行時間に対して課金されるため、比較的安い)
  • 可用性(複数のアベイラビリティーゾーンで関数を実行するため、1つのゾーンで障害が発生しても問題なく実行される)
  • 拡張性(複数の処理を受けると自動的にスケーリングされ、負荷を分散する)

デメリット

  • 実行時間に上限がある(15分以上の処理はできない)
  • 大量アクセスがあるシステムには向かない(リクエストごとで課金される)
  • オンプレミス環境や他のクラウドへ移行しにくい(OS・ミドルウェア・コンテナの設定が別途必要になる)
  • ステートレスなので、Lambdaに状態を保持できない(S3やキャッシュサービスを利用する必要がある)

まとめ

サーバーレスを採用すると、サーバー管理から解放され、開発に注力することができます。
一見すると良いこと尽くめですが、大量アクセスに向かなかったり、10GB以上のメモリが必要な処理は実行できなかったりと、サービスの要件によっては採用すべきではありません。
運用するサービスの要件を考慮した上で、コンテナを使うのかサーバーレスを使うのかを判断する必要があります。

参考文献

https://www.redhat.com/ja/topics/virtualization/what-is-virtualization
https://ncdc.co.jp/columns/7886/
https://www.rworks.jp/system/system-column/sys-entry/21776/
https://pages.awscloud.com/rs/112-TZM-766/images/20221013_EC2_0_OPENING_AWS.pdf
https://ncdc.co.jp/columns/7886/
https://www.sbcr.jp/product/4815612818/
https://d1.awsstatic.com/webinars/jp/pdf/services/202107_AWS_Black_Belt_Container350-Container_and_Serverless.pdf

Discussion