初めに
先日AZ-204に合格したのですが、試験を受けてみて初めて、各サービスを何となくしか理解出来ていないことに気付きました。
「これは受かったとは言えないぞ?」と反省の気持ちでいっぱいですので、これから自分の為に復習していこうと思っています。
本記事で取り扱うこと
AZ-204ではコンテナの知識が問われます。
今回は__「ソリューションに対するコンテナイメージの作成」__対策として、MSの公式ドキュメントのチュートリアルをやりながら、ACRに格納したイメージからAzure App Service(以下、ACR)を使ってWebアプリをデプロイしてみます。
ポイント
- ACRの仕様を理解する
- ACRのイメージからAzure App Serviceを使ってWebアプリをデプロイする
- 構築手順、構築のためのAzure CLIのコマンドを理解する
- dockerの基本的なコマンド、Dockerfileの記載のお作法を理解する
参考になる公式サイト
MSドキュメント
Azure App Service を使ってコンテナー化された Web アプリをデプロイして実行する
MS Learn
Azure App Service を使ってコンテナー化された Web アプリをデプロイして実行する
知識
Azure Container Registryとは
AzureのプライベートなDocker Registryサービスです。
3つのSKU
Basic、Standard、Premiumの3つのサービスレベルから利用できます。
SKU | 説明 | 料金 |
---|---|---|
Basic | 学習用途、PoC等使用頻度が少ないシナリオの場合に利用します。 Azure AD認証、__Webhook統合__等のStandard・Premiumで利用できる機能も試すことが出来ます。 ダウンロード帯域やRead/WriteOpsなどのパフォーマンスは制限されています。 |
¥18.660/日 |
Standard | 利用できる機能の種類はBasicと同数ですが、Basicよりもパフォーマンスに優れています。 | ¥74.660/日 |
Premium | Basic、Standardで利用できる機能に加え、geoレプリケーション、PrivateLink、カスタマーマネージドキーによる暗号化、__Docker Content Trust__等の機能を利用できます。 | ¥186.660/日 |
実装
作業環境に関して
本作業ではOSに__Windows__を利用し、取得済みの__Azure Subscription__を利用します。
__無料Subscriptionは利用していない__ので、無料アカウントでコマンドを実行しようとした際に齟齬が出た場合は大変申し訳ありません。
作業前に、必要なミドルウェアをインストールしてください。
- Azure CLI (2.22.1) -> まだの場合はCLIをインストール
- Git(2.31.1.windows.1) -> まだの場合はGitをインストール
- Docker -> まだの場合はDocker(Windows版)をインストール
イメージの作成
まずMicrosoftが提供するサンプルアプリを利用してACRにDockerイメージを作成します。
サンプルアプリをクローン
私はC:\Dev\az-204\1-4_ACR_imageというフォルダを作成してクローンしています。
コマンド
git clone https://github.com/Azure-Samples/docker-django-webapp-linux.git --config core.autocrlf=input
Dockerfileの確認
# ベースのイメージを記載。必ず先頭に記述
# FROM image名:tag名
FROM tiangolo/uwsgi-nginx-flask:python3.6
# シェルコマンドの実行。image内にcodeディレクトリを作成
RUN mkdir /code
# 後続のコマンドの作業ディレクトリを指定
WORKDIR /code
# ローカルのrequirements.txtをコンテナ内のcodeディレクトリに移動
ADD requirements.txt /code/
# requirements.txtにリストされたパッケージをインストールする
RUN pip install -r requirements.txt --no-cache-dir
# クローンしたソースをまとめてコンテナ内に作成したcodeディレクトリにコピーする
ADD . /code/
# Key:SSH_PASSWD, Value:"root:Docker!"の環境変数を宣言
ENV SSH_PASSWD "root:Docker!"
# openssh-serverをインストールする
RUN apt-get update \
&& apt-get install -y --no-install-recommends dialog \
&& apt-get update \
&& apt-get install -y --no-install-recommends openssh-server \
&& echo "$SSH_PASSWD" | chpasswd
# ローカルにクローンしたファイル(sshd_config, init.sh)を指定したイメージのパス配下にコピーする
COPY sshd_config /etc/ssh/
COPY init.sh /usr/local/bin/
# コンテナ内でinit.shを実行
RUN chmod u+x /usr/local/bin/init.sh
EXPOSE 8000 2222
# CMD ["python", "/code/manage.py", "runserver", "0.0.0.0:8000"]
# init.shを呼び出してSSHサービスとPythonサーバを起動
ENTRYPOINT ["init.sh"]
イメージをローカルで作成してテストする
イメージ作成のコマンド
dockerイメージを作成します。タグを指定していないのでlatestタグが作成されます。
docker build --tag appsvc-tutorial-custom-image .
ローカルにイメージが出来たことを確認します。
docker images | grep app*
ローカルでコンテナを実行
docker run -p 8000:8000 appsvc-tutorial-custom-image
ブラウザで確認
↓↓URL
http://localhost:8000/
テナントにログイン
ログインコマンド後、ブラウザに認証画面が表示されるのでユーザ・パスワードを入力します。
az login
認証完了後、ローカルでAzure CLIを実行できる状態になります。
リソースグループを作成する
__AppSvc-DockerTutorial-rg__という名前のリソースグループを作成します。
コマンド
az group create --name AppSvc-DockerTutorial-rg --location japaneast
__AppSvc-DockerTutorial-rg__が作成されました。
Azure Container Registryにイメージをプッシュする
Azure Container Registryを作成
コマンド
コンテナを使ってAzure Web Appにデプロイするため、__admin-enabled__オプションをtrueにします。
az acr create --name acrkumamatsu --resource-group AppSvc-DockerTutorial-rg \
--sku Basic --admin-enabled true
実行結果
Azure PortalでRegistryが作成されたことを確認します。
ログインサーバ名(registry-name.azurecr.io)を確認しておきます。
Registryの資格情報を取得
コンテナにログインするための認証情報を確認します。
コマンド
az acr credential show --resource-group AppSvc-DockerTutorial-rg --name acrkumamatsu
Azure Portalから確認
Azure Portalからも確認できます。
管理者ユーザも有効になっていますね。
Container Registryにサインイン
コマンド
コンテナサーバにサインインします。
パスワードの入力が求められますので、先ほど取得したパスワードを入力してEnterを押します。
docker login acrkumamatsu.azurecr.io --username acrkumamatsu
Dockerイメージにタグ(バージョン)を付与
コマンド
docker tag appsvc-tutorial-custom-image acrkumamatsu.azurecr.io/appsvc-tutorial-custom-image:latest
Registryにイメージをプッシュ
docker push acrkumamatsu.azurecr.io/appsvc-tutorial-custom-image:latest
プッシュしたイメージの確認
latest: digest:…と表示されたらlistコマンドを実行して確認してみます。
az acr repository list -n acrkumamatsu
Portalで確認もできます。
リポジトリにイメージがありますね。
RegistryからイメージをデプロイするようにApp Serviceを構成
App Serviceプランを作成
Web Appsの構築・運用の方法もAZ-204に合格するためには理解しておかなくてはなりません。
Azure CLIやPowerShellでの構築方法、各Azureサービスの構築順序を理解しておきましょう。
まずは__App Serviceプランを作成__します。
プランとは、Webアプリをホストする為のハードウェアに採用するスペックのことです。
Linuxベースのプランを使用するので__-is-linux__オプションが設定されています。
az appservice plan create --resource-group AppSvc-DockerTutorial-rg \
--name AppSvc-DockerTutorial-plan --is-linux
Web アプリを作成
作成したApp Serviceプラン上で__Web アプリ__を作成します。
az webapp create --resource-group AppSvc-DockerTutorial-rg `
--plan AppSvc-DockerTutorial-plan --name kumamatsuapp `
--deployment-container-image-name acrkumamatsu.azurecr.io/appsvc-tutorial-custom-image:latest
WEBSITES_PORT環境変数を設定
__WEBSITES_PORT__とはWEBサイトを公開する際にコンテナ側のポートとして利用する値を設定する項目です。
チュートリアル通り、8000を利用します。
az webapp config appsettings set --resource-group AppSvc-DockerTutorial-rg \
--name kumamatsuapp --settings WEBSITES_PORT=8000
結果をPortalで確認しましょう。
コンテナの引数として、アプリケーション設定に新たな項目が追加されました。
Web アプリのマネージドIDを有効
Webアプリで__マネージドID__を有効化します。
az webapp identity assignコマンドを利用します。
__--query__オプションを使っていますが、これはjsonで出力されるcliの結果から指定したKey項目に紐づくValueを出力したい際に設定します。
有効化した__マネージドID__は後工程で利用します。
principalId=`az webapp identity assign --resource-group AppSvc-DockerTutorial-rg --name kumamatsuapp \
--query principalId --output tsv`
このコマンドを実行するとAzure Portalの[App Service]>[ID]の状態がオンになります。
サブスクリプション ID を取得
subscription_id=`az account show --query id --output tsv`
Container Registryへのアクセス許可をWebアプリに与える
az role assignment create --assignee $principalId \
--scope /subscriptions/$subscription_id/resourceGroups/AppSvc-DockerTutorial-rg/providers/Microsoft.ContainerRegistry/registries/acrkumamatsu \
--role "AcrPull"
以下のサイトによると、GitをインストールしているWindows OSでAzure CLIを利用する際に出るようです。
Unable to create service principal with azure cli from git bash shell, no connection adapters were found.
もう一度同じコマンドを実行しますが、先頭に「MSYS_NO_PATHCONV=1 」を付けます。
MSYS_NO_PATHCONV=1 az role assignment create --assignee $principalId \
--scope /subscriptions/$subscription_id/resourceGroups/AppSvc-DockerTutorial-rg/providers/Microsoft.ContainerRegistry/registries/acrkumamatsu \
--role "AcrPull"
WebアプリのマネージドIDにacrkumamatsu Registryに対するロールを設定します。
Azure Portalで設定を見てみましょう。
Container Registryのアクセス制御(IAM)に先ほど設定した__AcrPull__というロールが表示されています。
このロールを利用できるのはApp Service __kumamatsuapp__です。
マネージドIDを利用した認証のイメージです。
イメージをデプロイしてアプリをテスト
Container RegistryとWebアプリ用にデプロイするイメージを指定
az webapp config container set --name kumamatsuapp \
--resource-group AppSvc-DockerTutorial-rg \
--docker-custom-image-name acrkumamatsu.azurecr.io/appsvc-tutorial-custom-image:latest \
--docker-registry-server-url https://acrkumamatsu.azurecr.io
コマンドを実行したら、「No credential was provided to access Azure Container Registry. Trying to look up... 」というWarningが出力されました。
これはRegistryに対する認証にユーザ名・パスワードではなくアプリのマネージドIDを使用していることを表しています。
App ServiceのDeploy Centerを見てみましょう。
Web AppがAzure Container Registryの特定のイメージ・タグと紐づいていることがわかります。
URLにアクセス
ブラウザからデプロイが完了したかどうかを確認してみましょう。
↓↓↓URL
https://kumamatsuapp.azurewebsites.net/
アプリのコードを変更して再デプロイ
index.htmlの変更
ではソースコードを変更して再デプロイしてみます。
docker-django-webapp-linux フォルダーにあるファイルapp/templates/app/index.htmlの中身を変更します。
イメージをリビルド
docker-django-webapp-linux フォルダーに移動してイメージ(v1.0.1)をリビルドします。
docker build -t appsvc-tutorial-custom-image:v1.0.1 .
イメージをRegistryにプッシュ
docker push acrkumamatsu.azurecr.io/appsvc-tutorial-custom-image:v1.0.1
Azure Portalで見てみましょう。
v1.0.1タグでイメージがプッシュされたことがわかります。
Container RegistryとWebアプリ用にデプロイするイメージを指定
az webapp config container set --name kumamatsuapp \
--resource-group AppSvc-DockerTutorial-rg \
--docker-custom-image-name acrkumamatsu.azurecr.io/appsvc-tutorial-custom-image:v1.0.1 \
--docker-registry-server-url https://acrkumamatsu.azurecr.io
PortalのDeploy Centerを見てましょう。タグが置き換わっています。
Webアプリを再起動
再起動コマンドを実行し、Webアプリを再起動します。
az webapp restart --name kumamatsuapp --resource-group AppSvc-DockerTutorial-rg
ブラウザから確認します。
修正が反映されていることが確認できました。
参考
以下のサイト・動画を参考にさせていただきました。ありがとうございました。
Webサイト
DockerfileのADDとCOPY、CMDとENTRYPOINTの違いを整理
3つの観点から見たコンテナの構造とは?
WindowsでDockerを始める手順
【Microsoft Azure】DockerコンテナをACR経由でAppServiceにデプロイする
Content trust in Docker