Azure Web Appsお勉強メモ(4)Azure Web AppsにてデプロイするDockerイメージをAzure DevOpsで生成してAzure Container Registryに登録する

はじめに

先日からAzure Web AppsにRailsアプリを動かすことをやっています。動かすことは簡単にできたのですが、色々と手作業が多かったのでちょっとでも自動化しようと試してみました。前回はGitHub Actionsを使ってやりましたが、最後のWebAppsへの反映がうまくできなかったので、今回は手を変えてAzure DevOpsを使ってみることにしました。ほら、同じマイクロソフトのプロダクトならいい感じに連携できているのかなと(GitHubマイクロソフト傘下とか...いやなんでもないです)。

これまでの内容は以下を参照してください。

Azure DevOpsとは

開発に必要な各種ツールをまとめて提供して、かつ無料から使い始めることができるサービスです。GitリポジトリやCI/CD基盤を持っています。詳細は以下を参照。

azure.microsoft.com

GitHub Actionsでも同様のことができますが、Azure DevOpsではサービスプリンシパルを明示的に用意する必要がなく、Service Connectionsを画面上で設定しておけば簡単に接続できます。

docs.microsoft.com

今回、きっと連携がうまいことできるであろうAzure DevOpsを使ってAzure Container Registoryにイメージをpushし、Azure Web Appsへのデプロイをしてみることにしました。

Docker Imageを作成してAzure Container Registoryにpushする

Azure DevOpsでCI/CDの機能を提供するのはAzure Pipelinesです。これを使うには、リポジトリazure-pipelines.ymlを記述します。

docs.microsoft.com

YAMLファイルを書くのは色々と調べないと大変なのですが、Azure Pipelines内では初回作成時におすすめの構成を提示してくれたりします。

f:id:miyohide:20210711181212p:plain

また、オンラインエディターがかなり充実しているので、それを利用するとあまり苦しまなくても実装できました。

docs.microsoft.com

今回、実装したazure-pipelines.ymlは以下の通り。

trigger:
- master

pool:
  vmImage: ubuntu-latest

steps:
- task: Gradle@2
  inputs:
    workingDirectory: ''
    gradleWrapperFile: 'gradlew'
    gradleOptions: '-Xmx3072m'
    javaHomeOption: 'JDKVersion'
    jdkVersionOption: '11'
    jdkArchitectureOption: 'x64'
    publishJUnitResults: true
    testResultsFiles: '**/TEST-*.xml'
    tasks: 'bootBuildImage'  # Spring BootでのDockerイメージ作成コマンド

- task: Docker@2
  inputs:
    containerRegistry: 'acr'    # service connectionの設定名
    repository: 'webapp'  # イメージ名
    command: 'push'
    tags: 'latest'

ここでは、Azure Web Appsへのデプロイは行いません。

Azure Web Appsへデプロイをする

できたDockerイメージをAzure Web Appsへデプロイするには、Azure Pipelinesのリリース機能を使います。Azure Pipelinesでもできそうですが、思想的にはリリース機能を使った方が良いかなと感じました。

docs.microsoft.com

以下のドキュメントにあるように、Azure Container Registryもトリガーにできそうです。

docs.microsoft.com

あらかじめデプロイ先のAzure Web Appsを作っておけば、項目をそれぞれ選択すれば設定は終わります。

f:id:miyohide:20210711183142j:plain

実際動かしてみると無事デプロイできたみたいです。

f:id:miyohide:20210711183246p:plain

Azure Web Apps上のデプロイセンターで確認してもAzure Pipelinesの内容が反映されました(デプロイ後すぐというわけではなく、5分ぐらい時間がかかりました)。

f:id:miyohide:20210711184943p:plain

ですが、実際にアプリにアクセスしてみるとアプリが動いていません。

f:id:miyohide:20210704164525p:plain

ログを見てみると、やはりDockerイメージの取得に失敗しているみたいです。

2021-07-11T08:12:25.960Z ERROR - DockerApiException: Docker API responded with status code=InternalServerError, response={"message":"Get xxxxxxxxxxxxxxxxxxxxx: unauthorized: authentication required, visit https://aka.ms/acr/authorization for more information."}
2021-07-11T08:12:25.963Z ERROR - Image pull failed: Verify docker image configuration and credentials (if using private repository)
2021-07-11T08:12:25.965Z INFO  - Stopping site miyoshisbapp because it failed during startup.
2021-07-11T08:15:46.854Z INFO  - Pulling image from Docker hub: miyohideacr.azurecr.io/webapp:latest

う〜んなんでだろう。

環境変数が設定されていない

色々と原因を探していたときに、ふと「アプリケーション設定」の「DOCKER_」で始まる環境変数の値を見てみると、適切な値が設定されていないことがわかりました。下図は「DOCKER_REGISTRY_SERVER_USERNAME」の値を見ていますが、何も値が設定されていません。

f:id:miyohide:20210711183820p:plain

なんじゃそら...と思いつつ、Azure Container Registryの管理者アカウントを有効にして「DOCKER_」の各種値を設定しておきます。

docs.microsoft.com

  • DOCKER_CUSTOM_IMAGE_NAME → デプロイしたいDockerイメージ名
  • DOCKER_REGISTRY_SERVER_PASSWORD → Azure Docker Registryの管理者アカウントのパスワード(どちらでもOK)
  • DOCKER_REGISTRY_SERVER_URL → https://名前.azurecr.io
  • DOCKER_REGISTRY_SERVER_USERNAME → Azure Docker Registryの管理者名

これを設定して、リロードするとアプリが動くことが確認できました。

再度Azure DevOpsで再度デプロイしても上記の環境変数が上書きされることはありませんでした。

ちなみに

Azure Web Apps for ContainerにてAzure Container Registryを参照する際、Admin権限が必要な状況については、以下のFeedbackが出ていて現在開発中のようです。

started
We welcome user feedback and feature requests!
  • 108 votes
  • 13 comments

Web App for Containers - ACR access requires admin account enabled on repository

It looks as though Web App for Containers requires the use of the admin account on the repository in ACR.

The notes on use of the admin account suggest to use that account only for testing purposes and describe some of the downsides to having it enabled.

Is there a plan to support Serv...

feedback.azure.com