はじめに
先日から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"
}
得られた結果からappId
とpassword
を使うことになります。
前回では、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にログインするためのユーザー名とパスワードを指定する必要があります。これらの値は先ほど作成したサービスプリンシパルのappId
とpassword
が該当するのですが、それをそのまま入力すると第三者による悪用が起こるので、それはできません。そこで上記で使っているのがsecrets.REGISTRY_USERNAME
やsecrets.REGISTRY_PASSWORD
です。これはGitHub Actionsで用意されている「暗号化されたシークレット」という機能です。詳細は、以下を参照してください。
docs.github.com
これを使うと、安全にappId
とpassword
をGitHub Actionsに渡すことができます。
GitHub Actionsはログも出力されるのですが、以下の画面のように該当部分が***
でマスク化されています。
あとは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されていることが確認できました。
Azure Container RegistryからAzure Web Appsへのデプロイを試みる
ここまでできたので、あとはAzure Web Appsへのデプロイをやってみようと思います。しかしながらAzure Web Appsの作成でDockerイメージを選択するときに以下の画面のようになり作成できませんでした。
よくよくエラーメッセージを読むと、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はうまく動いてくれたのですが、実際のアプリがうまく動いてくれず...
デプロイメントセンターにあるログを見てみましたが、どうもDockerイメージをうまくpullできないようです。う〜ん...
というわけで今日はここで時間切れ。残念...