Azure Web Appsお勉強メモ(3)Azure Web AppsにてデプロイするDockerイメージをGitHub Actionsで作成してAzure Container Registryにpushする(2)

はじめに

先日からAzure Web AppsにRailsアプリを動かすことをやっています。動かすことは簡単にできたのですが、色々と手作業が多かったのでちょっとでも自動化しようと試してみました。前回は結局Azure Container Registryへのpushについては手作業で実施してしまったのですが、今日はそこも自動化します。

先週の内容は以下を参照してください。

サービスプリンシパルとは?

そもそもサービスプリンシパルがあまりよく分かっていなかったので復習から。以下のQiitaの記事(「Azure AD のサービスプリンシパルを 3 つのユースケースから眺めてみた」)を参考にしました。

qiita.com

完璧に理解したとは言えませんが、少なくとも前回でやろうとしていた以下の記事の内容は理解することができました。

docs.microsoft.com

併せてaz ad sp create-for-rbacのコマンドのマニュアルにも目を通しておきます。

docs.microsoft.com

ものすごく簡単に書くと以下のことをやることが目的。

  • Azure Container Registryにpushできる仮想的なユーザをaz ad sp create-for-rbacで作成する
  • 作成する仮想的なユーザができることはできるだけ絞り込みたいので、scopeにAzure Container Registryのidを指定しておく
  • また、同じ理由でroleもpushしかできないようにしておく

実際にaz ad sp create-for-rbacを実行すると以下の結果が得られました。

Creating 'acrpush' role assignment under scope 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
The output includes credentials that you must protect. Be sure that you do not include these credentials in your code or check the credentials into your source control. For more information, see https://aka.ms/azadsp-cli
'name' property in the output is deprecated and will be removed in the future. Use 'appId' instead.
{
  "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx",
  "displayName": "acrsp",
  "name": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx",
  "password": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
  "tenant": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
}

得られた結果からappIdpasswordを使うことになります。

GitHub Actionsでの実装

前回では、tagをつけたらDockerイメージをGitHub Actionsで作成することを実装しました。今回は作成したDockerイメージをAzure Container RegistryにGitHub Actionsでpushします。

まずは、ログインです。以下のように実装しました。

# 省略
    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: miyohidecontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
# 省略

ここでAzure Container Registryにログインするためのユーザー名とパスワードを指定する必要があります。これらの値は先ほど作成したサービスプリンシパルappIdpasswordが該当するのですが、それをそのまま入力すると第三者による悪用が起こるので、それはできません。そこで上記で使っているのがsecrets.REGISTRY_USERNAMEsecrets.REGISTRY_PASSWORDです。これはGitHub Actionsで用意されている「暗号化されたシークレット」という機能です。詳細は、以下を参照してください。

docs.github.com

これを使うと、安全にappIdpasswordGitHub Actionsに渡すことができます。

GitHub Actionsはログも出力されるのですが、以下の画面のように該当部分が***でマスク化されています。

f:id:miyohide:20210704163345j:plain

あとはdocker pushするだけ。以下のように実装しました。

# 省略
    - name: create Docker Image
      run: |
        IMAGE_TAG=$(echo ${{ github.ref }} | sed -e 's/refs\/tags\///')
        docker build -f Dockerfile.prd -t miyohidecontainer.azurecr.io/runlog:$IMAGE_TAG .
        docker push miyohidecontainer.azurecr.io/runlog:$IMAGE_TAG

実行

あとはGitHub Actionsを起動します。適当なタグをつけてgit pushし、しばらく待つとAzure Container Registryにpushされていることが確認できました。

f:id:miyohide:20210704163538j:plain

Azure Container RegistryからAzure Web Appsへのデプロイを試みる

ここまでできたので、あとはAzure Web Appsへのデプロイをやってみようと思います。しかしながらAzure Web Appsの作成でDockerイメージを選択するときに以下の画面のようになり作成できませんでした。

f:id:miyohide:20210704163730j:plain

よくよくエラーメッセージを読むと、adminを有効にしないとダメっぽいです...。ここまでadminを有効化しないで頑張ってきたのに...

GitHub Actionsからのデプロイを試みる

というわけで、当初参考にした下記ドキュメントにある通り、GitHub Actionsで実行してみたいと思います。

docs.microsoft.com

適当にDockerアプリを作成したのち、GitHub Actionsで以下の処理を末尾に追加し、ドキュメントにあるようにAZURE_WEBAPP_PUBLISH_PROFILEも設定しておきます。

    - uses: azure/webapps-deploy@v2
      with:
        app-name: 'miyohiderailsapp'
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        images: miyohidecontainer.azurecr.io/runlog:$IMAGE_TAG

これで適当なタグをつけてgit pushすると、GitHub Actionsはうまく動いてくれたのですが、実際のアプリがうまく動いてくれず...

f:id:miyohide:20210704164525p:plain

デプロイメントセンターにあるログを見てみましたが、どうもDockerイメージをうまくpullできないようです。う〜ん...

f:id:miyohide:20210704164617p:plain

というわけで今日はここで時間切れ。残念...