はじめに
先日からAzure Web AppsにRailsアプリを動かすことをやっています。動かすことは簡単にできたのですが、色々と手作業が多かったのでちょっとでも自動化しようと試してみました。前回はGitHub Actionsを使ってやりましたが、最後のWebAppsへの反映がうまくできなかったので、今回は手を変えてAzure DevOpsを使ってみることにしました。ほら、同じマイクロソフトのプロダクトならいい感じに連携できているのかなと(GitHubもマイクロソフト傘下とか...いやなんでもないです)。
これまでの内容は以下を参照してください。
- Azure Web Appsお勉強メモ(1)Azure Web AppsにてRailsアプリを動かす(2021年6月版) - miyohide's blog
- Azure Web Appsお勉強メモ(2)Azure Web AppsにてデプロイするDockerイメージをGitHub Actionsで作成してAzure Container Registryにpushする - miyohide's blog
- Azure Web Appsお勉強メモ(3)Azure Web AppsにてデプロイするDockerイメージをGitHub Actionsで作成してAzure Container Registryにpushする(2) - miyohide's blog
Azure DevOpsとは
開発に必要な各種ツールをまとめて提供して、かつ無料から使い始めることができるサービスです。GitリポジトリやCI/CD基盤を持っています。詳細は以下を参照。
GitHub Actionsでも同様のことができますが、Azure DevOpsではサービスプリンシパルを明示的に用意する必要がなく、Service Connectionsを画面上で設定しておけば簡単に接続できます。
今回、きっと連携がうまいことできるであろうAzure DevOpsを使ってAzure Container Registoryにイメージをpushし、Azure Web Appsへのデプロイをしてみることにしました。
Docker Imageを作成してAzure Container Registoryにpushする
Azure DevOpsでCI/CDの機能を提供するのはAzure Pipelinesです。これを使うには、リポジトリにazure-pipelines.yml
を記述します。
YAMLファイルを書くのは色々と調べないと大変なのですが、Azure Pipelines内では初回作成時におすすめの構成を提示してくれたりします。
また、オンラインエディターがかなり充実しているので、それを利用するとあまり苦しまなくても実装できました。
今回、実装した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でもできそうですが、思想的にはリリース機能を使った方が良いかなと感じました。
以下のドキュメントにあるように、Azure Container Registryもトリガーにできそうです。
あらかじめデプロイ先のAzure Web Appsを作っておけば、項目をそれぞれ選択すれば設定は終わります。
実際動かしてみると無事デプロイできたみたいです。
Azure Web Apps上のデプロイセンターで確認してもAzure Pipelinesの内容が反映されました(デプロイ後すぐというわけではなく、5分ぐらい時間がかかりました)。
ですが、実際にアプリにアクセスしてみるとアプリが動いていません。
ログを見てみると、やはり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」の値を見ていますが、何も値が設定されていません。
なんじゃそら...と思いつつ、Azure Container Registryの管理者アカウントを有効にして「DOCKER_」の各種値を設定しておきます。
- 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が出ていて現在開発中のようです。
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...