Webアプリケーション作成のための10ステップ　7. デプロイメントとクラウド

# この記事を書いたきっかけ

この記事では、Webアプリケーションエンジニアに必要なスキルを具体的に解説し、その学び方を示します。

Webアプリケーション作成に必要なスキルを10個にまとめ、一つずつ学ぶ目的と手段を整理したいと思います。今回は**デプロイメントとクラウド**について書きます。

### この記事を書いた目的
- webアプリケーションエンジニアになりたい
- そのために、自分に足りないものは何かを知りたい
- すぐに行動に移すために、学ぶ目的と手段を具体化したい
- webアプリケーションエンジニアに必要なスキルを全て把握したい
- 今、自分はなんのために、何を学んでいるのか、見失わないようにしたい


# Webアプリケーション作成のための10ステップ
1. プログラミング言語の習得
1. フロントエンド開発
1. バックエンド開発
1. バージョン管理
1. 開発ツールと環境
1. セキュリティ
1. デプロイメントとクラウド
1. テスト
1. アーキテクチャの知識
1. ソフトスキル
---
こちらの記事が参考になります。

https://qiita.com/gold-kou/items/44860fbda1a34a001fc1

https://qiita.com/tag1216/items/5d06bad7468f731f590e


# 7. デプロイメントとクラウド
# デプロイメントとは何か（What）
デプロイメントとは、**開発したアプリケーションを実際の運用環境に配置し、ユーザーが利用できる状態にするプロセス**です。簡単に言えば、ローカルで開発していたアプリケーションをインターネット上に公開する作業です。デプロイメントには、アプリケーションのビルド、サーバーへの配置、データベースのマイグレーション、設定の変更などが含まれます。

### アプリケーションのビルド
**内容**：ビルドとは、アプリケーションのソースコードをコンパイルして実行可能な形式に変換する作業です。

Webアプリケーションの場合、
- **バックエンドのコンパイル**：プログラミング言語で書かれたソースコードを、機械が理解できるバイナリ形式（実行ファイル）に変換すること（例：Java、C++、C#など）
- **依存関係の解決**：プロジェクトで使用される外部ライブラリやモジュールをダウンロードし、正しいバージョンのものをプロジェクトに含めること
- **ミニファイ**：JavaScriptやCSSのファイルを圧縮してサイズを小さくし、読み込み速度を向上させること

などが含まれます。

### サーバーへの配置（デプロイ）
**内容**：ビルドしたアプリケーションを実際に稼働させるためにサーバーに配置する作業を行います。主にSSHを使ってファイルをサーバーにアップロードしたり、自動化ツールを使ってデプロイする作業が想定されます。

SSH接続（Secure Shell）とは、主にリモートサーバーにログインしてコマンドを実行したり、ファイルを転送したりするために使用されるプロトコルであり、またソフトウェアツールの一つです。ローカルのPCからリモート接続でリモートサーバーに安全に接続できます。


**例**：完成したWebアプリケーションのファイルをSSH接続でAWSのEC2インスタンスにアップロードし、実際のサービスとして提供できる状態にします。
### データベースのマイグレーション
**内容**：データベースのスキーマ（構造）やデータの変更を管理し、必要な更新を行う作業です。新しいテーブルの追加、既存テーブルの変更、データの移行などが含まれます。これらの作業をマイグレーションといいます。


**例**：新しいユーザープロファイルテーブルをデータベースに追加し、古いデータベースから必要なデータを移行する。
### 設定の変更
**内容**：アプリケーションやサーバーの設定を変更する作業です。環境変数の設定、構成ファイルの更新、セキュリティ設定の調整などが含まれます。開発環境と本番環境で異なる設定を適用することが一般的です。

**例**：開発環境ではデバッグモードを有効にし、本番環境ではセキュリティを強化した設定に変更する。

例えば、Djangoプロジェクトでは、
- settings_common.py：共通設定を記述するファイル。開発環境と本番環境の両方で共通して使用する設定
- settings_dev.py：開発環境向けの設定を記述するファイル。デバッグモードを有効にし、開発用のデータベースを使用する設定
- settings_prod.py：本番環境向けの設定を記述するファイル。デバッグモードを無効にし、セキュリティ設定を強化する設定

など、環境ごとに異なる設定ファイルを用意します。


### 主なデプロイメントの手法
- **FTP/SFTP**：ファイルをサーバーに手動でアップロードする方法
- **CI/CDパイプライン**：継続的インテグレーション/継続的デリバリーの自動化されたプロセス
- **コンテナデプロイメント**：Dockerなどのコンテナ技術を使用してアプリケーションをデプロイする方法

下記で詳しく説明します。

# クラウドとは何か（What）
クラウドとは、インターネットを通じて提供されるサーバー、ストレージ、データベース、ネットワーク、ソフトウェアなどのコンピューティングリソースの集合体のことをいいます。クラウドサービスを利用することで、物理的なサーバーを管理する必要がなくなり、柔軟なインフラを利用できます。

# 主なクラウドサービス
- **IaaS（Infrastructure as a Service）**：インフラストラクチャを提供するサービス。
**例**：Amazon Web Services（AWS）、Microsoft Azure、Google Cloud Platform（GCP）。
- **PaaS（Platform as a Service）**：アプリケーション開発のためのプラットフォームを提供するサービス。
**例**：Heroku、Google App Engine。
- **SaaS（Software as a Service）**：ソフトウェアをサービスとして提供するもの。
**例**：Google Workspace、Salesforce。


# なぜデプロイメントとクラウドについて学習する必要があるのか（Why）
### 1. スケーラビリティの向上
クラウドサービスを利用することで、必要に応じてリソースを簡単にスケールアップまたはスケールダウンできます。これは、アクセスが集中する時間帯にも安定したサービス提供を行うのに適しています。

### 2. コスト効率
クラウドサービスは従量課金制であり、使用した分だけ料金を支払うため、初期投資が不要であり、運用コストも抑えられます。

### 3. 自動化と効率化
CI/CDパイプラインを利用することで、デプロイメントプロセスを自動化し、手動での作業を減らし、エラーの発生を防ぎます。

### 4. 信頼性と可用性
クラウドサービスは高い信頼性と可用性を提供します。冗長構成や自動バックアップ、リージョン間のフェイルオーバー機能を利用することで、サービスの継続性を確保できます。

### 5. セキュリティの向上
クラウドのプロバイダーは、高度なセキュリティ対策を講じており、自分で行うよりデータの保護、アクセス制御、コンプライアンスの遵守などが簡単です。

## デプロイメントとクラウドを学習しなかった場合の困難
### スケーラビリティと信頼性の問題
自前のインフラストラクチャでリソースを管理する場合、急なトラフィックの増加に対応するのが難しく、サービスのダウンタイムが発生するリスクが高まります。

### コスト増大の問題
オンプレミスでのインフラ運用には、初期投資、メンテナンスコスト、スペースの確保などが必要となり、コストが増大します。

### 手動デプロイの非効率性
手動でのデプロイメントは時間がかかり、ヒューマンエラーが発生しやすく、開発と運用の効率が低下します。

### セキュリティリスクの問題
適切なセキュリティ対策を講じないと、データ漏洩やサイバー攻撃のリスクが高まります。クラウドサービスの高度なセキュリティ機能を利用しないことで、セキュリティホールが残る可能性があります。

# 具体的にどんなデプロイメント技術やクラウド技術を使用すればいいのか（How）
## CI/CDパイプライン
### CI/CDパイプラインとは何か
CI/CDパイプラインは、コードのビルド、テスト、デプロイメントを自動化するプロセスです。継続的インテグレーション（CI）と継続的デリバリー（CD）を組み合わせたもので、開発サイクルの効率を向上させます。

#### 継続的インテグレーション（CI：Continuous Integration）
**継続的インテグレーション（CI）**　は、何か特定の技術を指すものではなく、**ソフトウェアの変更を常にテストし、自動で本番環境に適用できるような状態にしておく開発手法**のことをいいます。「インテグレーション」には「統合」の意味があります。ソフトウェア開発の場合、「統合」の対象は一連の作業（各種作業やテストなど）を指します。

CIという手法で開発することで、ソフトウェアの動作を「継続的」に確認できるので、より正確により迅速に開発を進めることが可能になります。

1. **コードの統合**：開発者が変更をコードをリポジトリにプッシュします。
1. **自動ビルド**：新しいコードがリポジトリにプッシュされると、CIシステムが自動的にコードをビルド（コンパイルとパッケージ化）します。
1. **自動テスト**：ビルドが成功した後、CIシステムは自動テストを実行します。これにはユニットテストや統合テストなどが含まれます。
1. **フィードバック**：テストが完了すると、開発者にフィードバックが送られます。もしテストが失敗した場合、すぐに問題を修正できます。

#### 継続的デリバリー（CD：Continuous Delivery）
**継続的デリバリー（CD）**　は、**コードが本番環境にデプロイされるまでのプロセスを自動化する開発手法**のことをいいます。「デリバリー」とは何かを届けることを意味しますが、この場合は「配信」や「公開」の意味で使われています。

ユーザーに継続的にアプリケーションを公開・提供すること、つまり本番環境にアプリケーションを載せ、顧客がいつでも新たなアプリケーションを利用できるようにすることを目的としています。

1. **デプロイ準備**：CIプロセスを通過したコードは、デプロイの準備が整っています。
1. **ステージング環境へのデプロイ**：まず、コードはステージング環境にデプロイされ、さらなるテストが行われます。この環境は、本番環境にできるだけ近い環境です。
1. **本番環境へのデプロイ**：すべてのテストが成功した場合、コードは本番環境に自動的にデプロイされます。
1. **モニタリングとフィードバック**：デプロイ後、本番環境での動作をモニタフィードバックがあれば、次のデプロイサイクルに反映します。

#### わかりやすい例
例えば、チームでWebアプリを開発している場合を想定してください。
**CIプロセス**では、開発者が新しい機能を追加したコードをリポジトリにプッシュします。すると、自動ビルドが始まり、コードがコンパイルされ、ユニットテストが実行されます。すべてのテストが成功した場合、開発者は安心して次の作業に進むことができます。

**CDプロセス**では、CIプロセスを通過したコードがステージング環境に自動的にデプロイされ、さらなるテストが行われます。すべてが順調であれば、コードは本番環境にデプロイされ、ユーザーが新機能を利用できるようになります。


### なぜCI/CDパイプラインが必要なのか
CI/CDパイプラインを導入することで、手動作業を減らし、エラーの発生を防ぎ、迅速かつ安全にコードをリリースすることができます。開発者はコードの品質に集中できるため、プロジェクトの進行がスムーズになります。

### 具体的なツールと技術
**Jenkins**：オープンソースの自動化サーバー。パイプラインの構築と管理が可能です。
Wikipedia記事：[Jenkins](https://ja.wikipedia.org/wiki/Jenkins)

**GitHub Actions**：GitHubリポジトリに統合されたCI/CDツール。GitHubリポジトリの操作に応じて自動化ワークフローを設定できます。
GitHub Docs：[GitHub Actions を理解する](https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions)

**GitLab CI/CD**：GitLabに組み込まれたCI/CD機能。リポジトリと連携してパイプラインを構築できます。
GitLab日本語マニュアル：[GitLab CI/CDを始めましょう。](https://gitlab-docs.creationline.com/ee/ci/)

## クラウドサービス
### クラウドサービスとは何か
クラウドサービスは、インターネット経由で提供されるコンピューティングリソースやソフトウェアサービスです。物理的なサーバーを管理する必要がなくなり、柔軟なインフラを利用することができます。

### なぜクラウドサービスが必要なのか
クラウドサービスを利用することで、物理的なインフラ管理の手間を削減し、ビジネスの成長に合わせた柔軟なリソース管理が可能になります。

### 具体的なツールと技術
**Amazon Web Services（AWS）**：IaaS、PaaS、SaaSを提供するクラウドサービス。幅広いサービスと高い信頼性を提供。
Amazon Web Services HP：[AWS とは？](https://aws.amazon.com/jp/what-is-aws/)

**Microsoft Azure（アジュール）**：Microsoftが提供するクラウドプラットフォーム。IaaS、PaaS、SaaSを含む多彩なサービスを提供。
Wikipedia記事：[Microsoft Azure](https://ja.wikipedia.org/wiki/Microsoft_Azure)

**Google Cloud**：Google がクラウド上で提供するサービス群の総称。以前はGoogle Cloud Platform（GCP）と呼ばれていました。


## コンテナとオーケストレーション
### コンテナとは何か（What）
コンテナは、アプリケーションとその依存関係を一つのパッケージにまとめた仮想化技術です。
### なぜコンテナが必要なのか（Why）
コンテナを使用することで、開発環境と本番環境の一貫性を保つことができ、デプロイのプロセスが簡単になります。また、リソースの効率的な利用が可能になり、スケーラビリティが向上します。

### 具体的なツールと技術（How）
**Docker（ドッカー）**：コンテナの作成、管理を行うためのオープンソースプラットフォーム。
[docker docs：Docker 概要](https://matsuand.github.io/docs.docker.jp.onthefly/get-started/overview/)

**Kubernetes（クーベネティス）**：コンテナのデプロイメント、スケーリング、管理を自動化するオープンソースのオーケストレーションツール。
[Kubernetes公式](https://kubernetes.io/ja/)

オーケストレーションツールとは、複数のコンテナを効率的に管理、配置、スケーリング、監視するためのツールです。コンテナを使用することで、アプリケーションを小さな部分に分割して実行することができますが、これらのコンテナを一元管理する目的でオーケストレーションツールを利用します。


# どのように学習すればいいのか（How）
- **書籍**：クラウドやDockerについての書籍が数多く出版されています。
- **動画**：
    - Udemy：UdemyにはCI/CD、クラウドサービス、Docker、Kubernetesに関する多数の講座があります。動画形式で学ぶことで、具体的な操作方法や実践的なスキルを身につけることができます。
    - YouTube：YouTubeにも多くの無料チュートリアルがあります。「Docker 入門」「Kubernetes 入門」「AWS 入門」などで検索すると、多くの学習コンテンツが見つかるはずです。
- **実践**：
実際にWebアプリケーションを作成して、クラウドサービスを利用してデプロイしてみるといいと思います。小規模な個人開発であれば、AWSがおすすめです。

# 実際に勉強したこと（Try）
- **書籍**：
    - 『[Docker&仮想サーバー完全入門](https://www.amazon.co.jp/Docker-%E4%BB%AE%E6%83%B3%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80-Web%E3%82%AF%E3%83%AA%E3%82%A8%E3%82%A4%E3%82%BF%E3%83%BC%EF%BC%86%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E4%BD%9C%E6%A5%AD%E3%81%8C%E3%81%AF%E3%81%8B%E3%81%A9%E3%82%8B%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%AA%E3%83%96%E3%83%AD%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9/dp/4295015318)』を読んでいます。
    - AWS関連の書籍は、いろいろ読みましたが、『[いちばんやさしい新しいAWSの教本](https://www.amazon.co.jp/%EF%BC%88PDF%E7%89%88%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E7%89%B9%E5%85%B8%E4%BB%98%E3%81%8D%EF%BC%89%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E6%96%B0%E3%81%97%E3%81%84AWS%E3%81%AE%E6%95%99%E6%9C%AC-%E4%BA%BA%E6%B0%97%E8%AC%9B%E5%B8%AB%E3%81%8C%E6%95%99%E3%81%88%E3%82%8BDX%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0-%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E6%95%99%E6%9C%AC-%E8%BF%91%E8%97%A4%E6%81%AD%E5%B9%B3/dp/4295016608)』が一番おすすめです。とてもわかりやすいです。何度も読み返しています。
- **動画**：
    - 「[プロの現場から学ぶ、AWSで高可用なWEBアプリケーション構築](https://www.udemy.com/course/awsweb-handson/?couponCode=24T7MT72224)」を視聴しました。実際に手を動かして実践するレッスンがあります。
- **実践**：
    - DjangoでWebアプリを作成したときに、AWSのEC2インスタンスにローカル環境で作成したファイルを手動でデプロイしました（SFTP）。
    - 別のプロジェクトではDockerを使用し、ローカルPCに開発環境を構築しました。
    - Goocle Cloudでプロジェクトを作成し、GoogleMapAPIを利用しました。

CI/CDツールやオーケストレーションツール（Kubernetes）については、まだ勉強していません。

# まとめ
Webアプリを作成するだけでは、みんなに使ってもらうことができません。デプロイメントを行い、クラウド環境などで維持していくことによって、初めて日の目を見ます。初学者にとって、これらの技術はイメージがしにくく、初めは難しく感じるかもしれません。実践を通して、少しずつ学びながらスキルを身につけていきたいと思います。