Azure App Service中の動作について

はじめに

App Service(Web Apps)を使っていて、イマイチWebに情報が少なかったので、サポートに教えてもらった内容や自分で調べた内部の挙動をここにまとめておきます。公式の内容でないものも含むため、仕様が変わることもありますし、間違った内容もあるかもしれませんので、自己責任でお願いできればと思います。
なお、ランタイムはPHP7.4(Linux)になり、他のランタイムとは違う可能性があります。また、気づいた点があれば記事は更新したいと思います。

ローカルGitによるデプロイ

私は、デプロイはローカルGitによるものを使用しておりましたが、GitHubやAzure Reposも似た挙動をするものと推察されます。
git pushをしてデプロイするときは以下のような動作をします。

1. git push(クライアント)
2. リポジトリの.git/hooks/post-receiveを実行
3. KUDUと呼ばれるデプロイ処理が実行(GitHubのOryxをインストール等)
4. git cloneで/tmpにpushした内容を配置
5. アプリケーション設定で指定したPRE_BUILD_COMMANDを実行
6. php composer.phar installを実行
7. アプリケーション設定で指定したPOST_BUILD_COMMANDを実行
8. ドキュメントルートの/home/site/wwwrootに資源を配置

2のリポジトリはApp Serviceにログインし、/home/site/repositoryにあります。
5~7については公式サイトをご確認ください。私はLaravelを使っており、php artisanコマンドでキャッシュクリアなどをこのデプロイ処理中に実行したかったので、BUILD_COMMANDで実行したのですが、/tmpに置かれた資源の中のキャッシュがクリアされ、ドキュメントルートのキャッシュはクリアできませんでした。「rm /home/site/wwwroot/~」のような処理を記載すればキャッシュクリアはできました。
8のドキュメントルートはApp Service間で共有されているため、複数台で冗長化している場合、1台に更新した内容は複数に反映されます。例えば、SSHでログインしてファイルを修正したりすると、全台に反映されることになります。
8ですが、一度/tmpに置いたファイルを上書きでおいているだけのようで、gitで削除したファイルも残り続けてしまうようです(何かのタイミングで再作成されれば消えると想像できますが)。そのため、明示的に削除するにはSSHでログインするかPRE_BUILD_COMMAND/POST_BUILD_COMMANDで削除するなどする必要があります・・・。

使ってみての感想

Azureを使ったのは初めてで、PaaSだからという面もあるとは思いますが、痒い所に手が届かないことが多く、また、利用者のTipsのようなドキュメントも比較的少ないため苦慮することが多かったです。あと、課金の仕組みがAWSと違うところもあり思いがけないお金を払ってしまいました。
ちゃんと勉強しないといけないですね、、、

この記事が気に入ったらサポートをしてみませんか?