Azure Functions v2 の Zip デプロイと Run From Package についての整理です。
今回は、サンプルプロジェクトの作成、Visual Studio から Zip Deploy の実行方法と、Run From Package の基本的な動作についてのメモです。
Azure Function V2 (C#) で Run From Package の CICD と Azure DevOps (1/4) : 今回!!
Azure Function V2 (C#) で Run From Package の CICD と Azure DevOps (2/4)
- Azure Function Core Tools の CLI
- CLI で Blob への Zip デプロイ
- Azure Function V2 (C#) で Run From Package の CICD と Azure DevOps (3/4)
- Azure Repos にソースを Push
- Build Pipeline の作成
- Release Pipeline の作成: Functions のローカルへ zip デプロイ編**
- Azure Function V2 (C#) で Run From Package の CICD と Azure DevOps (4/4)
- Release Pipeline の作成: リモート (Blob) へ zip デプロイ編
書こうと思ってたら数か月が経ってしまった。。。今更ですがメモしておこうという感じ。とある更新を期待したんですが未だないか...
Run From Package とは
パッケージファイル(現状は zip のみ)から実行することで、Functions のコールドスタート時の起動高速化とかその他諸々良いことがあり、現時点ではこれを選択しない理由がない方法です。
より詳しいメリットは公式ドキュメントやアナウンスに書いてます。
Zip デプロイ と Run From Pakcage がキーワードになりますが、「Zip デプロイをすることで、Functions の起動を Run From Package にする」って感じです。
Azure Functions V2 (C#) のサンプルアプリ作成
Run From Package の動作確認用に Http Trigger の Functions を作成します。言語は C# です。
VS2017 を開いて画面中央あたりの「新しいプロジェクトを作成」をクリックします。
左ペインで「Cloud」をクリック >「Azure Functions」を選び、名前とか入力 >「OK」をクリックです。ここでは、Function のプロジェクト名を「FunctionApp25」としました。
「Azure Function v2 (.NET Core)」 で「Http trigger」を選択します。また、Access rights は、今回はサンプルなので「Anonymous」(アクセス制限がない状態)にしてます。
今回の Nuget パッケージの Microsoft.NET.Sdk.Functions のバージョンは、1.0.24 です。
これだけだと色気がなさすぎるので、以下2つのプロジェクトを追加しました。
- .NET Standard2.0のクラスライブラリ「DemoServices」
- xUnit のテストプロジェクト「DemoServices.Tests」
テストコードとかサービスのコードは、とりあえず適当に書いておきましょう。
これで、後ほど Azure DevOps でビルドの Pipeline 作るとき、寂しくないです。
Visual Studio から Zip デプロイ、Run From Package
Zip デプロイは、VS 2017 の GUI からもできます。(どのバージョンからできたか覚えてませんが、最新版に更新すれば大丈夫です。)
Azure CLI でもやれます。Functions は複数のプロジェクトになることが多いので、開発環境向けなら必要な Functions のセットをまとめてCLI でデプロイした方が平和です*1。
Azure 上にまだ Azure Functions のリソースを作っていない状態で、VSからリソースを作成する場合の手順で進んでみます。
VS 2017のソリューションエクスプローラーから Functions のプロジェクト(今回だと「FunctionApp25」)を右クリック > 「発行」をクリックします。
「発行先を選択」ダイアログが表示されます。まず「新規選択」が選択されていることを確認します。
(余談ですが、ここで「既存のものを選択」を選ぶと Azure の既存のリソースを選択する方向に進みます。)
「パッケージファイルから実行する」にチェックを入れ、「プロファイルの作成」をクリックします。
「App Service の作成」ダイアログが表示されます。
新規に作成する FunctionApp のアプリ名を入力します(ここでは「FunctionsApp25」としました)。他は既存のものを選ぶこともできるし、新規に作成することもできます。
入力したら「作成」をクリックします。リソースの作成がはじまります。
ダイアログが閉じて以下の画面に戻ると、Azure に Functions の空っぽのリソースの作成が完了した状態です。デプロイはまだ行われていません。
「発行」をクリックすると、デプロイされます。
初めてのデプロイ時は、こんな画面が表示されます。「はい」を選びましょう。
VS 2017 の出力ウインドウを見てみましょう。デプロイが終わると、「発行が完了しました。」と表示されます。
Azure Portal で動作を確認してみましょう。
Functions の動作確認
Azure Portal で、さきほど VS 2017 から作成したAzure Functions のリソース「FunctionsApp25」を開きます。Function のコードはテンプレートから作成したままちょっとしか変更してないので、ここでは「Function1」があります。クリックしましょう。
右のほうに「テスト」とありますので、開いて動作確認してみましょう。下のように入力して「実行をクリック」すると動作の確認ができます。
Zip デプロイ、Run From Package の動作確認
アプリケーション設定
Run From Package をするには、Azure Functions の「アプリケーション設定」で環境変数の設定が必要です。Visual Studio から Azure Functions のリソースを作成した場合は必要な環境設定してくれますが、Azure Portal や CLI で作成する場合は、自分で設定が必要です。
Azure Portal で Functions のリソースを開き、「アプリケーション設定」をクリックします。
WEBSITE_RUN_FROM_PACKAGE に「1」となっています。
この場合、ホスト先の D:\home\data\SitePackages
に zip ファイルが置かれます。「packagename.txt」というファイルも置かれ、その中でどのファイルを実行するか書かれています。
kudu で確認できます。
zip は D:\home\site\wwwroot
で展開されてアプリが動くってところは今まで通りです。ただし、Run From Package が有効だと D:\home\site\wwwroot
は Readonly になるので、ごねごねするようなことがある場合は考慮が必要です。
Blob から Run From Package
アプリケーション設定で、WEBSITE_RUN_FROM_PACKAGE の値を Blob Storage の url (+ SAS token) にすることで、blob に zip を置き、そこから wwwroot へ展開してパッケージを実行することもできます。これについては次回に続きます。
参考
- Azure Functions の zip プッシュ デプロイ | Microsoft Docs
- Azure Functions をパッケージから実行する | Microsoft Docs
- Run From Package: a new way to deploy your Azure Web Apps and Function Apps · Issue #84 · Azure/app-service-announcements · GitHub
- Announcing zipdeploy integration with Run From Package · Issue #110 · Azure/app-service-announcements · GitHub
*1:Production/Staigngといったガチ環境へは必ず CI/CD パイプラインを構築しましょう。GUIやCLIで手作業するのはこの上ないクソです...と個人的には思っています。