JavaのサンプルアプリケーションをACI(Azure Container Instances)にデプロイしてみる

駆け出しアーキテクトのやまぱんです。

今回公開されているJavaのサンプルアプリケーションを使って、Azure Container Instances(ACI)にデプロイしてみたいと思います。
とりあえずやってみよう Azure Container Instances！

:::note info
想定ターゲット：ACI(Azure Container Instances)とかACR(Azure Container Registry)をとりあえず試しに使ってみたい人。
:::

## Azure Container Instances とは
・Azure Container Instances とは
https://learn.microsoft.com/ja-jp/azure/container-instances/container-instances-overview

>Azure Container Instances（ACI）は、マイクロソフトが提供する、コンテナを簡単にデプロイし、実行するためのコンテナ実行サービスです。ACIを利用することで、DockerやKubernetesなどのコンテナオーケストレーションツールを使わずに、単一のコマンドでコンテナを実行することができます。
ACIは、コンテナのスケーリングや高可用性の実現、負荷分散、自動復旧などの機能を提供しています。また、ACIは、コンテナの実行に必要なリソースを自動的に割り当てるため、開発者はインフラストラクチャの詳細について心配することなく、コンテナアプリケーションを簡単に開発およびデプロイすることができます。
ACIは、Azureの仮想マシン、ストレージ、ネットワークサービスと同じように、AzureポータルやAzure CLIなどのAzure管理ツールを使って管理することができます。また、ACIはAzure Kubernetes Service（AKS）などのコンテナオーケストレーションツールと組み合わせて使うこともできます。
by Chat Gpt

## Azure Container Registry とは
・Azure Container Registry とは
https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-intro

Azure Container Registry（ACR）は、マイクロソフトが提供する、コンテナイメージの管理・保存・配信を行うためのクラウドサービスです。ACRは、DockerイメージやOCI（Open Container Initiative）イメージを保存することができ、Azure上でコンテナイメージのビルド、デプロイ、実行を行うことができます。
ACRは、プライベートリポジトリとして利用することができます。つまり、コンテナイメージを外部に公開することなく、自社内部や限定的なユーザーのみに配信することができます。また、ACRは、高速かつセキュアなコンテナイメージの配信を行うために、Azure CDN（Content Delivery Network）を利用することができます。
ACRは、AzureポータルやAzure CLI、Azure PowerShellなどのAzure管理ツールを使って管理することができます。また、ACRはAzure Kubernetes Service（AKS）やAzure Container Instances（ACI）などのAzureコンテナサービスと組み合わせて使うことができ、コンテナイメージのビルド、デプロイ、実行をスムーズに行うことができます。
by Chat Gpt

## やること
公開されている下記のレポジトリのサンプルアプリケーションを ACI にデプロイする。
+ Azure-Samples/ApplicationInsights-Java-Samples
https://github.com/Azure-Samples/ApplicationInsights-Java-Samples

## 前提環境
今回は Windows 環境で vscode / PowerShell を利用して行います。

### Azure CLI が導入済
・https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli
下記のような ```Az ~~``` なコマンドは Azure CLI コマンドです。
``` Azure CLI: Azure CLI 
Az login 
```
### githubのアカウント作成
https://github.com/
*不要かも、既にインストール済みの環境で実施しました。

### Docker Desktop for Windows がインストール済
・https://www.docker.com/products/docker-desktop/https://www.docker.com/products/docker-desktop/
*既にインストール済みの環境で実施しました。

### gitのインストールが終わっていること
https://git-scm.com/download/win
*不要かも、既にインストール済みの環境で実施しました。

### vscodeをインストールしていること
https://code.visualstudio.com/
ついでに日本語化しておきましょう。
Visual Studio Codeは、デフォルトでは「英語表記」となっています。
>1.Visual Studio Codeを開く
2.メニューバーから、View > Command Paletteの順にクリック
3.Configure Display Language > Install additional languagesの順にクリック
4.Japanese Language Pack for Visual Studio Codeをインストール
5.Visual Studio Codeを再起動

## 事前準備 サンプルアプリケーションをローカルでビルドして jar ファイルを作る

### Java JDK のインストール
https://www.oracle.com/java/technologies/downloads/#jdk19-windows
上記URLより、windows版の x64 Installer をダウンロードして実行して進めます。

### システム環境変数の追加
システム環境変数 JAVA＿HOME を追加します。
値は私の環境で前の手順ですすめた場合は **"C:\Program Files\Java\jdk-19"** でした。
一応確認してフォルダができているか確認してください。
![2023-02-22_10h53_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/aed7d06a-4940-1724-b42c-48aa081984c0.png)

上記のように設定します。

+ 確認
上記追加後 コマンドプロンプトで確認します。
設定中から開いている場合は再度開きなおしてください。(開きなおさないと反映されません)
コマンドプロンプトは "Windows + R" を押してでてくる画面で "cmd" と打つことで表示されます。

```cmd
echo %JAVA_HOME%
```
![](https://yamapan.tokyo/wp-content/uploads/2023/02/2023-02-22_02h13_25.png)

### vscode で git レポジトリをクローンする
#### vscode を 開きます
#### クローンします
"表示" → "コマンドパレット" → "Gitクローン"　を選択し、今回クローンするレポジトリ(XXX.git)を入力する。
今回クローンするレポジトリは https://github.com/Azure-Samples/ApplicationInsights-Java-Samples なのでhttps://github.com/Azure-Samples/ApplicationInsights-Java-Samples.git を入力し"Enter"する。

![](https://yamapan.tokyo/wp-content/uploads/2023/02/2023-02-22_02h30_26-1.png)

すると、クローン先のフォルダの選択画面がでるので任意のフォルダを選択。
今回は ```C:\git_temp\test``` にクローンします。
そしてそのまま vscodeで開く。
![](https://yamapan.tokyo/wp-content/uploads/2023/02/2023-02-22_02h33_58.png)
念のためフォルダも確認。ちゃんとクローンされていることが分かる。
![](https://yamapan.tokyo/wp-content/uploads/2023/02/2023-02-22_02h34_49.png)

### Java をビルドする。
vscode の "ターミナル"を選択し、ターミナルを表示させ現在の位置がクローンしたフォルダになっていることを確認する。基本的にはそのままクローンして開いてターミナルを表示させた場合はクローンしたフォルダになっている。![](https://yamapan.tokyo/wp-content/uploads/2023/02/2023-02-22_02h37_14-1024x662.png)

#### 下記のコマンドを打つ(ビルドコマンド)
```
./mvnw package
```
ビルドが始まる
![](https://yamapan.tokyo/wp-content/uploads/2023/02/2023-02-22_02h38_23.png)
ビルドが終わる **"BUILD SUCCESS"**
![](https://yamapan.tokyo/wp-content/uploads/2023/02/2023-02-22_02h39_18.png)

#### jar ができていることを確認する
今回の場合 ```C:\git_temp\test\ApplicationInsights-Java-Samples\maven\target``` 配下に　**app.jar** ファイルができています。

![](https://yamapan.tokyo/wp-content/uploads/2023/02/2023-02-22_02h41_25.png)

### 実行してみる
先ほど jar ファイルができた```"C:\git_temp\test\ApplicationInsights-Java-Samples\maven\target"```に移動して、vscodeのコンソール画面 / PowerShellで下記コマンドを打って jar ファイルを実行します。

+ 移動コマンド
```powershell:powershell
cd C:\git_temp\test\ApplicationInsights-Java-Samples\maven\target
```

+ 実行コマンド
```powershell:powershell
java -jar .\app.jar
```

#### 実行が始まる
![](https://yamapan.tokyo/wp-content/uploads/2023/02/2023-02-22_02h49_03.png)

#### 確認してみる
今回のサンプルはポート8080でアクセスするサンプルアプリケーションなのでブラウザで **http://localhost:8080/** にアクセスしてみます。
![](https://yamapan.tokyo/wp-content/uploads/2023/02/2023-02-22_02h52_00.png)
このように表示されればOKです。

#### 消す
````powershell:powershell
Ctrl +C
````
vscodeのコンソール画面 / PowerShell 上で上記コマンドを押すことで終了します。

**http://localhost:8080/** にもアクセスできなくなるはずです。

## 本題です、次に Azure (ACI)にデプロイします。
### ACR(Azure Container Registry) の作成　
#### Azure Portal から ACR の作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/f2210e7a-fbb3-19c0-19da-469f3fad6d51.png)
今回は **konohaJavaACR(.azure.io)** で作成しました。
### ACR 上でビルド
#### Azure にログインする
```
Az login --tenant XXXXX
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/557bf41b-5e75-f68b-4e36-29cad7466520.png)

XXXX は 任意のAADテナントを指定する。(省略可能)
・https://learn.microsoft.com/ja-jp/cli/azure/authenticate-azure-cli#sign-in-with-a-different-tenant

ブラウザで認証画面が開くのでログインする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/a139539b-a619-53ba-c2a7-59dbcc485bf9.png)

#### ACR 上でビルド 
クローンしたレポジトリに移動し下記コマンドを実行。

+ 先ほど作成した Azure Container Registry 名を変数として定義
```PowerShell: Azure CLI (PowerShell)
$ACR_NAME="konohaJavaACR"
```
+ ビルド
```PowerShell: Azure CLI (PowerShell)
az acr build --registry $ACR_NAME --image javasample -f docker/Dockerfile ./maven
```
・(参考)チュートリアル:Azure Container Registry タスクを使用して、クラウドでコンテナー イメージをビルドしてデプロイする
https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-tutorial-quick-task

実行画面
+ 実行開始直後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/fe292ea3-b4bc-8f40-9c3b-dfcecc32bfa4.png)

+ 実行完了後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/15718e1c-c5ec-ebf8-8106-fccb0d894214.png)

#### Azure Portal で確認
+  Azure Portal  → コンテナーレジストリ → 任意のレジストリ(今回は **"konohaJavaACR"** ) → リポジトリ 、から確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/be2344d0-db9a-b30a-674f-7c5dd0e7503e.png)

+ 該当のリポジトリ("javasample")をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/7f95eb75-c5fc-a48a-767e-f254e2c6530b.png)
タグ：latest であることを確認する。

#### ACR のイメージ確認
```PowerShell: Azure CLI (PowerShell)
az acr repository list --name $ACR_NAME --output table
```
+ 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/c8a3c08a-7827-495e-5277-312d4a6a4422.png)


#### ACR のイメージのタグ確認
```PowerShell: Azure CLI (PowerShell)
az acr repository show-tags --name $ACR_NAME --repository javasample --output table
```
+ 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/55469aaf-2121-a604-8a63-2bbbee95a8f3.png)



#### ACR へログイン

```PowerShell: Azure CLI (PowerShell)
az acr login --name $ACR_NAMEaz acr repository list --name $ACR_NAME --output table
```
+ 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/5b0a06ae-dc50-b4aa-fa19-55bc0e93623c.png)

#### ACR ログインサーバーのフルネームを取得
```PowerShell: Azure CLI (PowerShell)
az acr show --name $ACR_NAME --query loginServer --output table
```
+ 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/b97dd214-408d-9df6-9a0f-ee2594e25b06.png)

::: note
返された値のACR ログインサーバ名 (この場合、konohajavaacr.azurecr.io)をメモする。
そして、変数 **$ACR_LOGIN_SERVER** として登録する
```PowerShell: Azure CLI (PowerShell)
$ACR_LOGIN_SERVER="konohajavaacr.azurecr.io"
```
:::

## サービスプリンシパル周りの設定
### ACIに使わせるためのサービスプリンシパルを作成する

+ 変数をそれぞれ定義
```PowerShell: Azure CLI (PowerShell)
$RES_GROUP="RG-temp"
$ACR_NAME="konohaJavaACR"
$AKV_NAME="keyvault0225"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/86b937d8-d130-95fb-f368-52ad24bbb538.png)

+ key vault 作成
```
az keyvault create --location japaneast -g $RES_GROUP -n $AKV_NAME
```
+ 実行完了後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/77bd0249-463f-169a-5b9d-c20f49d7c23b.png)

### サービスプリンシパル作成
```PowerShell: Azure CLI (PowerShell)
az ad sp create-for-rbac   --name http://$ACR_NAME-pull   --scopes $(az acr show --name $ACR_NAME --query id --output tsv)   --role acrpull
```
:::note 
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/b87169a0-ac6e-a410-7747-5ca81cc0b7ec.png)\
上記の **appId** と **"password"** をメモします！
:::
<参考>
・クイック スタート:Azure CLI を使用して Azure Key Vault との間でシークレットの設定と取得を行う
https://learn.microsoft.com/ja-JP/cli/azure/create-an-azure-service-principal-azure-cli
・az ad sp
https://learn.microsoft.com/ja-jp/cli/azure/ad/sp?view=azure-cli-latest

### シークレットの Keyvault 登録

+ つぎに備えてメモした **appId** と **"password"** を変数登録しておきます。
```PowerShell: Azure CLI (PowerShell)
$SP_ID="XXXXXXXXXXXXXXXX"
$PSSWRD="XXXXXX"
```
![2023-03-01_10h31_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/99918684-74bc-6009-6c3f-0b9234be1f2b.png)


+ シークレットの keyVault 登録
先ほどメモした **password** を引数 **"value"** に記載します。
```PowerShell: Azure CLI (PowerShell)
az keyvault secret set   --vault-name $AKV_NAME   --name $ACR_NAME-pull-pwd   --value $PSSWRD
```
+ 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/22c804a4-5b79-1022-af61-a812cc339137.png)


<参考>
・クイック スタート:Azure CLI を使用して Azure Key Vault との間でシークレットの設定と取得を行う
https://learn.microsoft.com/ja-JP/azure/key-vault/secrets/quick-create-cli
・az keyvault secret
https://learn.microsoft.com/ja-JP/cli/azure/keyvault/secret?view=azure-cli-latest


### ユーザをKeyvault 登録

```PowerShell: Azure CLI (PowerShell)
az keyvault secret set     --vault-name $AKV_NAME     --name $ACR_NAME-pull-usr     --value $SP_ID
```
+ 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/c6c6124e-bd60-7cde-a2ed-5d3ed0c8e1c2.png)


:::note
これで、下記のようにサービスプリンシパルをKV登録できた。
+ \$ACR\_NAME\-pull\-usr
+ \$ACR\_NAME-pull-pwd
:::



## Azure Container Instances へのビルド
### 変数設定(再掲含む)
+ まずは適当なDNS名を決める(変数定義)
```PowerShell: Azure CLI (PowerShell)
$ACI_DNS_LABEL="konohaJavasample001"
```
+ 変数をそれぞれ定義(再掲)
```PowerShell: Azure CLI (PowerShell)
$RES_GROUP="RG-temp"
$ACR_NAME="konohaJavaACR"
$AKV_NAME="keyvault0225"
$ACR_LOGIN_SERVER="konohajavaacr.azurecr.io"
```
+ 実行結果
とりあえずまとめて実施。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/1325168b-fd29-7f1a-a042-4e13da2a1709.png)

### ACI(Azure Container Instances) へのビルド

```PowerShell: Azure CLI (PowerShell)
az container create --resource-group $RES_GROUP --name javaai-sample-app  --image $ACR_LOGIN_SERVER/javasample:latest  --cpu 1  --memory 1.5  --registry-login-server $ACR_LOGIN_SERVER  --registry-username $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-usr --query value -o tsv)  --registry-password $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-pwd --query value -o tsv)   --ip-address Public  --dns-name-label $ACI_DNS_LABEL  --ports 8080
```

::: note
"--image $ACR_LOGIN_SERVER/javasample:latest" の後は、ACRのイメージ確認とタグ確認で確認した結果を元に記載します。
今回の場合は "javasample" と "latest" です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/57fd8f1a-903e-87c6-d27d-1103dc1731df.png)

:::


+ 実行直後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/4a36393d-e221-25ae-0def-00f991278f55.png)

+ 実行結果(最後を抜粋)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/00e8bf21-42d3-592b-e0c6-48f12b10fd8d.png)
上記 FQDN ( 今回の場合は **"konohaJavasample001.japaneast.azurecontainer.io"** ) をメモします。

### 確認してみて、、、、できた！
先ほどメモした FQDNへ http/ポート8080でアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/a66d2239-6e5e-2658-6256-a72aaeea66a8.png)

前半部分で[ローカルでビルドした時](https://qiita.com/aktsmm/items/04eca0a2296418247c9b#%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)のように表示されています～！

以上です。
とりあえずやってみよう Azure Container Instancesでした。