🌀

Azure App Serviceでデプロイスロットに自動デプロイする設定の備忘録

2022/04/19に公開

前提

ソースコード管理:Github
Azureのサービス:Azure App Service
アプリケーションのDockerファイルがある(必須ではないですが、Azure Container RegistryにDocker imageを置く前提で書いてあります)

Azure App Serviceのデプロイスロット

デプロイスロットという機能が便利で、これを使うと構築済のApp Serviceのステージング環境を簡単に用意することが出来ます。
また、スロットに反映した環境を本番運用中の環境とスワップすることも可能です。
ステージングで検証が終わったら、スワップするだけで本番リリースが完了し、何か問題があった場合は再度スワップすれば元に戻すことが出来ます。
詳しくは公式ドキュメントをご確認ください。
https://docs.microsoft.com/ja-jp/azure/app-service/deploy-staging-slots

これを使う上で詰まったこと(主にGithub連携時のSecretsはAzureの管理画面のどこにあるのか)を整理して記載します。

GitHub Actionsのワークフローファイル

App Serviceの初期設定でdeployにContainer Registryのimageを使うようにすれば、自動でワークフローファイルが生成されます。
別のdeploy設定をしていた場合はApp Serviceの「デプロイセンター」の「設定」タブで既存の設定を変更できます。
(必ずしもApp Service側でdeploy設定をいれなくても、以下のワークフローファイルを基にGithub Actionsを組めば問題ないですが、App Service側で設定すると動く大枠を作ってくれるので楽です)

例えば、mainブランチをdeployするワークフローファイルは以下のようになります。
書き方はAzure公式ドキュメントにも載っています。
実際には、build & deployの前に自動テストのステップが入ることも多いと思います。
IMAGE_REGISTRY_LOGIN_SERVERの部分はApp Serviceからの自動生成時にはべた書きされていますがSecretsに設定しました。

name: Build and deploy container app to Azure Web App

on:
  push:
    branches:
      - "main"

jobs:
  build:
    runs-on: 'ubuntu-latest'

    steps:
    - uses: actions/checkout@v2

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v1

    - name: Log in to registry
      uses: docker/login-action@v1
      with:
        registry: https://${{ secrets.IMAGE_REGISTRY_LOGIN_SERVER }}/
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}

    - name: Build and push container image to registry
      uses: docker/build-push-action@v2
      with:
        push: true
        tags: ${{ secrets.IMAGE_REGISTRY_LOGIN_SERVER }}/repository-name:${{ github.sha }}
        file: ./Dockerfile

  deploy:
    runs-on: ubuntu-latest
    needs: build
    environment:
      name: 'production'
      url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}

    steps:
    - name: Deploy to Azure Web App
      id: deploy-to-webapp
      uses: azure/webapps-deploy@v2
      with:
        app-name: 'your-app-name'
        slot-name: 'production'
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        images: ${{ secrets.IMAGE_REGISTRY_LOGIN_SERVER }}/repository-name:${{ github.sha }}

必要なSecretsとそれを確認できる画面

GitHubの「Setting」ページのSecurity.Secrets.Actionsで設定する値です。
上述したワークフローファイルに現れるSecretsは以下の4つです(4つの名前は自分で決めた名前で、App Serviceから自動生成された場合は「AZUREAPPSERVICE_CONTAINERPASSWORD_ランダムな英数字」等がSecretsに作られます)。

  • IMAGE_REGISTRY_LOGIN_SERVER
  • REGISTRY_USERNAME
  • REGISTRY_PASSWORD
  • AZURE_WEBAPP_PUBLISH_PROFILE

Container Registry用のSecrets

以下の3つがContainer Registryの管理画面で確認できます。

  • IMAGE_REGISTRY_LOGIN_SERVER
  • REGISTRY_USERNAME
  • REGISTRY_PASSWORD

下の2つはContainer Registryの設定.アクセスキーで「管理者ユーザー」が有効になっていると生成されます。

順に、ログインサーバー、管理者ユーザー、パスワード(2つのいずれでも可)が対応します。

App Service用のSecrets

残りのAZURE_WEBAPP_PUBLISH_PROFILEはApp Service側で取得できます。
App Serviceの管理画面の概要、またはデプロイセンターの上部「発行プロファイルの管理」からダウンロード出来ます。

デプロイスロット側にdeployされるようにしたい

先ほどのワークフローファイルではそのままproductionの環境にdeployされます。
デプロイスロットを用意して、Github Actionsのdeploy先はスロット側にしたいです。

デプロイスロットの追加

App Service管理画面のデプロイメント.デプロイスロットからスロットの追加をするだけで使う事が出来ます。既に運用中のものを「設定を複製」で選択すると、同じアプリケーションが複製されます。

元のApp Service名に「-slotname」が足されたURLでアクセス出来ます。

Secrets、ワークフローファイルの変更

デプロイスロットの画面で作成したスロット名をクリックすると、App Service (スロット)
を表示できます。

ここからデプロイセンターを確認すると、複製元で設定したContainer Registryからイメージをプルするような設定になっています。
これを変更してGitHub Actionsを再設定しても良いのですが、ワークフローファイルを増やす必要は無いので、前の工程で生成されているワークフローファイルを変更したいです。
この時注意が必要(自分がハマった)なのが、Secretsで設定したAZURE_WEBAPP_PUBLISH_PROFILEは運用中のものと新しく作ったスロットのもので別になります。
App Service (スロット)の概要、またはデプロイセンターの発行プロファイルの管理からダウンロードして設定しましょう。

ワークフローファイルについてはdeployのステップのslot-nameの箇所にデプロイスロットの追加時に付けたスロット名を入れればOKです。

最後に

Azureのサービスは初期設定はドキュメントの通りにポチポチやっていると簡単に出来るのですが、設定を後から変えようとすると詰まる事が多いです。
(私のインフラの経験が不足しているだけな気がします。)
大した内容ではありませんが、デプロイスロット追加時に管理画面のどこに行けば必要な情報が載っているのか、探すのに一苦労したので自分の備忘録として記事にしました。
もしお役に立つ方がいたら幸いです。

Discussion