BEACHSIDE BLOG

MicrosoftとかC#を好むレンジャーの個人メモ

Azure Function V2 (C#) で Run From Package の CICD on Azure DevOps (1/4)

Azure Functions v2 の Zip デプロイと Run From Package についての整理です。
今回は、サンプルプロジェクトの作成、Visual Studio から Zip Deploy の実行方法と、Run From Package の基本的な動作についてのメモです。

書こうと思ってたら数か月が経ってしまった。。。今更ですがメモしておこうという感じ。とある更新を期待したんですが未だないか...

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 を開いて画面中央あたりの「新しいプロジェクトを作成」をクリックします。

f:id:beachside:20181214155429p:plain


左ペインで「Cloud」をクリック >「Azure Functions」を選び、名前とか入力 >「OK」をクリックです。ここでは、Function のプロジェクト名を「FunctionApp25」としました。

f:id:beachside:20181214160316p:plain


「Azure Function v2 (.NET Core)」 で「Http trigger」を選択します。また、Access rights は、今回はサンプルなので「Anonymous」(アクセス制限がない状態)にしてます。

f:id:beachside:20181214160511p:plain


今回の Nuget パッケージの Microsoft.NET.Sdk.Functions のバージョンは、1.0.24 です。

これだけだと色気がなさすぎるので、以下2つのプロジェクトを追加しました。

  • .NET Standard2.0のクラスライブラリ「DemoServices」
  • xUnit のテストプロジェクト「DemoServices.Tests」

f:id:beachside:20181214162511p:plain


テストコードとかサービスのコードは、とりあえず適当に書いておきましょう。

これで、後ほど 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」)を右クリック > 「発行」をクリックします。

f:id:beachside:20181214170813p:plain


「発行先を選択」ダイアログが表示されます。まず「新規選択」が選択されていることを確認します。
(余談ですが、ここで「既存のものを選択」を選ぶと Azure の既存のリソースを選択する方向に進みます。)

「パッケージファイルから実行する」にチェックを入れ、「プロファイルの作成」をクリックします。

f:id:beachside:20181214171819p:plain


「App Service の作成」ダイアログが表示されます。
新規に作成する FunctionApp のアプリ名を入力します(ここでは「FunctionsApp25」としました)。他は既存のものを選ぶこともできるし、新規に作成することもできます。
入力したら「作成」をクリックします。リソースの作成がはじまります。

f:id:beachside:20181214173219p:plain


ダイアログが閉じて以下の画面に戻ると、Azure に Functions の空っぽのリソースの作成が完了した状態です。デプロイはまだ行われていません。
「発行」をクリックすると、デプロイされます。

f:id:beachside:20181214174104p:plain

初めてのデプロイ時は、こんな画面が表示されます。「はい」を選びましょう。

f:id:beachside:20181214174239p:plain


VS 2017 の出力ウインドウを見てみましょう。デプロイが終わると、「発行が完了しました。」と表示されます。

f:id:beachside:20181214174540p:plain


Azure Portal で動作を確認してみましょう。

Functions の動作確認

Azure Portal で、さきほど VS 2017 から作成したAzure Functions のリソース「FunctionsApp25」を開きます。Function のコードはテンプレートから作成したままちょっとしか変更してないので、ここでは「Function1」があります。クリックしましょう。

f:id:beachside:20181214180918p:plain


右のほうに「テスト」とありますので、開いて動作確認してみましょう。下のように入力して「実行をクリック」すると動作の確認ができます。

f:id:beachside:20181214181236p:plain


Zip デプロイ、Run From Package の動作確認

アプリケーション設定

Run From Package をするには、Azure Functions の「アプリケーション設定」で環境変数の設定が必要です。Visual Studio から Azure Functions のリソースを作成した場合は必要な環境設定してくれますが、Azure Portal や CLI で作成する場合は、自分で設定が必要です。

Azure Portal で Functions のリソースを開き、「アプリケーション設定」をクリックします。

f:id:beachside:20181216231150p:plain


WEBSITE_RUN_FROM_PACKAGE に「1」となっています。

f:id:beachside:20181216232000p:plain

この場合、ホスト先の D:\home\data\SitePackages に zip ファイルが置かれます。「packagename.txt」というファイルも置かれ、その中でどのファイルを実行するか書かれています。

kudu で確認できます。

f:id:beachside:20181216232022p:plain

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 へ展開してパッケージを実行することもできます。これについては次回に続きます。

beachside.hatenablog.com



参考

*1:Production/Staigngといったガチ環境へは必ず CI/CD パイプラインを構築しましょう。GUIやCLIで手作業するのはこの上ないクソです...と個人的には思っています。