Azure App Service におけるコードとコンテナのデプロイ方法の比較

# Azure App Serviceにおけるデプロイ方式の比較：コード vs コンテナ

Azure App Serviceは，Webアプリケーション，REST API，モバイルバックエンドをホストするためのフルマネージドPaaSサービスである．このサービスでは主に「コードのデプロイ」と「コンテナのデプロイ」という2つの方法でアプリケーションをデプロイできる．この記事では，それぞれの方法の具体的な手順と特徴を解説し，ユースケースに応じた選択指針を提供する．

<a id="コードによるデプロイ"></a>
## 1. コードによるデプロイ

コードをデプロイする方法では，アプリケーションのソースコードをAzureに直接デプロイする．Azureが提供するランタイム環境上でコードが実行される．

### VS Codeを使用したコードデプロイの手順

#### 1. 前提条件
- VS Codeがインストールされていること
- Azure App Service拡張機能がインストールされていること
- Azureアカウント

#### 2. VS Codeへの拡張機能のインストール

VS Codeの拡張機能タブから「Azure App Service」を検索してインストールする．

#### 3. Azureアカウントへのサインイン

VS Codeの左側のActivityBarから「Azure」アイコンをクリックし，「Sign in to Azure...」をクリックしてAzureアカウントにサインインする．

#### 4. プロジェクトの用意

デプロイするプロジェクトをVS Codeで開く．ここではシンプルなNode.jsアプリケーションを例に進める．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880471/b29b6b9c-8aff-4081-828b-3b3536a0c3c7.png)


#### 5. App Serviceへのデプロイ

1. Azureアイコンをクリックし，「App Service」セクションを展開する
2. 「+」ボタンをクリックして新しいウェブアプリを作成するか，既存のものを選択する
3. 新規作成の場合は以下の情報を入力する：
   - アプリケーション名（グローバルで一意である必要がある）
   - ランタイムスタック（Node.js，Python，.NETなど）
   - 価格プラン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880471/a988b5ec-c148-4307-bcda-02592f376071.png)

4. リソースグループを選択または新規作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880471/d751293b-59dd-4165-bfa4-d6f84bf7aeb2.png)


5. App Serviceプランを選択または新規作成する


6. デプロイが完了するまで待つ

![デプロイ進行中](ここにデプロイ進行中画面のキャプチャを挿入)

#### 6. デプロイ完了と確認

デプロイが完了すると，VS Codeに通知が表示される．「Browse Website」をクリックしてブラウザでアプリケーションを確認できる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880471/442b4d6f-5d65-40ab-98a8-528e2b569d4e.png)


<a id="コンテナによるデプロイ"></a>
## 2. コンテナによるデプロイ

コンテナを使用したデプロイでは，Dockerコンテナを作成し，そのイメージをAzure App Serviceにデプロイする．[Credlyのサイトに登録されている資格に関してデータ分析を行うサービスを作ってみた話](https://qiita.com/mshdtksk/items/1fbae53f1ba241bdce7b#azure%E3%81%A7%E3%81%AE%E5%B1%95%E9%96%8B) と同様の手順である．

### VS Codeを使用したコンテナデプロイの手順

#### 1. 前提条件
- VS Codeがインストールされていること
- Docker拡張機能とAzure App Service拡張機能がインストールされていること
- Docker Desktopがインストールされ，実行されていること
- Azureアカウント

#### 2. VS Codeへの拡張機能のインストール

VS Codeの拡張機能タブから「Docker」と「Azure App Service」を検索してインストールする．

#### 3. Dockerfileの作成

プロジェクトルートに`Dockerfile`を作成する．VS Codeは自動的にファイルタイプを認識し，構文ハイライトを提供する．

シンプルなNode.jsアプリケーションの例：

```dockerfile
FROM node:14

WORKDIR /usr/src/app

# アプリの依存関係をインストール
COPY package*.json ./
RUN npm install

# アプリのソースをコピー
COPY . .

# ポート設定
EXPOSE 8080

# アプリ起動コマンド
CMD ["node", "server.js"]
```

#### 4. ローカルでコンテナをビルド＆テスト

VS Codeのターミナルから以下のコマンドを実行：

```bash
docker build -t myapp:latest .
docker run -p 8080:8080 myapp:latest
```

ブラウザからlocalhost:8080にアクセスして動作を確認する．

#### 5. コンテナレジストリにイメージをプッシュ

Azure Container Registryまたは他のコンテナレジストリ（Docker Hub）にイメージをプッシュする．

Azure Container Registryを使用する場合：

1. VS CodeのAzureタブからコンテナレジストリを作成または選択する

2. イメージにタグをつけてプッシュする

```bash
az acr login --name myregistry
docker tag myapp:latest myregistry.azurecr.io/myapp:latest
docker push myregistry.azurecr.io/myapp:latest
```

#### 6. App Serviceのデプロイ

1. VS CodeのAzureタブでApp Serviceを右クリックし「Create New Web App...」を選択する
2. 「Linux」を選択する
3. 「既存のDockerイメージを使用する」を選択する
4. イメージソースを選択する（Azure Container RegistryまたはDocker Hub）
5. 使用するイメージとタグを選択する
6. アプリの名前を入力する
7. リソースグループとApp Serviceプランを選択する
8. デプロイが完了するまで待つ

#### 7. デプロイ完了と確認

デプロイが完了すると通知が表示される．「Browse Website」をクリックしてブラウザでアプリケーションを確認する．

### コンテナを利用する実践例

コンテナを利用することで，標準的なApp Service環境では難しい特殊な依存関係を持つアプリケーションも実行可能になる．その一例として，Webスクレイピングのシナリオが挙げられる．

例えば，ChromeDriverを使用したスクレイピングアプリケーションをコンテナ化する場合，必要なライブラリやドライバーをすべてDockerfileに記述してイメージ化できる．このアプローチにより，ブラウザの自動操作やヘッドレスブラウジングが必要なアプリケーションもAzure App Serviceで容易に運用することが可能となる．

<a id="両方式の比較"></a>
## 3. 両方式の比較

### コードデプロイの利点
- **シンプルさ**: コンテナ化の知識が不要で，直接コードをデプロイできる
- **マネージド環境**: Azureがランタイム環境を管理してくれる
- **自動スケーリング**: Azureの自動スケール機能をすぐに活用できる
- **簡単なCI/CD統合**: GitHub ActionやAzure DevOpsとの連携が容易

### コードデプロイの欠点
- **環境の制約**: 利用可能なランタイムとバージョンが限定される
- **カスタマイズ性の制限**: システムの低レベル設定をカスタマイズできない場合がある
- **依存関係の管理**: 複雑な依存関係がある場合は構成が難しい場合もある

### コンテナデプロイの利点
- **一貫性**: 開発環境と本番環境の一貫性が保証される
- **柔軟性**: OSレベルの依存関係も含めて完全に制御可能
- **ポータビリティ**: Kubernetes，ACI，他のクラウドなど他の環境にも移行しやすい
- **カスタマイズ**: 特殊なランタイムや構成が必要な場合に対応可能
- **特殊依存関係の管理**: ChromeDriverなど特殊なバイナリを含む環境を構築できる

### コンテナデプロイの欠点
- **複雑さ**: Docker，コンテナの知識が必要
- **イメージ管理**: コンテナイメージの作成，保存，バージョン管理が必要
- **オーバーヘッド**: コンテナレイヤーによる若干のパフォーマンスオーバーヘッド

## まとめ

### コードデプロイが適しているケース
- 標準的な言語やフレームワークを使用した単純なアプリ
- コンテナに関する知識がないチーム
- 素早いプロトタイピングや開発サイクルが必要な場合
- Azure固有の機能に密接に統合したい場合

### コンテナデプロイが適しているケース
- 複雑な依存関係を持つアプリケーション
- 特殊なソフトウェアや設定が必要なケース
- マルチクラウド戦略を採用している組織
- 開発と本番の環境を完全に一致させる必要がある場合
- マイクロサービスアーキテクチャ採用時
- スクレイピングなど，標準環境では難しい処理を行う場合

どちらのアプローチも Azure App Service でサポートされており，アプリケーションの要件，チームのスキルセット，将来の拡張計画に基づいて選択するとよい．また，ハイブリッドアプローチも可能である．例えば，一部のコンポーネントはコードとしてデプロイし，複雑な依存関係を持つコンポーネントはコンテナとしてデプロイすることも検討できる．

Azure App Service の柔軟性を活かして，最適なデプロイ戦略を選択すべきである．