Azure App ServiceでZIPデプロイのクイックスタートを決め、数日かけてやっと完走 “Hello World!”見るために山市良のうぃんどうず日記(253)

最初に断っておきますが、筆者はアプリ開発者ではありません。クラウドの開発系サービスを評価、検証する必要があるときは、公式(今回はMicrosoft)が用意したサンプルアプリをクイックスタートガイドに従って試してみることはあります。Azure App ServiceにZIPパッケージを使用する方法でコードをデプロイする必要があったのですが、すぐに終わると思ったのに、随分と回り道してしまいました。

» 2023年03月22日 05時00分 公開
[山市良テクニカルライター]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「山市良のうぃんどうず日記」のインデックス

山市良のうぃんどうず日記

クイックスタートガイドに不備あり?

 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)。

画面1 画面1 もともとのドキュメントのコード。この通りに実行してもコードのデプロイはエラーが表示されることなく失敗する。重要な情報はすぐ上の「ZIPデプロイ」のリンク先にあった

エラーの原因を見つけるまでの長い回り道

 App Service Kubernetes環境で何度か失敗を繰り返した後、オリジナルのAzure App Serviceで問題解決に取り組んだ方が効率が良いことに気が付きました。ランタイムとしてNode.jsを選択してLinuxベースのWebアプリを作成し、同じ方法でZIPデプロイを実行したところ、「:( Application Error」になります(画面2)。

画面2 画面2 LinuxベースのNode.jsランタイムにデプロイすると「:( Application Error」のエラー

 リポジトリに「web.config」があるので、このサンプルはWindows Node.js用なのではと疑い(このときは一瞬疑ってしまいましたが、LinuxとWindowsのどちらにも対応しています)、LinuxベースのWebアプリを作成して同じようにZIPデプロイを実行したところ、こちらは「HTTP ERROR 500」のエラーになります(画面3)。

画面3 画面3 WindowsベースのNode.jsランタイムにデプロイすると「HTTP ERROR 500」のエラー

 エラー状態だったLinuxベースのWebアプリへの「SSH」接続はできませんでしたが、WindowsベースのWebアプリには「コンソール」接続できたので、そのコンソールのコマンドプロンプトアプリのルートで「node.exe index.js」コマンドを実行してみたところ、「Error: Cannot find module 'express'」のエラーを確認しました(画面4)。

画面4 画面4 コンソール接続して「node.exe index.js」を実行すると、必要なモジュールが見つからないというエラーが。本来であれば、「package.json」にある依存関係の定義に従ってデプロイ時にインストールされるはず

 インターネットを検索して解消方法を探し(筆者はNode.jsについては全くの素人です)、「npm install express」「npm install body-parser」「npm install cors」を実行して依存関係のあるモジュールを手動でインストールしていったところ、ようやくWebブラウザの表示に「Hello World!」を目にすることができました。

必要だったのはZIPデプロイのための「ビルド自動化の有効化」

 こんな面倒な操作は本来必要なはずはないので、どうすれば自動的に依存関係のモジュールがインストールされるのかを探していたところ、別のPythonサンプルアプリにZIPデプロイのためのビルド自動化を有効化する方法について書かれていました(az webapp upコマンドの処理の一部として。今回試しているApp Service Kubernetes環境はaz webapp upに対応していない)。

 これでようやくデプロイ失敗の原因が判明したわけです。Webアプリに対してビルド自動化を有効化してからZIPデプロイを実行すると、LinuxベースのWebアプリでも、同じくLinuxベースのApp Service Kubernetes環境でも、すんなりコードをデプロイすることができました(画面5)。

画面5 画面5 「az web config appsettings」コマンドでビルド自動化を有効にしてからデプロイすると、サンプルのデプロイはすんなり成功

 ZIPデプロイの自動化は、おそらくZIPデプロイを日常的に行っている人には常識的なことだと思いますが、クイックスタートガイドに従って、意味を考えることなく、コピーしたコマンドラインをそのまま実行する筆者のような人には分かりようがありません。

 実は、問題のクイックスタートガイドに記載されたコードのすぐ上にある「ZIPデプロイ」のリンク先(以下の部分)に答えがあったというオチでした。

az webapp config appsettings set --resource-group myResourceGroup --name --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true


 この点についてMicrosoftにフィードバックしたところ、数日後には英語版ドキュメントで、この追加のコマンドラインが反映されています(画面6)。

画面6 画面6 筆者のフィードバックが反映され、現在の英語版ドキュメントには1行コードが追加された

筆者紹介

山市 良(やまいち りょう)

岩手県花巻市在住。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.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。