駆け出しアーキテクトのやまぱんです。
今回公開されているJavaのサンプルアプリケーションを使って、Azure Container Instances(ACI)にデプロイしてみたいと思います。
とりあえずやってみよう Azure Container Instances!
想定ターゲット: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 コマンドです。
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" でした。
一応確認してフォルダができているか確認してください。
上記のように設定します。
- 確認
上記追加後 コマンドプロンプトで確認します。
設定中から開いている場合は再度開きなおしてください。(開きなおさないと反映されません)
コマンドプロンプトは "Windows + R" を押してでてくる画面で "cmd" と打つことで表示されます。
echo %JAVA_HOME%
vscode で git レポジトリをクローンする
vscode を 開きます
クローンします
"表示" → "コマンドパレット" → "Gitクローン" を選択し、今回クローンするレポジトリ(XXX.git)を入力する。
今回クローンするレポジトリは https://github.com/Azure-Samples/ApplicationInsights-Java-Samples なのでhttps://github.com/Azure-Samples/ApplicationInsights-Java-Samples.git を入力し"Enter"する。
すると、クローン先のフォルダの選択画面がでるので任意のフォルダを選択。
今回は C:\git_temp\test
にクローンします。
そしてそのまま vscodeで開く。
念のためフォルダも確認。ちゃんとクローンされていることが分かる。
Java をビルドする。
vscode の "ターミナル"を選択し、ターミナルを表示させ現在の位置がクローンしたフォルダになっていることを確認する。基本的にはそのままクローンして開いてターミナルを表示させた場合はクローンしたフォルダになっている。
下記のコマンドを打つ(ビルドコマンド)
./mvnw package
ビルドが始まる
ビルドが終わる "BUILD SUCCESS"
jar ができていることを確認する
今回の場合 C:\git_temp\test\ApplicationInsights-Java-Samples\maven\target
配下に app.jar ファイルができています。
実行してみる
先ほど jar ファイルができた"C:\git_temp\test\ApplicationInsights-Java-Samples\maven\target"
に移動して、vscodeのコンソール画面 / PowerShellで下記コマンドを打って jar ファイルを実行します。
- 移動コマンド
cd C:\git_temp\test\ApplicationInsights-Java-Samples\maven\target
- 実行コマンド
java -jar .\app.jar
実行が始まる
確認してみる
今回のサンプルはポート8080でアクセスするサンプルアプリケーションなのでブラウザで http://localhost:8080/ にアクセスしてみます。
このように表示されればOKです。
消す
Ctrl +C
vscodeのコンソール画面 / PowerShell 上で上記コマンドを押すことで終了します。
http://localhost:8080/ にもアクセスできなくなるはずです。
本題です、次に Azure (ACI)にデプロイします。
ACR(Azure Container Registry) の作成
Azure Portal から ACR の作成
今回は konohaJavaACR(.azure.io) で作成しました。
ACR 上でビルド
Azure にログインする
Az login --tenant XXXXX
XXXX は 任意のAADテナントを指定する。(省略可能)
・https://learn.microsoft.com/ja-jp/cli/azure/authenticate-azure-cli#sign-in-with-a-different-tenant
ACR 上でビルド
クローンしたレポジトリに移動し下記コマンドを実行。
- 先ほど作成した Azure Container Registry 名を変数として定義
$ACR_NAME="konohaJavaACR"
- ビルド
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
実行画面
Azure Portal で確認
ACR のイメージ確認
az acr repository list --name $ACR_NAME --output table
ACR のイメージのタグ確認
az acr repository show-tags --name $ACR_NAME --repository javasample --output table
ACR へログイン
az acr login --name $ACR_NAMEaz acr repository list --name $ACR_NAME --output table
ACR ログインサーバーのフルネームを取得
az acr show --name $ACR_NAME --query loginServer --output table
返された値のACR ログインサーバ名 (この場合、konohajavaacr.azurecr.io)をメモする。
そして、変数 $ACR_LOGIN_SERVER として登録する
$ACR_LOGIN_SERVER="konohajavaacr.azurecr.io"
サービスプリンシパル周りの設定
ACIに使わせるためのサービスプリンシパルを作成する
- 変数をそれぞれ定義
$RES_GROUP="RG-temp"
$ACR_NAME="konohaJavaACR"
$AKV_NAME="keyvault0225"
- key vault 作成
az keyvault create --location japaneast -g $RES_GROUP -n $AKV_NAME
サービスプリンシパル作成
az ad sp create-for-rbac --name http://$ACR_NAME-pull --scopes $(az acr show --name $ACR_NAME --query id --output tsv) --role acrpull
<参考>
・クイック スタート: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" を変数登録しておきます。
$SP_ID="XXXXXXXXXXXXXXXX"
$PSSWRD="XXXXXX"
- シークレットの keyVault 登録
先ほどメモした password を引数 "value" に記載します。
az keyvault secret set --vault-name $AKV_NAME --name $ACR_NAME-pull-pwd --value $PSSWRD
<参考>
・クイック スタート: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 登録
az keyvault secret set --vault-name $AKV_NAME --name $ACR_NAME-pull-usr --value $SP_ID
これで、下記のようにサービスプリンシパルをKV登録できた。
- $ACR_NAME-pull-usr
- $ACR_NAME-pull-pwd
Azure Container Instances へのビルド
変数設定(再掲含む)
- まずは適当なDNS名を決める(変数定義)
$ACI_DNS_LABEL="konohaJavasample001"
- 変数をそれぞれ定義(再掲)
$RES_GROUP="RG-temp"
$ACR_NAME="konohaJavaACR"
$AKV_NAME="keyvault0225"
$ACR_LOGIN_SERVER="konohajavaacr.azurecr.io"
ACI(Azure Container Instances) へのビルド
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
確認してみて、、、、できた!
先ほどメモした FQDNへ http/ポート8080でアクセスします。
前半部分でローカルでビルドした時のように表示されています~!
以上です。
とりあえずやってみよう Azure Container Instancesでした。