Azure Container Apps 触ってみた～環境準備編

# はじめに
Azure で一番簡単にコンテナオーケストレーションを実現する Azure Container Apps について、環境構築から、挙動確認、もろもろの測定を記事として残すためのシリーズです

この記事は環境構築の内容なので、ご興味のあるものがあればそちらのリンクをご確認ください

- **事前環境準備 (※本記事の内容です)**
- [レイテンシを測ってみた](https://qiita.com/shyamagu/items/5fb6ecb0089883762e32)
- ARM テンプレート化してみる(予定)
- スケールの挙動を見てみる(予定)

# Azure Container Apps って何さ？
乱暴にいうと、マネージドなAKS、です
- k8s そのものや、下回りの仮想マシンなどの管理は不要
- KEDA によるスケーリング（0スケール可能）
- Envoy によるトラフィック制御
- Dapr によるサービス連携など

あたりが大きな特徴ですね。AKS に比べると細かい部分の設定調整などはできませんが、ざっくり上記の代表的な動きができる便利サービスです。
あとはARMテンプレート/bicep で周辺系のサービス( DB など)含めて全部記載できるものメリットになるかなと。YAML 不要！

# 触ってみるために作る環境について
まずは下図のような Azure Container Apps 環境を作成していきます
今回は [choi](https://github.com/shyamagu/choi) という通信をリレーするアプリケーションをコンテナとして 4つ使いたいと思います
choi はパブリックなコンテナとして、 **shyamagu/choi:http** を指定すれば構築できるのでこういう環境構築ではとても便利なソフトウェアです

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/970aec2f-e6db-4c58-3795-2ba6744e441d.png" width=70%>

# Azure ポータル画面でポチポチで作る
せっかく ARM テンプレートとか使えるのに～という状況ですが、まずは画面 UI ベースでポチポチ作りたいと思います。
※2022/9/9 時点での画面ベースです。もしかすると見られたタイミング次第ではUIが変わっているかもしれません。

とりえあず最初に以下の赤枠の構成を作成してきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/888e8309-6b09-6332-7d2b-901ebeaa1381.png" width=70%>


最初は**コンテナーアプリ**を探してポチっ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/2a25f2ec-1040-b615-cb17-0aa48d106b61.png" width=50%>

コンテナーアプリの作成ボタンから、以下の情報をいれて、Container App #1 と、Container Apps Environment #1 あとは Log Analytics Workspace を作っていきます

#### プロジェクトの詳細
- サブスクリプション:　**お使いのサブスクリプション**
- リソースグループ:　"新規作成"から、**rg-aca-test-20220909** とか適当に
- コンテナーアプリ名:　**container-app-1**

#### Container Apps 環境
- 地域:　**Japan East** (どこでもいいですけど）
- Container Apps 環境:　"新規作成"をポチっとして Container Apps 環境の作成へ

#### Conatiner Apps 環境の作成
- 環境名:　**container-apps-environment-1**
- ゾーン冗長:　**無効**のままでOK

「監視」のタブを選択して、
- Log Analytics ワークスペース:　ここも"新規作成"をポチっとして
- 名前:　**workspace-aca-test-20220909**とか適当に

「ネットワーク」はそのままでいいので、画面左下の**Create**を実行すると「コンテナーアプリの作成」画面に戻ります

#### コンテナーアプリの作成
次に「アプリ設定」のタブを選択、
- クイックスタートイメージを使用する:　選択を外す

#### コンテナーの詳細
- 名前:　**app1**
- イメージのソース:　**Docker Hub またはその他のレジストリ** を選択
- イメージの種類:　**パグリック**のまま
- レジストリログインサーバー:　**docker.io**のまま
- イメージとタグ:　**shyamagu/choi:http**を指定
(コマンドのオーバーライドとかCPUメモリとかはそのまま)
- HTTPイングレス:　無効をクリックして、**有効**にする
- イングレストラフィック:　**どこからでもトラフィックを受け入れます**を選択
- ターゲットポート:　**80**を指定

全部できたら左下の **確認と作成** を実行、下図のような構成ができたら、これまた左下の **作成** ボタンを実行
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/b0b58db7-3299-e1c6-8371-06c125691e7f.png" width=50%>

しばし待つ・・・・

デプロイが完了したらリソースに移動して、認証と、Dapr の設定を変えていきます。

#### AAD 認証をつけて、不特定多数のアクセスを制御する（※オプション）

左パネルの**認証**から、**IDプロバイダーを追加**を選択

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/343713ed-b548-eab8-9eca-091667f44ce0.png" width=70%>

- IDプロバイダー：**Microsofot**を選択して、

他は特に触らず、画面左下の **追加** ボタンを実行
そうすると、現在Azureポータルにログインしているアカウントでアクセス制限をかけることができます。便利！

### Dapr を有効にする

同じく左パネルの **Dapr** から、
- Dapr:　**有効**
- アプリポート:　**80** (これはコンテナのポート、choiはデフォルト80なので80)
- アプリID:　**dapr-app1**
- プロトコル:　**http**
を選んで、左下の **保存** を実行すると、続行しますか？と聞かれるので、続行を。

これで赤枠部分のサービスがひとまずできます。

というわけで動作確認を。左パネルの **概要** から、アプリケーションURLを選ぶと（下図）…
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/88a6823d-3416-456a-877b-e7bb9b325680.png" width=70%>

AAD の認証を入れている場合は、アクセス許可が要求されるので、**承諾** を選択してください

choi の起動画面になれば(下図)、ここまでは完成です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/56df2753-17d9-f386-263b-49ecb4620eb4.png" width=50%>

## Container App #2の作成
次に下図の赤枠部分、Container App #2 を作成します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/85b5c0c7-5632-505e-2b96-7aa14895ff4f.png" width=70%>

まずはコンテナを追加するために、コンテナアプリ環境を選びます。
**概要** の **Container Apps 環境のリンク** をクリック(下図)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/1bd30128-4cc7-8946-c1f1-92342b691272.png" width=70%>

コンテナ環境のページに飛ぶので、**アプリ** から、**+作成** をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/86581f84-27dc-4a17-bcce-64508606fe77.png" width=70%>

そうすると Container App #1 の時と同じくコンテナーアプリの作成画面になります
先ほどとほぼ同様に設定していきます。<font color="Red"> #1 との変更部分は赤で表記</font>


- サブスクリプション:　**お使いのサブスクリプション**
- リソースグループ：　**rg-aca-test-20220909** (そのまま、さっき作ったのが入っていると思います)
- コンテナーアプリ名:　<font color="Red">**container-app-2**</font>
- 地域:　**Japan East** (そのまま）
- Container Apps 環境:　**container-apps-environment-1** (そのまま)

**次へ：アプリ設定＞** を選んで、もしくは**アプリ設定**タグを選択して、Container App #1 の時と同じように、

- クイックスタートイメージを使用する:　選択を外す
- 名前:　<font color="Red">**app2**</font>
- イメージのソース:　**Docker Hub またはその他のレジストリ** を選択
- イメージの種類:　**パグリック**のまま
- レジストリログインサーバー:　**docker.io**のまま
- イメージとタグ:　**shyamagu/choi:http**を指定
(コマンドのオーバーライドとかCPUメモリとかはそのまま)
- HTTPイングレス:　無効をクリックして、**有効**にする
- イングレストラフィック:　<font color="Red">**Container Apps 環境に限定**を選択</font>
- ターゲットポート:　<font color="Red">**3000**を指定</font>

できたら画面左下の **確認と作成** から、検証が終わればそのまま **作成** を実行
デプロイが完了したら **リソースに移動** を選択して、Dapr と アプリのポートの設定を変えます

### Dapr を有効にする

左パネルの **Dapr** から、
- Dapr:　**有効**
- アプリポート:　<font color="Red">**3000** (container app #2は3000ポートで起動させるため（※後述）)</font>
- アプリID:　<font color="Red">**dapr-app2**</font>
- プロトコル:　**http**
を選んで、左下の **保存** を実行すると、続行しますか？と聞かれるので、続行を。

### コンテナの環境変数を変えて起動ポートを変える

左パネルの **コンテナー** から、編集とデプロイを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/e4a1ceb2-2f9a-1b6b-10c7-a1baf88bd1ae.png" width=50%>

app2 のリンクを選んで
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/80ea540c-3aca-e25f-e635-434f9717f001.png" width=50%>

コンテナの編集パネルの下部にある、**環境変数** のところの **追加** を選択、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/e900e305-b0a3-4969-2ff8-eb36bdd8addf.png" width=70%>


- PORT、手動エントリ、3000
を指定して**保存**したら、**作成**を実行

これで container-app-2 はポート3000で choi が起動します。
※ただしこのcontainer-app-2 は、同一のコンテナアプリ環境からしかアクセスできません。動作検証は一旦後回しにして、

## Container App #3の作成
最後に下図の赤枠部分、Container App #3 を作成します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/db720d77-ac55-3138-5347-b77788558fea.png" width=70%>

先ほどと同様に、まずはコンテナアプリを追加するために、コンテナアプリ環境を選びます。
**概要** の **Container Apps 環境のリンク** をクリック(下図)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/7fdad5a5-d054-0a32-253c-a0c8e22e8c22.png" width=50%>

先ほど同様に、左パネル **アプリ** から、**+作成** を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/0f2e5ed4-2a6e-1708-b58b-aa6f022453d5.png" width=50%>

そうすると Container App #1 や #2 の時と同じくコンテナーアプリの作成画面になります
先ほどとほぼ同様に設定していきます。<font color="Red"> #1 との変更部分は赤で表記</font>


- サブスクリプション:　**お使いのサブスクリプション**
- リソースグループ：　**rg-aca-test-20220909** (そのまま、さっき作ったのが入っていると思います)
- コンテナーアプリ名:　<font color="Red">**container-app-3**</font>
- 地域:　**Japan East** (そのまま）
- Container Apps 環境:　**container-apps-environment-1** (そのまま)

**次へ：アプリ設定＞** を選んで、もしくは**アプリ設定**タグを選択して、Container App #1 の時と同じように、

- クイックスタートイメージを使用する:　選択を外す
- 名前:　<font color="Red">**app3**</font>
- イメージのソース:　**Docker Hub またはその他のレジストリ** を選択
- イメージの種類:　**パグリック**のまま
- レジストリログインサーバー:　**docker.io**のまま
- イメージとタグ:　**shyamagu/choi:http**を指定
(コマンドのオーバーライドとかCPUメモリとかはそのまま)
- HTTPイングレス:　<font color="Red">**無効**</font>

できたら画面左下の **確認と作成** から、検証が終わればそのまま **作成** を実行
デプロイが完了したら **リソースに移動** を選択して、コンテナの追加、アプリのポートの設定を変えて、Daprを有効化します

### アプリのポートの設定を変える

左パネルの **コンテナー** から、編集とデプロイを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/e4a1ceb2-2f9a-1b6b-10c7-a1baf88bd1ae.png" width=50%>

app3 のリンクを選んで (下図ではapp2ですが、app3と読み変えてください)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/80ea540c-3aca-e25f-e635-434f9717f001.png" width=50%>

先ほどと同じく、右パネルの下部にある環境変数の **+追加** で、今度は
- PORT、手動エントリ、**5000**
を指定して、**保存** & **作成** を実行
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/1d704a6e-bd8d-1376-1e6f-26a4849e668d.png" width=50%>

これで App3 の設定は完了です。次に、

### コンテナを追加する（App4 を追加する)

同じく、左パネルの **コンテナー** から、編集とデプロイを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/e4a1ceb2-2f9a-1b6b-10c7-a1baf88bd1ae.png" width=50%>


**コンテナーイメージ** の **+追加** を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/954b7761-b150-9694-bb70-c7ca121afecf.png" width=50%>

右パネルに ** コンテナーの追加** が表示されるので、以下の設定をもりもりと
- 名前:　**app4**
- イメージのソース:　**Docker Hub またはその他のレジストリ** を選択
- イメージとタグ:　**shyamagu/choi:http** を指定
- 環境変数:
    - 名前:　**PORT**
    - ソース:　**手動エントリ**
    - 値:　**4000**

上記指定したら **追加** & **作成** を実行


ここまでできたらあと少しです。最後に、
### Dapr を有効にする

左パネルの **Dapr** から、
- Dapr:　**有効**
- アプリポート:　<font color="Red">**5000** (container app #3は5000ポートで起動させるため)</font>
- アプリID:　<font color="Red">**dapr-app3**</font>
- プロトコル:　**http**
を選んで、左下の **保存** を実行すると、続行しますか？と聞かれるので、続行を。

やっと終わりました。これでひとまずの準備は完了です。
ARMテンプレート使えばここまでの内容が1発でできるので、やはりARMテンプレート使うのが正義ですね^^;

# やっとできた。でわ動作確認

ここまでの内容で、以下の構成が完成しているはずです。choiを使って、赤矢印の動作を確認してみたいと思います
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/22a46bf6-7465-352d-8071-07d3c79d1424.png" width=70%>

URLを確認するために、コンテナアプリ環境を選びます。
**概要** の **Container Apps 環境のリンク** をクリック(下図)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/7fdad5a5-d054-0a32-253c-a0c8e22e8c22.png" width=50%>

container-app-1 と container-app-2 のアクセスURLをそれぞれ表示してメモっておきます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/ec309232-46e3-a99c-09f7-a429275af8b4.png" width=50%>

container-app-**1** のURLをたたいて、choi の画面を表示させます
choiの設定画面で、以下のパラメータを設定します
- SERVER1 の choi uri :　**container-app-1 のURL**(ブラウザで表示されているURLと同じもの)
- SERVER2 の choi uri :　**container-app-2 のURL**
- (+ADD)して、SERVER3 のuriには、**http://localhost:3500/v1.0/invoke/dapr-app3/method/test**
- (+ADD)して、SERVER4 のuriには、**http://localhost:4000/**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/fae7f7f5-6dfc-5a01-ea40-e6a1f59e5e6f.png" width=50%>

他は特にいじらずに、**Start Request**を実行すると・・・やったー疎通確認完了です！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/b83b30a9-117c-01b3-a9ad-6d23e95d52c5.png" width=70%>

しっかし18秒かかってますね…これは、色々やっている(記事書いている)うちに全部のコンテナアプリが0スケールしてしまっているためです。
すぐにもう一回 **Start Request**すると今度は早いですねー
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/75e1e1fa-41dc-58f3-80a1-31c89173f56d.png" width=70%>

# おわりに
今回は Azure Container Apps を触ってみるための事前準備として、とりあえず画面ポータル上でぽちぽちと構成を組みました。しかし辛い…やはりテンプレートは正義ですね。