Azure Container Hands-on lab
Mar. 2023
-
Azure ポータルへアクセス
-
事前展開済みの仮想マシンの管理ブレードへ移動し、「接続」-「Bastion」を選択
-
ユーザー名、パスワードを指定し、仮想マシンへ接続
-
新しいタブで仮想マシンへの接続を行い、デスクトップ画面が表示
-
Visual Studio Code を起動 (デスクトップ上の準備されたショートカットをダブルクリック)
-
"Terminal" - "New Terminal" を選択し、ターミナルを表示
-
Git の初期設定を実行
-
ユーザー名の設定
git config --global user.name "User Name"
※ User Name を自身の名前に変更
-
Email アドレスの設定
git config --global user.email "Email@Address"
※ {Email Address} を使用するメール アドレスに変更
-
設定値の確認
git config --list --global
※ 設定したユーザー名・メール アドレスが出力されたら OK
-
-
Web ブラウザで Fork したリポジトリの "Code" をクリック
表示されるツール チップよりリポジトリの URL をコピー
-
Visual Studio Code のサイドバーから Explorer を選択し "Clone Repository" をクリック
-
リポジトリの URL の入力を求められるためコピーした URL を貼り付け Enter キーを押下
-
複製先となるローカル ディレクトリ (Documents) を選択
GitHub の認証情報が求められる場合は、アカウント名、パスワードを入力し認証を実施
-
複製されたリポジトリを開くかどうかのメッセージが表示されるので "Open" をクリック
-
Explorer に複製したリポジトリのディレクトリ、ファイルが表示
git remote -v
※ クローン先の GitHub URL が出力されたら OK (<自分のアカウント名>/AzureContainerApps-Hands-on-Lab-1 になっていることを確認 (kohei3110/AzureContainerApps-Hands-on-Lab-1になっていないことを確認)
C#
Java
-
Visual Studio Code で "Terminal" - "New Terminal" を選択
-
SpringBoot プロジェクトのディレクトリへ移動
cd src/Java/Web
-
アプリケーションを実行
./mvnw spring-boot:run
-
起動したらブラウザで http://localhost:5001 にアクセス
-
アプリケーションのトップ画面が表示
-
ターミナルで Ctrl + C を押下し、アプリケーションの実行を終了
C#
Java
C#
Java
-
デスクトップ上の "Ubuntu" ショートカットをダブルクリック
-
操作用のプロンプトが起動
-
WSL で Windows 側のマウントされたディレクトリへ移動
cd /mnt/c/Users/AzureUser/Documents/AzureContainerApps-Hands-on-Lab-1
-
docker build コマンドを実行しイメージを構築
C#
-
docker run コマンドを実行し、作成したイメージからコンテナーを起動
docker run -p 8080:80 app:v1
※ コマンドのオプション
- -p: ポート マッピング(コンテナーの 80 番ポートを 8080 番ポートへマッピング)
-
Web ブラウザを起動し http://localhost:8080 へアクセス
-
操作用のプロンプトで Ctrl + C キーを押下し、アプリケーションを終了
Java
-
docker run コマンドを実行し、作成したイメージからコンテナーを起動
docker run -p 8080:80 app:v1
※ コマンドのオプション
- -p: ポート マッピング(コンテナーの 5001 番ポートを 8080 番ポートへマッピング)
-
Web ブラウザを起動し http://localhost:8080 へアクセス
-
操作用のプロンプトで Ctrl + C キーを押下し、アプリケーションを終了
-
コンテナー一覧を表示するコマンドを実行
docker ps -a
※ コマンドのオプション
- -a: 起動中・停止中を含め、すべてのコンテナを表示(Java の場合は COMMAND の内容が異なる)
-
再度、イメージからコンテナーを起動
docker run -d --rm -p 8080:80 app:v1
※コマンドのオプション
-
-d: デタッチド モードでコンテナを起動
-
--rm: コンテナ終了時にコンテナを削除
-
-p: ポート マッピング(コンテナの 80 番ポートを 8080 番ポートへマッピング)
-
-
起動中のコンテナーを確認
docker ps
※ CONTAINER ID を確認
-
Web ブラウザを起動し http://localhost:8080 へアクセス
-
コンテナーを停止 (docker ps コマンドで確認した CONTAINER ID を指定)
docker stop <CONTAINER ID>
-
コンテナー一覧を表示するコマンドを実行
docker ps -a
※ 2 度目に実行したコンテナーが表示されないことを確認
-
停止中のコンテナーを削除 (1 度目に実行したコンテナを削除)
docker rm <CONTAINER ID> -f
-
コンテナー一覧を表示するコマンドを実行
docker ps -a
※ コンテナーが表示されないことを確認
-
Web ブラウザで Azure ポータルへアクセス
-
ポータルのトップ画面で「+ リソースの作成」をクリック
-
左側のメニューで「コンテナー」を選択し、「Container Registry」の「作成」をクリック
-
コンテナー レジストリの作成
-
「確認および作成」をクリックし、指定した内容を確認後、「作成」をクリック
-
Azure ポータルで作成したコンテナー レジストリの管理ブレードへアクセス
-
左側のメニューから「アクセス キー」を選択
-
「管理者ユーザー」を有効化
-
操作用のプロンプトでレジストリへログイン
docker login yourregistry.azurecr.io
※ yourreregistry.azurecr.io を作成したコンテナー レジストリのログイン サーバーに変更
※ コンテナー レジストリのログイン サーバー名は管理ブレードのアクセス キーから確認可
-
Username, Password を指定し、ログインを実行
※ コンテナー レジストリの管理ブレードのアクセス キーから取得できるユーザー名とパスワードを使用
-
レジストリへの完全修飾パスを使用して、イメージのエイリアスを作成
docker tag app:v1 yourregistry.azurecr.io/app:v1
※ yourreregistry.azurecr.io を作成したコンテナー レジストリのログイン サーバーに変更
-
エイリアスを付与したイメージが表示されることを確認
docker images
-
docker push を使用してレジストリへプッシュ
docker push yourregistry.azurecr.io/app:v1
※ yourreregistry.azurecr.io を作成したコンテナー レジストリのログイン サーバーに変更
-
Azure ポータルで作成したコンテナー レジストリの管理ブレードへアクセス
-
左側のメニューから「リポジトリ」を選択
-
リポジトリ内のイメージを確認
-
Web ブラウザで Azure ポータルへアクセス
-
ポータルのトップ画面で「+ リソースの作成」をクリック
-
左側のメニューで「コンテナー」を選択し、「コンテナー アプリ」の「作成」をクリック
-
コンテナー アプリの作成
-
Container Apps 環境 の地域を選択し「新規作成」をクリック
※ 地域は使用するリソース グループ内に展開済みの仮想ネットワークと同じものを選択
-
Container Apps 環境の作成
-
「Create」をクリックし Container Apps 環境を作成
-
-
「基本」
-
「アプリ設定」
-
「確認と作成」をクリック
-
-
事前評価で問題がなければ、指定した内容を確認し「作成」をクリック
-
リソースの展開完了後、コンテナー アプリの管理ブレードへアクセス
-
「アプリケーション URL」をクリック
-
Web ブラウザが起動し、アプリケーションの画面を表示
-
コンテナー アプリの管理ブレードの左側のメニューから「リビジョン管理」を選択
-
「+ 新しいリビジョンを作成」をクリック
-
新しいリビジョンの作成とデプロイ
-
「コンテナー」
-
「スケーリング」
-
-
「作成」をクリック
-
「新しいリビジョンが正常にデプロイされました」のメッセージを確認
-
コンテナー アプリの管理ブレードの「概要」タブの「アプリケーション URL」をクリック
-
Web ブラウザが起動し、アプリケーションの画面を表示
-
コンテナー レジストリへプッシュしたアプリケーションが展開されていることを確認
-
コンテナー アプリの管理ブレードの左側のメニューから「リビジョン管理」を選択
-
「リビジョン モードの選択」をクリック
-
「複数: 同時に複数のリビジョンをアクティブにする」を選択し、「適用」をクリック
-
「リビジョンが正常に更新されました」のメッセージを確認
- Visual Studio Code を起動
C#
-
Explorer で ASP.NET Core アプリケーションのディレクトリ(「src」-「CS」-「Web」)を展開
-
「View」-「Home」を展開し、「Index.cshtml」を選択
-
Index.cshtml の 10 行目、11 行目をエディタで編集
<img src="~/images/yellow_small.gif" /> <p>Version 2</p>
-
「File」メニューの「Save」を選択し、ファイルを保存
-
ローカルでアプリケーションの変更を確認するため、ターミナルからコマンドを実行
dotnet run
※ カレント ディレクトリが Web であることを確認後にコマンドを実行
-
ターミナルでコマンドを実行し、展開のためのファイル セットをディレクトリへ発行
dotnet publish -c Release -o ./bin/Publish
Java
-
Explorer で Spring Boot アプリケーションのディレクトリ(「src」-「Java」-「Web」)を展開
-
「src」-「main」-「resources」-「templates」-「home」を展開し、「Index.html」を選択
-
Index.html の 13 行目、14 行目をエディタで編集
<img src="images/yellow_small.gif" /> <p>Version 2</p>
-
「File」メニューの「Save」を選択し、ファイルを保存
-
ローカルでアプリケーションの変更を確認するため、VSCode のターミナルからコマンドを実行
./mvnw spring-boot:run
※ カレント ディレクトリが src\Java\Web であることを確認後にコマンドを実行
-
ブラウザで変更を確認したら CTRL+C でローカル実行を停止
-
VSCode のターミナルでコマンドを実行し、展開のためのファイル セットをディレクトリへ発行
./mvnw package
-
docker 操作用 Linux プロンプトへ移動
※ 起動していない場合は、デスクトップ上の Ubuntu ショートカットをダブルクリックして起動
※ 起動後、マウントされたディレクトリへ移動
cd /mnt/c/Users/AzureUser/Documents/AzureContainerApps-Hands-on-Lab-1
-
イメージを構築
※ yourreregistry.azurecr.io を作成したコンテナー レジストリのログイン サーバーに変更
C#
docker build -t yourregistry.azurecr.io/app:v2 -f .docker/CS/dockerfile .
Java
docker build -t yourregistry.azurecr.io/app:v2 -f .docker/Java/dockerfile .
-
イメージの確認
docker images
-
動作確認
※ yourreregistry.azurecr.io を作成したコンテナー レジストリのログイン サーバーに変更
docker run --rm -p 8080:80 yourregistry.azurecr.io/app:v2
-
Web ブラウザを起動し http://localhost:8080 へアクセス
-
操作用のプロンプトで Ctrl + C キーを押下し、アプリケーションを終了
-
docker push を使用してレジストリへプッシュ
※ yourreregistry.azurecr.io を作成したコンテナー レジストリのログイン サーバーに変更
docker push yourregistry.azurecr.io/app:v2
-
Azure ポータルで作成したコンテナー レジストリの管理ブレードへアクセス
-
左側のメニューから「リポジトリ」を選択
-
リポジトリ内のイメージを確認
-
コンテナー アプリの管理ブレードの左側のメニューから「リビジョン管理」を選択
-
「+ 新しいリビジョンを作成」をクリック
-
新しいリビジョンの作成とデプロイの「コンテナー」タブでコンテナー イメージの名前をクリック
-
「コンテナーの編集」で「イメージ タグ」を「v2」に変更
-
「保存」をクリック
-
「タグ」が「v2」に変更されていることを確認し、「作成」をクリック
-
デプロイ完了後、複数リビジョンがアクティブ状態であることを確認
※ トラフィックは、100% を元のリビジョンに割り当て
-
コンテナー アプリの管理ブレードの「概要」タブの「アプリケーション URL」をクリック
-
Web ブラウザが起動し、アプリケーションの画面を表示
-
コンテナー アプリの管理ブレードの左側のメニューから「リビジョン管理」を選択
-
新しく展開したリビジョンに 100% のトラフィックを割り当てるよう変更し、「保存」をクリック
-
コンテナー アプリの管理ブレードの「概要」タブの「アプリケーション URL」をクリック
-
Web ブラウザが起動し、アプリケーションの画面を表示
-
コンテナー アプリの管理ブレードの左側のメニューで「スケーリング」を選択
-
既定で最小 0、最大 10 のスケール設定が行われていることを確認
-
左側のメニューで「概要」を選択し「アプリケーション URL」をコピー
-
リソース グループから展開済みの Load Testing を選択し、管理ブレードへアクセス
-
左側のメニューから「テスト」を選択し、「+ 作成」-「クイック テストを作成する」をクリック
-
テストの詳細で URL とロード パラメーターを指定し「テストの実行」をクリック
-
テスト スクリプトの生成とテスト エンジンの準備のためしばらく待機
-
テストを実行
-
テストの完了後、コンテナー アプリの管理ブレードへ移動
-
左側のメニューから「メトリック」を選択
-
「メトリック」のリストから「Replica Count」を選択
-
画面右上の時間の範囲・粒度、時間帯の種類を設定
-
設定した内容でグラフが表示
※ 負荷に応じてスケール アウトが行われていることを確認
-
Cloud Shell を起動
-
リソース グループのリソース ID を取得(リソース グループ名は使用環境に合わせて変更)
groupId=$(az group show --name "リソース グループ名" --query id --output tsv)
-
サービス プリンシパルの作成(名前は任意、リソース グループに対する共同作成者の権限を付与)
az ad sp create-for-rbac --name "GitHub-Deploy" --scopes $groupId --role Contributor --sdk-auth
-
出力された結果を {} も含めてコピーし、メモ帳などに貼り付け
-
リソース グループに対して共同作成者の権限が付与されていることを確認
-
Web ブラウザで GitHub リポジトリへアクセス、「Settings」タブを選択
-
「Secrets and variables」を展開し「Actions」を選択
-
「New repository secret」をクリックし、新しいシークレットを登録
シークレット名 値 AZURE_CREDENTIALS サービス プリンシパル作成時に出力された JSON 全体 REGISTRY_LOGINSERVER Azure Container Registry のログイン サーバー名 REGISTRY_USERNAME Azure Container Registry の管理者のユーザー名 REGISTRY_PASSWORD Azure Container Registry の管理者のパスワード AZURE_CONTAINER_APPS 展開先のコンテナー アプリの名前 RESOURCE_GROUP コンテナー アプリが属すリソース グループの名前
-
Dockerfile の更新
C#
-
アプリケーションの更新
C#
-
Visual Studio Code の Explorer で アプリケーションのディレクトリ(「src」-「CS」-「Web」)を展開
-
「View」-「Home」を展開し、「Index.cshtml」を選択
-
Index.cshtml の 10 行目、11 行目をエディタで編集
<img src="~/images/blue_small.gif" /> <p>Version 3</p>
-
「File」メニューの「Save」を選択し、ファイルを保存
Java
-
Visual Studio Code の Explorer で アプリケーションのディレクトリ(「src」-「Java」-「Web」)を展開
-
「src」-「main」-「resources」-「templates」-「home」を展開し、「Index.html」を選択
-
Index.html の 13 行目、14 行目をエディタで編集
<img src="~/images/blue_small.gif" /> <p>Version 3</p>
-
「File」メニューの「Save」を選択し、ファイルを保存
-
-
Web ブラウザで GitHub リポジトリへアクセスし「Actions」タブを選択
-
「I understand my workflows, go ahead and enable them」をクリック
-
「Deploy container」ワークフローを選択し「Run workflow」をクリック
-
ワークフローの事項が開始
-
ワークフローが正常に終了することを確認
-
Web ブラウザーで Azure ポータルへアクセスし、コンテナー レジストリの管理ブレードを表示
-
左側のメニューから「リポジトリ」を選択
-
リポジトリ内のイメージを確認
※ ワークフローから新しいイメージが登録
-
コンテナー アプリの管理ブレードの左側のメニューから「リビジョン管理」を選択
-
新しく展開したリビジョンに 100% のトラフィックを割り当てるよう変更し、「保存」をクリック
-
コンテナー アプリの管理ブレードの「概要」タブの「アプリケーション URL」をクリック
-
Web ブラウザが起動し、アプリケーションの画面を表示
-
アプリケーションが変更されたことを確認
-
Web ブラウザで Azure ポータルにアクセス
-
「ツール」の「Microsoft Defender for Cloud」をクリック
-
左側のメニューで「環境設定」を選択し、「+ 環境を追加」-「GitHub (プレビュー)」をクリック
-
GitHub 接続の作成
-
左側のメニューで「DevOps Security (Preview)」を選択
※ 選択したリポジトリが表示されることを確認
-
Web ブラウザで GitHub リポジトリへアクセスし「Settings」タブを選択
-
左側のメニューで「Actions」-「General」を選択
-
「Workflow permissions」を「Read and write permissions」に変更し「Save」をクリック
-
ワークフローの更新
C#
-
Visual Studio Code の Explorer で 「.github」-「workflows」を展開
-
「deploy-aspnet-core-to-aca.yml」ファイルを選択
-
60 行目から脆弱性スキャンを行うコードを追加
- name: Run Microsoft Security DevOps Analysis uses: microsoft/security-devops-action@preview id: msdo env: GDN_TRIVY_ACTION: "image" GDN_TRIVY_TARGET: ${{ secrets.REGISTRY_LOGINSERVER }}/app:${{ github.sha }} with: categories: "containers" tools: "Trivy" - name: Upload alerts to Security tab uses: github/codeql-action/upload-sarif@v2 with: sarif_file: "${{ github.workspace }}/.gdn/rc/trivy/001/trivy.sarif"
-
「File」メニューの「Save」を選択し、ファイルを保存
Java
-
Visual Studio Code の Explorer で 「.github」-「workflows」を展開
-
「deploy-springboot-to-aca.yml」ファイルを選択
-
60 行目から脆弱性スキャンを行うコードを追加
- name: Run Microsoft Security DevOps Analysis uses: microsoft/security-devops-action@preview id: msdo env: GDN_TRIVY_ACTION: "image" GDN_TRIVY_TARGET: ${{ secrets.REGISTRY_LOGINSERVER }}/app:${{ github.sha }} with: categories: "containers" tools: "Trivy" - name: Upload alerts to Security tab uses: github/codeql-action/upload-sarif@v2 with: sarif_file: "${{ github.workspace }}/.gdn/rc/trivy/001/trivy.sarif"
-
「File」メニューの「Save」を選択し、ファイルを保存
-
-
アプリケーションの更新
C#
-
Visual Studio Code の Explorer で アプリケーションのディレクトリ(「src」-「CS」-「Web」)を展開
-
「View」-「Home」を展開し、「Index.cshtml」を選択
-
Index.cshtml の 10 行目、11 行目をエディタで編集
<img src="~/images/yellow_small.gif" /> <p>Version 4</p>
-
「File」メニューの「Save」を選択し、ファイルを保存
Java
-
Visual Studio Code の Explorer で アプリケーションのディレクトリ(「src」-「Java」-「Web」)を展開
-
「src」-「main」-「resources」-「templates」-「home」を展開し、「Index.html」を選択
-
Index.html の 13 行目、14 行目をエディタで編集
<img src="~/images/yellow_small.gif" /> <p>Version 4</p>
-
「File」メニューの「Save」を選択し、ファイルを保存
-
-
Visual Studio Code のサイドバーで Source Controle を選択、コメントを入力し変更をコミット
-
GitHub リポジトリと同期
-
Web ブラウザで GitHub リポジトリへアクセスし「Actions」タブを選択
-
ワークフローが実行されていることを確認
※ ワークフローのトリガー条件に合致したため、ワークフローが自動実行
-
ワークフローが正常に終了することを確認
-
「Security」タブの左側のメニューから「Code scanning」を選択
-
項目をクリックし、詳細を確認