2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AZ-204対策 ソリューションに対するコンテナイメージの作成

Last updated at Posted at 2021-04-25

初めに

先日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

実行結果
image.png

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*

2_docker_ps.png

ローカルでコンテナを実行

docker run -p 8000:8000 appsvc-tutorial-custom-image

OpenSSHサーバが起動したことを確認します。
3_docker_build.png

ブラウザで確認
↓↓URL
http://localhost:8000/

4_brawser.png

テナントにログイン

ログインコマンド後、ブラウザに認証画面が表示されるのでユーザ・パスワードを入力します。

az login

認証完了後、ローカルでAzure CLIを実行できる状態になります。
5_az_login.png

リソースグループを作成する

__AppSvc-DockerTutorial-rg__という名前のリソースグループを作成します。

コマンド

az group create --name AppSvc-DockerTutorial-rg --location japaneast

実行結果
6_rp.png

__AppSvc-DockerTutorial-rg__が作成されました。
6_rp_screen.png

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)を確認しておきます。
7_acr.png

Registryの資格情報を取得

コンテナにログインするための認証情報を確認します。

コマンド

az acr credential show --resource-group AppSvc-DockerTutorial-rg --name acrkumamatsu

実行結果
※acrは記事の投稿時には削除します。
8_password.png

Azure Portalから確認
Azure Portalからも確認できます。
管理者ユーザも有効になっていますね。
9_password_acr.png

Container Registryにサインイン

コマンド
コンテナサーバにサインインします。
パスワードの入力が求められますので、先ほど取得したパスワードを入力してEnterを押します。

docker login acrkumamatsu.azurecr.io --username acrkumamatsu

実行結果
10_container_login.png

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

12_acr_push.png

プッシュしたイメージの確認

latest: digest:…と表示されたらlistコマンドを実行して確認してみます。

az acr repository list -n acrkumamatsu

13_acr_list.png

Portalで確認もできます。
リポジトリにイメージがありますね。
13_repo_image.png

タグが付与されています。
13_repo_Tag.png

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

14_result.png

Portalで確認することもできます。
14_result_screen.png

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

15_app.png

WEBSITES_PORT環境変数を設定

__WEBSITES_PORT__とはWEBサイトを公開する際にコンテナ側のポートとして利用する値を設定する項目です。
チュートリアル通り、8000を利用します。

az webapp config appsettings set --resource-group AppSvc-DockerTutorial-rg \
 --name kumamatsuapp --settings WEBSITES_PORT=8000

結果をPortalで確認しましょう。
コンテナの引数として、アプリケーション設定に新たな項目が追加されました。

16_app_setting.png

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]の状態がオンになります。

17_managedid_screen.png

サブスクリプション 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"

何やらエラーが発生します。
18_error.png

以下のサイトによると、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に対するロールを設定します。

19_avoid_error.png

Azure Portalで設定を見てみましょう。
Container Registryのアクセス制御(IAM)に先ほど設定した__AcrPull__というロールが表示されています。
このロールを利用できるのはApp Service __kumamatsuapp__です。
20_IAM.png

マネージドIDを利用した認証のイメージです。

managed_id.jpg

イメージをデプロイしてアプリをテスト

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を使用していることを表しています。

21_deploy.png

App ServiceのDeploy Centerを見てみましょう。
Web AppがAzure Container Registryの特定のイメージ・タグと紐づいていることがわかります。
22_deploycenter.png

URLにアクセス

ブラウザからデプロイが完了したかどうかを確認してみましょう。
↓↓↓URL
https://kumamatsuapp.azurewebsites.net/

アプリのコードを変更して再デプロイ

index.htmlの変更

ではソースコードを変更して再デプロイしてみます。
docker-django-webapp-linux フォルダーにあるファイルapp/templates/app/index.htmlの中身を変更します。
24_navbar-brand.png

イメージをリビルド

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タグでイメージがプッシュされたことがわかります。

25_version.png

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を見てましょう。タグが置き換わっています。

26_deploy_center.png

Webアプリを再起動

再起動コマンドを実行し、Webアプリを再起動します。

az webapp restart --name kumamatsuapp --resource-group AppSvc-DockerTutorial-rg

ブラウザから確認します。
修正が反映されていることが確認できました。

27_updated_here.png

参考

以下のサイト・動画を参考にさせていただきました。ありがとうございました。

Webサイト

DockerfileのADDとCOPY、CMDとENTRYPOINTの違いを整理
3つの観点から見たコンテナの構造とは?
WindowsでDockerを始める手順
【Microsoft Azure】DockerコンテナをACR経由でAppServiceにデプロイする
Content trust in Docker

ひと目でわかるAzure Active Directory 第3版

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?