Azure Container Appsでカンタンマイクロサービス構築

# はじめに
非常に魅力的なプラットフォームであるAzure Container Apps（以降、ACA）についてMS公式のチュートリアルを通して概要を整理していきます。

# ACAとは

- 2022年5月にGAした、**コンテナベースのアプリケーション**を簡単にデプロイ、管理、スケールできるサービス
- フルマネージドk8sベースのアプリケーションプラットフォーム
- k8sが提供する高い可用性、セキュリティ、スケーラビリティの恩恵を受けつつ、**k8sの管理は不要**
- KEDA、Dapr、EnvoyといったCNCFプロジェクトの成果物をマネージドサービスとして提供する
- 内部的には**Azure Kubernetes Service (AKS)** を使用している

※AKSについては以前の記事を参照。

https://qiita.com/maplejava/items/f5e9ce8ba21afeb02d4b

### AKSとの違い
AKS：k8sAPI使いたい、k8sの設定自由度を確保したいならAKSを使うべき。
ACA：k8sAPIは意識しない。k8sの機能は使いたいけどクラスターの管理とかはしたくない人向けの便利なプラットフォーム。

なので、k8sが提供する高い可用性、セキュリティ、スケーラビリティの恩恵を受けたいがk8sの管理が大変、そもそもk8sを勉強するのが難しい、k8s開発スピード早すぎてついていけないという人にACAがおすすめ。

参考

https://learn.microsoft.com/ja-jp/azure/container-apps/compare-options


# 用語

### Azure Container Apps Environment
Azure Container Apps Environment（以降、ACAE）は、ACAのインスタンスをホストするための論理的な境界。
ACAEは、アプリケーションが実行されるネットワーク、セキュリティ、およびリソースの設定を提供する。
ACAE内のアプリケーションは、同じリージョン内で物理的に近い場所に配置され、低遅延の通信を実現する。
内部的には、AKSのAKSクラスターに該当する。
ちなみに、Azure portalから作成する場合、ACAEの画面からACAEのみを新規作成することはできない（2024年7月初時点）。なので、ACAの作成画面にてACAEの「新規作成」を選択することでACAEの設定が可能になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/6158fdb9-481c-d7ec-4c1a-fa16ce7eaa9e.png)


### Revision
ACAの特定のバージョン（断面）のこと。
構成管理のための概念。


# 利用シナリオ


- ウェブアプリケーション、API、バックエンドサービスなど、幅広いアプリケーションに適用可能
- イベントドリブンな処理や、マイクロサービスアーキテクチャを採用したアプリケーションの開発に適している

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/3957fac4-c2fc-b3a0-5766-b22228671d2e.png)

# 価格モデル

- 従量課金モデルとインスタンス専有モデル（ハードウェア単位の課金体系）がある
- インスタンス専有モデルの場合、 ACAEの作成時に以下のような画面にてホストのサイズを選択可能となる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/c3cb7fa8-ebeb-7dcb-9eab-64fd62042a1c.png)

# 多様なユースケースに対応したチュートリアル
### Azure CLIからcontainer upコマンドで簡単デプロイ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/4ab4c26e-8e8d-ecec-bf4e-7eb731ee6291.png)
Azure CLIを使ったチュートリアルは、ただ試すだけなら、Azure portalのCloud Shellから実施するのが環境設定等がほとんど不要なのでおすすめ。


https://learn.microsoft.com/ja-jp/azure/container-apps/get-started?tabs=bash


### Dapr統合されたアプリの簡単デプロイ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/de0bca34-1285-60ee-c2ba-4b72a1f85071.png)


https://learn.microsoft.com/ja-jp/azure/container-apps/microservices-dapr?tabs=bash%2Cazure-cli


### Quarkusアプリの簡単デプロイ


https://learn.microsoft.com/ja-jp/azure/developer/java/ee/deploy-java-quarkus-app?tabs=az-login-terminal-bash

https://learn.microsoft.com/ja-jp/training/modules/deploy-java-quarkus-azure-container-app-postgres/


# ACAにおけるコンテナのライフサイクル

https://learn.microsoft.com/ja-jp/azure/container-apps/application-lifecycle-management

- ACAではコンテナはRevisionを基に管理される
- コンテナにはdeployment、update、deactive、shutdownの4つのフェーズがある

### Deployment
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/b4cbd244-1514-8b6c-5d05-9f3374ac99d2.png)
コンテナアプリがデプロイされると最初のrevisionが自動的に作成される。

### Update
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/068bff1d-4975-60e2-86ea-940f651d2e1c.png)
コンテナアプリがRevision scopeで更新された場合、新しいrevisionが作成される。

古いrevisionを自動的に非アクティブにするモード（単一revisionモード）と使用可能なままにする複数revisionモードを選択できる（画像の例は複数revisionモード）。

### ※Revision Scopeとapplication scope

https://learn.microsoft.com/ja-jp/azure/container-apps/revisions#revision-scope-changes

コンテナアプリに対する変更の内容によって、新規にRevisionが作成されるのか、既存revisionへの変更のみ（新規でRevisionの作成はされない）なのがか決まっており、それぞれRevision Scopeとapplication scopeという。

Revision Scope：containerイメージや設定の変更など
application scope：secretの変更やIngress設定、Daprの設定など

### Deactive
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/64d3b90d-5046-fa0f-8c1f-3ec5d8c688ce.png)
Revisionが不要になったら非アクティブ化できる。

### Shutdown
> シャットダウンが開始されると、コンテナー ホストは [SIGTERM メッセージ](https://wikipedia.org/wiki/Signal_(IPC))をコンテナーに送信します。 コンテナーに実装されているコードでは、このオペレーティング システム レベルのメッセージに応答して終了処理をすることができます。
> 
> アプリケーションが 30 秒以内に`SIGTERM`メッセージに応答しない場合、[SIGKILL](https://wikipedia.org/wiki/Signal_(IPC)) でコンテナーが終了します。
>

# ACAでHelloworldアプリをデプロイする
https://learn.microsoft.com/ja-jp/azure/container-apps/get-started?tabs=bash

こういうチュートリアルをやるときまずどんなアプリケーションを載せるんだろうというのが最初に気になるので、見ていくと以下のコマンドに書いてあった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/5cfc96a2-dfd1-940c-ae58-1622569f914b.png)


> —image [mcr.microsoft.com/azuredocs/containerapps-helloworld:latest](http://mcr.microsoft.com/azuredocs/containerapps-helloworld:latest) \
> 
デフォルトではDockerHubからプルされるが、いまはMCR（MS公式のコンテナーレジストリ）から持ってくる設定であった。
Microsoft Artifact Registry（MCR）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/70710f64-4fd6-8a6d-15d7-776cfbaa5f24.png)


### デプロイ準備
HelloworldアプリをAzure potralのcloudshellで作ってみる。

CLI 用の Azure Container Apps 拡張機能をインストールまたは更新

```
az extension add --name containerapp --upgrade
```

名前空間の登録

```
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
```

Microsoft.App：ACAの名前空間

Microsoft.OperationalInsights：Log Analyticsワークスペースの名前空間

### ContainerAppsのデプロイ

もうデプロイできちゃうの！？
```
az containerapp up \
  --name az-foo-container-app01 \
  --resource-group AZ-foo \
  --location japaneast \
  --environment 'AZ-foo-container-app' \
  --image mcr.microsoft.com/azuredocs/containerapps-helloworld:latest \
  --target-port 80 \
  --ingress external \
  --query properties.configuration.ingress.fqdn
```

オプションの意味（ChatGPT）

containerappsのnameオプションでは大文字指定してはいけない。

>1. **`-environment 'my-container-apps'`**: Azure Container Appsの環境（Environment）を指定します。これはアプリケーションを実行するためのコンテナ化された環境を示します。**`my-container-apps`**は独自の環境名です。
>2. **`-target-port 80`**: コンテナがリッスンするポート番号を指定します。この場合、ポート80が指定されています。
>3. **`-ingress external`**: Ingress（トラフィックの入口）の設定を指定します。**`external`**を指定すると、外部からのトラフィックを受け入れるように設定されます。
>4. **`-query properties.configuration.ingress.fqdn`**: コマンドの出力結果から特定の情報をクエリして取得するためのオプションです。この場合、コンテナアプリのIngressの完全修飾ドメイン名（FQDN）を取得し、出力として返します。

### 実行結果

MSLearnに書いてある通りの順番で作成されている。あれば使って、なければ作るという仕様のようだ。

> 
> 
> - リソース グループの作成
> - Container Apps 環境を作成する
> - Log Analytics ワークスペースの作成
> - パブリック コンテナー イメージを使用してコンテナー アプリを作成してデプロイする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/4ee46cd5-b4f5-ea96-92e2-e52afed33cae.png)

environment, Log Analytics workspace, container appsが作成されている。
ACAE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/e34c5c5b-a5cc-7e51-8a75-3bd738d0f618.png)
Log Analytics
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/e716adc5-5527-66b3-7e9c-a3475b24041c.png)
ACA
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/78427b21-1319-31db-41da-f1c94a7625b5.png)


アプリが動いていることが確認できた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/6b2d81f0-c0df-1e82-f959-f3881f561932.png)

# おわりに
今回は非常に便利なACAについてまとめてみました。
カンタンにマイクロサービスの基盤を構築できるので、皆さんも是非使ってみてください！