最初に断っておきますが、筆者はアプリ開発者ではありません。クラウドの開発系サービスを評価、検証する必要があるときは、公式(今回はMicrosoft)が用意したサンプルアプリをクイックスタートガイドに従って試してみることはあります。Azure App ServiceにZIPパッケージを使用する方法でコードをデプロイする必要があったのですが、すぐに終わると思ったのに、随分と回り道してしまいました。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Microsoftは「Azure App Service」のコードによるWebアプリのデプロイ環境を、オンプレミスや他社クラウドのKubernetesクラスタ上に実装できる「Azure Arc対応App Service(プレビュー)」(以下、「App Service Kubernetes環境」)を提供しています。
オンプレミスにKubernetesクラスタを導入する方法の一つは、Azure Stack HCIクラスタやWindows Serverに「Azure Kubernetes Service(AKS)」を実装する「AKSハイブリッド」があります。最近、このAKSハイブリッドとApp Service Kubernetes環境をセットアップし、評価、検証する機会がありました。
今回試した「クイックスタートガイド」には、Node.jsの「Hello Worldサンプル」をデプロイする4行のコマンドラインがありました。しかし、これを実行してもアプリ用のKubernetesポッドがクラッシュループを繰り返し、解消するにはワークロード用のKubernetesクラスタを作り直すしかありませんでした。Kubernetesクラスタを削除して、再作成し、再びApp Service Kubernetes環境を準備するのに1時間ほどかかってしまいます。
結論から言うと、ZIPデプロイを利用するには「az webapp deployment」コマンドを実行する前に、Azureポータルまたは「az webapp config」コマンドを使用してアプリのビルド自動化を有効にしておく必要があったのです。しかし、その手順がクイックスタートガイドの一連のコードに含まれていなかったことが、デプロイ失敗の原因でした(画面1)。
App Service Kubernetes環境で何度か失敗を繰り返した後、オリジナルのAzure App Serviceで問題解決に取り組んだ方が効率が良いことに気が付きました。ランタイムとしてNode.jsを選択してLinuxベースのWebアプリを作成し、同じ方法でZIPデプロイを実行したところ、「:( Application Error」になります(画面2)。
リポジトリに「web.config」があるので、このサンプルはWindows Node.js用なのではと疑い(このときは一瞬疑ってしまいましたが、LinuxとWindowsのどちらにも対応しています)、LinuxベースのWebアプリを作成して同じようにZIPデプロイを実行したところ、こちらは「HTTP ERROR 500」のエラーになります(画面3)。
エラー状態だったLinuxベースのWebアプリへの「SSH」接続はできませんでしたが、WindowsベースのWebアプリには「コンソール」接続できたので、そのコンソールのコマンドプロンプトアプリのルートで「node.exe index.js」コマンドを実行してみたところ、「Error: Cannot find module 'express'」のエラーを確認しました(画面4)。
インターネットを検索して解消方法を探し(筆者はNode.jsについては全くの素人です)、「npm install express」「npm install body-parser」「npm install cors」を実行して依存関係のあるモジュールを手動でインストールしていったところ、ようやくWebブラウザの表示に「Hello World!」を目にすることができました。
こんな面倒な操作は本来必要なはずはないので、どうすれば自動的に依存関係のモジュールがインストールされるのかを探していたところ、別のPythonサンプルアプリにZIPデプロイのためのビルド自動化を有効化する方法について書かれていました(az webapp upコマンドの処理の一部として。今回試しているApp Service Kubernetes環境はaz webapp upに対応していない)。
これでようやくデプロイ失敗の原因が判明したわけです。Webアプリに対してビルド自動化を有効化してからZIPデプロイを実行すると、LinuxベースのWebアプリでも、同じくLinuxベースのApp Service Kubernetes環境でも、すんなりコードをデプロイすることができました(画面5)。
ZIPデプロイの自動化は、おそらくZIPデプロイを日常的に行っている人には常識的なことだと思いますが、クイックスタートガイドに従って、意味を考えることなく、コピーしたコマンドラインをそのまま実行する筆者のような人には分かりようがありません。
実は、問題のクイックスタートガイドに記載されたコードのすぐ上にある「ZIPデプロイ」のリンク先(以下の部分)に答えがあったというオチでした。
az webapp config appsettings set --resource-group myResourceGroup --name --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
この点についてMicrosoftにフィードバックしたところ、数日後には英語版ドキュメントで、この追加のコマンドラインが反映されています(画面6)。
岩手県花巻市在住。Microsoft MVP 2008 to 2023(Cloud and Datacenter Management)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『Windows版Docker&Windowsコンテナーテクノロジ入門』(日経BP社)、『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.