【初学者】オリジナルのアプリケーションをデプロイする際に調べたサーバーの分類まとめ

## はじめに
これは私が初めて作成したWebアプリケーションをデプロイする際、どのサーバーを選択するかを調べた結果です。全く何もわからない状態からデプロイしようと思ったので、まずはデプロイ先にはどのような種類があるのかWebサイトや生成AIを用いて調べました。主要な選択肢は網羅できているかと思っているのですが、間違っているところもあるかもしれません...!　

(この記事の内容を初心者向けに例えを用いてわかりやすくしたものを作りました！以下のリンクから見ることができます！）<br>　https://qiita.com/takumi0505/items/a3701dd72e6ebaea5d95
### 0-1. 動的コンテンツと静的コンテンツ

まずはサーバーの種類の前に、把握しておいたほうがわかりやすかったことを2点整理します。<br>Web アプリケーションは、大きく「動的コンテンツ」と「静的コンテンツ」の2種類に分けられます。

- **静的コンテンツ:** 常に同じ内容が表示されるコンテンツのこと。HTML、CSS、JavaScript、画像、動画など。  

    - **静的コンテンツのみの場合におすすめのサービス:** 後述する「CDN (Content Delivery Network)」は、静的コンテンツの配信に特化しており、高速化、高可用性、セキュリティ対策などを低コストで実現できます。  
　
- **動的コンテンツ:** ユーザーの操作やデータに基づいて、表示内容が変わるコンテンツのこと。ログイン後の画面、検索結果、ECサイトの商品ページなど。  

    - **動的コンテンツを扱う場合:** 後述するサービスのいずれかを選択する必要があります。  

### 0-2. サーバーレス？ それともサーバー管理が必要なサービス？
次はサーバーレスか否かの違いです。
サーバーレスは、サーバー管理をサービス提供者に任せ、開発者はコードに集中できるサービスです。一方、サーバー管理が必要なサービスは、自由度が高い反面、インフラ管理を自身で行う必要があります。

- **サーバーレス:**
    - インフラ管理不要で、開発効率が高い
    - スケーラビリティや可用性が高い
    - 利用した分だけ課金されるため、コスト効率が良い
- **サーバー管理が必要なサービス:**
    - 自由度が高く、カスタマイズしやすい
    - コストを抑えられる場合がある
    - サーバー管理の知識が必要

まずは、「サーバーの管理を一切したくないか、ある程度は自分でコントロールしたいか」で大枠を決めると、選択肢を絞り込みやすくなります。

## サーバーレスで運用したい場合

### 1. FaaS (Function as a Service)

**イベント駆動型のサーバーレスプラットフォーム**

HTTPリクエスト、データベースの更新など、特定のイベントをトリガーに関数が実行されます。サーバー管理は一切不要です。動的コンテンツを生成する処理を関数として実装し、API経由で呼び出すことで、動的なWebページやアプリケーションを構築できます。

- **メリット:**
    - **イベント駆動:** 必要な時だけコードが実行され、無駄なリソースが使用されません。  
    - **スケーラビリティ:** 自動でスケールアップ/ダウンします。  
    - **管理不要:** サーバーやインフラの管理が不要。従量課金制のため、利用した分だけ費用が発生します。  
- **デメリット:**
    - **ランタイム制限:** 実行時間やリソースに制限のある場合が多い。  
    - **状態管理の難しさ:** ステートレスな処理に適しており、状態を保持する必要がある場合は工夫が必要。  
    - **コールドスタート:** 一定期間アクセスがない関数を実行する際に、起動処理が発生し、遅延を発生させる場合がある。  

**こんなアプリケーションにおすすめ:**

- **API のバックエンド:** Web API のエンドポイントとして関数を実行し、動的コンテンツを返します。  
- **データ処理:** 画像の変換、ファイルのアップロード処理など。  
- **バッチ処理:** 定期的な処理や、大量データの処理。  
- **マイクロサービス:** 小さなサービス単位で開発・デプロイするアーキテクチャに最適。  

**動的コンテンツをどのように処理するか:**

FaaS では、イベントをトリガーに実行される関数の内部で、データベースへのアクセスや外部 API 呼び出しなどを行い、動的にコンテンツを生成します。生成したコンテンツは、API 経由でクライアントに返したり、データベースに保存したりします。

**代表的なサービス:**

- AWS Lambda
- Google Cloud Functions
- Azure Functions
- Cloudflare Workers (JavaScript 環境)

### 2. CaaS (Container as a Service)

**コンテナ化されたアプリケーションをサーバーレスで実行**

Docker イメージをビルドするだけで、スケーラブルで費用対効果の高い方法でアプリケーションをデプロイできます。 コンテナ内でアプリケーションサーバー (Apache Tomcat, Nginx など) や必要なライブラリを全て含めることで、動的コンテンツを処理できます。

- **メリット:**
    - **サーバーレス:** インフラ管理が不要で、開発者はアプリケーション開発に集中できます。  
    - **スケーラビリティと可用性:** トラフィックの増加に応じて自動的にスケールアップ/ダウンします。  
    - **ポータビリティ:** Docker イメージで動作するため、様々な環境で実行できます。  
- **デメリット:**
    - **コールドスタート:** アクセスのない状態が続くと、コンテナが停止し、次回アクセス時に起動処理が発生します。　
    - **監視とロギング:** コンテナの監視やログ管理は、従来のサーバー環境とは異なる方法が必要になる場合があります。　

**こんなアプリケーションにおすすめ:**

- **Web アプリケーション:** Web サイトや Web サービスなど。動的コンテンツを含むアプリケーションも実行できます。　
- **API サーバー:** REST API や GraphQL API など。　
- **マイクロサービス:** 複数のコンテナを組み合わせて、アプリケーションを構築する際に便利です。　

**動的コンテンツをどのように処理するか:**

CaaS では、コンテナ内で動作するアプリケーションサーバーが、リクエストを受け取り、動的コンテンツを生成します。データベースへのアクセスや外部 API 呼び出しなども、コンテナ内で行われます。

**代表的なサービス:**

- Google Cloud Run
- AWS App Runner
- Azure Container Apps

### 3. BaaS (Backend as a Service)

**アプリケーションのバックエンド機能を提供**

データベース、認証、ストレージなど、バックエンド機能が予め用意されているため、開発期間を短縮できます。 BaaS が提供する API を利用することで、動的コンテンツを扱うアプリケーションを効率的に開発できます。

- **メリット:**
    - **迅速な開発:** バックエンド機能が予め用意されているため、開発期間を短縮できます。 
    - **サーバー管理不要:** サーバーやインフラの管理が不要で、開発者はアプリケーションロジックに集中できます。 
    - **スケーラビリティ:** サービスの負荷に応じて自動的にスケールアップ/ダウンします。 
- **デメリット:**
    - **ベンダーロックイン:** 特定の BaaS ベンダーに依存する可能性があります。 
    - **カスタマイズの制限:** 提供される機能や API が制限される場合があります。 

**こんなアプリケーションにおすすめ:**

- **モバイルアプリ:** 認証、データベース、プッシュ通知など、モバイルアプリに必要なバックエンド機能を簡単に実装できます。 
- **Web アプリケーション:** ユーザー管理、データストレージ、API サーバーなど、Web アプリケーションのバックエンド機能を構築できます。 
- **IoT アプリケーション:** デバイス管理、データ収集、リアルタイム処理など、IoT アプリケーションに必要なバックエンド機能を実現できます。 

**動的コンテンツをどのように処理するか:**

BaaS は、動的コンテンツを処理するための API を提供しています。例えば、ユーザーのログイン状態に応じてコンテンツを変える場合は、BaaS の認証 API を利用してログイン状態を確認し、その結果に応じてコンテンツを生成します。

**代表的なサービス:**

- Firebase (Google)
- Supabase
- AWS Amplify

## サーバー管理が必要なサービスを利用する場合

### 1. クラウドサーバー (IaaS: Infrastructure as a Service)

**クラウド上で仮想化されたサーバーを自由に構築・運用**

クラウドサービスプロバイダーが提供する仮想化されたインフラストラクチャです。仮想マシン、ストレージ、ネットワークなどのリソースを必要なだけ利用できます。

ユーザー自身でアプリケーションサーバーやデータベースなどをインストールし、設定することで、動的コンテンツを処理できます。

- **メリット:**
    - **柔軟性:** 仮想マシンを自由に作成、削除、設定可能。ニーズに合わせてリソースを調整できます。 
    - **スケーラビリティ:** リソースを簡単にスケールアップ/ダウンできます。 
    - **可用性:** 高可用性のデータセンターを利用でき、信頼性が高い。 
- **デメリット:**
    - **管理負担:** OS のインストール、パッチ適用、ネットワーク設定など、インフラ管理が必要です。 
    - **コスト:** 利用量に応じた課金で、長期的には高額になることがあります。  

**こんなアプリケーションにおすすめ:**

- **大規模・高トラフィックな Web サイト:** 多くのアクセスを処理できるリソースが必要な場合。 
- **複雑なシステム構成が必要なアプリケーション:** データベース、キャッシュサーバーなど、複数のサーバーを連携させる必要がある場合。 
- **機械学習など、高性能な計算リソースを必要とするアプリケーション:** GPU インスタンスなど、特殊なハードウェアが必要な場合。 

**動的コンテンツをどのように処理するか:**

IaaS 上に構築したサーバーで、アプリケーションサーバー (Apache Tomcat, Nginx など) やデータベースなどを動作させることで、動的コンテンツを処理します。

**代表的なサービス:**

- AWS EC2 (Amazon Web Services)
- Google Compute Engine (Google Cloud Platform)
- Azure Virtual Machines (Microsoft Azure)

### 2. PaaS (Platform as a Service)

**アプリケーション開発に集中できるプラットフォーム**

アプリケーションの開発、実行、管理に必要なプラットフォームを提供します。インフラ管理をある程度プロバイダーに任せつつ、柔軟性も求める場合に適しています。PaaS が提供するアプリケーションサーバーやフレームワークを利用して、動的コンテンツを処理できます。

- **メリット:**
    - **簡易デプロイ:** コードをアップロードするだけでアプリケーションをデプロイ可能。
    - **管理の軽減:** 基盤となるインフラ、OS、ミドルウェアの管理をプロバイダーが行います。  
    - **統合サービス:** データベース、認証、スケーリングなどが統合されている。
- **デメリット:**
    - **カスタマイズの制限:** 提供される環境に依存し、細かなカスタマイズが難しい場合がある。
    - **コスト:** 利用料金が高くなることがある。 
    - **ベンダーロックイン:** 特定の PaaS ベンダーのサービスや技術に依存する可能性があります。 

**こんなアプリケーションにおすすめ:**

- **比較的シンプルな Web サイト/アプリ:** ブログ、ポートフォリオサイト、社内システムなど。動的コンテンツを含むアプリケーションも実行できます。 
- **開発効率を重視する場合:** インフラ設定に時間をかけずに、すぐに開発を始めたい場合。 
- **特定のプラットフォームに最適化された環境が必要な場合:** 特定のフレームワークや言語に特化した PaaS もあります。 

**動的コンテンツをどのように処理するか:**

PaaS 上で動作するアプリケーションサーバーが、リクエストを受け取り、動的コンテンツを生成します。データベースへのアクセスや外部 API 呼び出しなども、PaaS 上で行われます。

**代表的なサービス:**

- Heroku
- Google App Engine
- AWS Elastic Beanstalk
- Render
- Google Cloud Run
- Fly.io
- Netlify
- Vercel

### 3. オンプレミスサーバー

**自社で所有・管理するサーバー**

物理的に所有し、自社で管理するサーバーです。独自のデータセンターや専用サーバーを使用します。

クラウドサーバーと同様に、ユーザーがインストールしたソフトウェアで動的コンテンツを処理します。

- **メリット:**
    - **完全な制御:** ハードウェアとソフトウェアを完全に管理できる。 
    - **セキュリティ:** データの保存場所を完全に制御できるため、高いセキュリティ要件を満たせる。 
    - **カスタマイズ性:** ハードウェア、OS、ソフトウェアを自由に選択・設定できます。 
- **デメリット:**
    - **高い初期コスト:** サーバーの購入と設定に多額の投資が必要。 
    - **継続的な管理:** メンテナンス、アップデート、障害対応などの管理が必要。 
    - **スケーラビリティの制限:** トラフィックが増加した場合のスケーリングが難しい。 

**こんなアプリケーションにおすすめ:**

- **機密性が高く、厳重なセキュリティ対策が必要なデータを取り扱うアプリケーション:** 金融機関のシステム、医療機関のシステムなど。 
- **既存のシステムとの統合が必要で、クラウドへの移行が難しいアプリケーション:** レガシーシステムとの連携が必要な場合など。 
- **法規制により、データの保管場所が制限されるアプリケーション:** 特定の国/地域にデータを保管する必要がある場合など。 

**動的コンテンツをどのように処理するか:**

オンプレミスサーバー上に、アプリケーションサーバー (Apache Tomcat, Nginx など) やデータベースなどをインストールし、設定することで、動的コンテンツを処理します。

**形態:**

- **自社データセンター:** 完全に自社で管理する場合。
- **リースされた専用サーバー:** ホスティングプロバイダーから専用サーバーをリース。

## ~番外編~
## コンテナを活用したアプリケーション開発

###  コンテナオーケストレーション

**複数のコンテナを効率的に管理・連携**

Dockerなどのコンテナ技術を使い、アプリケーションとその実行環境をパッケージ化し、複数のサーバー上で管理、スケーリングするためのプラットフォームです。 **IaaS 上にコンテナ化されたアプリケーションをデプロイする場合に、特に有効な技術です。**

**動的コンテンツをどのように処理するか:**

コンテナオーケストレーション環境では、コンテナ内で動作するアプリケーションサーバーが、Webサイトやアプリの要求を受け取り、動的コンテンツを生成します。データベースアクセスや外部 API 呼び出しもコンテナ内で行われます。

- **メリット:**
    - **環境の一貫性:** コンテナ内にアプリケーションとその依存関係を含めることで、どこでも同じ環境を再現可能。開発環境、テスト環境、本番環境を統一することで、環境差異による問題を減らすことができます。 
    - **ポータビリティ:** コンテナはどの環境でも動作するため、クラウド、オンプレミス、ローカルマシンで使用可能。 
    - **スケーラビリティ:** コンテナを簡単にスケールアウトできるため、アプリケーションの負荷に応じて柔軟にリソースを増減できます。 
    - **自己修復機能:** コンテナに障害が発生した場合、自動的に新しいコンテナを起動してサービスを継続できます。 
    - **効率的なリソース利用:** 複数のコンテナを同じサーバー上で実行できるため、リソースを効率的に利用できます。 
- **デメリット:**
    - **学習曲線:** Docker や Kubernetes などのツールの使い方を学ぶ必要がある。 
    - **オーケストレーションの複雑さ:** 複数のコンテナを管理するための設定が複雑になることがある。 

**こんなアプリケーションにおすすめ:**

- **マイクロサービスアーキテクチャを採用しているアプリケーション:** 複数の独立したサービス (コンテナ) を連携させて、大きなアプリケーションを構築する際に有効。 
- **頻繁なアップデートが必要なアプリケーション:** コンテナ単位でアップデートできるため、ダウンタイムを最小限に抑えられます。 
- **スケーラビリティが必要なアプリケーション:** 負荷に応じてコンテナ数を自動で増減できるため、柔軟な対応が可能です。 

**代表的なサービス:**

- **Kubernetes (オープンソース):** 最も広く使われているオープンソースのコンテナオーケストレーションツール。 
- **Docker Swarm:** Docker が提供するコンテナオーケストレーションツール。 
- **Amazon ECS:** AWS のコンテナオーケストレーションサービス。 
- **Azure Kubernetes Service:** Azure の Kubernetes サービス。 

**コンテナオーケストレーションは、コンテナ技術を活用して、大規模で複雑なアプリケーションを効率的に開発・運用する上で非常に強力なツールです。**

## パフォーマンスと信頼性を向上させるための追加サービス

### CDN (Content Delivery Network)

**静的コンテンツを高速配信するグローバルネットワーク**

世界中に分散されたエッジサーバーにコンテンツをキャッシュし、ユーザーに近い場所から配信することで、Webページの表示速度を高速化します。動的コンテンツを扱う場合は、前述のいずれかのサービスと組み合わせて利用することで、さらにパフォーマンスを向上させることができます。

- **メリット:**
    - **低遅延:** ユーザーに最も近いサーバーからコンテンツを提供し、遅延を最小限に抑えます。
    - **高可用性:** 複数のサーバーにコンテンツが分散されているため、一部のサーバーに障害が発生しても、他のサーバーからコンテンツを提供できます。
    - **セキュリティ向上:** DDoS攻撃の緩和、SSL/TLS暗号化、キャッシュ管理などのセキュリティ機能を提供。
    - **サーバー負荷軽減:** オリジンサーバーへの負荷を軽減。
- **デメリット:**
    - **動的コンテンツへの対応:** 主に静的コンテンツの配信に適しており、動的コンテンツの配信には向かない。
    - **コスト:** 大量のデータ転送が必要な場合、コストが増加することがある。
    - **キャッシュの制御:** キャッシュの有効期限や更新方法などを適切に設定する必要があります。

**こんなアプリケーションにおすすめ:**

- **静的コンテンツを多く含むWebサイト:** 画像や動画を多用するウェブサイト、ブログなど。
- **グローバルにユーザーが分散しているアプリケーション:** 世界中のユーザーに対して、高速なアクセスを提供したい場合。
- **Webサイト/アプリのパフォーマンスを向上させたい場合:** ページの読み込み速度を改善することで、ユーザーエクスペリエンスを向上できます。

**代表的なサービス:**

- Cloudflare
- Amazon CloudFront
- Akamai
- Fastly

## 各サーバー選定における重要なポイント

- **アプリケーションの要件:** 必要な機能、パフォーマンス、スケーラビリティ、セキュリティレベルなどを明確にする
- **開発体制:** 開発者のスキルセット、運用体制などを考慮する
- **コスト:** 初期費用、運用費用、各サービスの料金体系を比較検討する
- **セキュリティ:** データの機密性、セキュリティ要件を満たしているか確認する
- **将来性:** サービスの長期的な安定性、将来的な拡張性などを考慮する

## 最後に

記事の内容はもっとわかりやすく修正していく予定です。
今後は私が初めてのデプロイ先でどれを選択したのか、具体的なサービスは何を使用したのかについてもまとめようと思います！