Pythonで作成したFunction appをパッケージから実行したい

このエントリは2022/05/30現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容との乖離が発生する可能性があります。

問い合わせ

例の方々とは異なる方々から、以下のような問い合わせが届いた。

現在、Microsoft Sentinelのデータコネクターを使おうとしている。ZipファイルをBlobストレージに配置し、デプロイしたいのだが、エラーが発生してしまい、デプロイに失敗してしまうのでなんとかしたい。確認したいことは、以下の3点。

– 依存関係の更新などが不足しているのだろうか?
– どうすればデプロイできるようになるだろうか?
– リモートビルドでデプロイすることは可能か?

彼らの環境は以下の通り。

  • Linux、Premium SKUを利用
  • Blob storageに対するRBAC構成はManaged Identityを利用

なお、問い合わせ主が利用しようとしているデータコネクターはSalesforce Service Cloudのもの。実体はPythonで作成されたAzure Functionsである。

Salesforce Service Cloud (Preview)
https://docs.microsoft.com/azure/sentinel/data-connectors-reference#salesforce-service-cloud-preview

どこに問題があったのか?

結論から言うと、

  • host.jsonの設定に古い設定(現状の構成には適しない設定)があった

ことが原因。オリジナルのhost.jsonは以下の通り。

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[1.*, 2.0.0)"
  }
}

この中で、13行目のバージョンが古いことが問題だった。Functionsランタイム ver 1.xを範囲に入れているのだが、現在はこの構成は使えないので、ここを

"version": "[2.*, 4.0.0)"

に変更する必要がある)。

また、proxy.jsonが利用可能なのはバージョン1.x ~ 3.xまでで、4.xでは使えないため、この設定に伴い、proxy.jsonは削除することにした(もっともプロキシは使っていないので不要であった)。プロキシについては以下のドキュメントを参照。

Azure Functions プロキシの操作 / Work with Azure Functions Proxies
https://docs.microsoft.com/azure/azure-functions/functions-proxies

依存関係を最新にするには

このデータコネクターのZipファイルを展開すると、以下のような構成になっている。このうち黄色でマークした箇所に依存関係のあるライブラリが格納されている。

このことから、依存関係をすべて黄色でマークしたsite-packagesに格納できればよいので、以下の要領でpip installを実行すればよい。upgradeの場合は --upgrade もしくは -U をお忘れなく。

$ cd <Function appのroot>

// pip installで依存関係を更新
$ pip install -r requirements.txt -t .python_packages/lib/site-packages --upgrade

依存関係を更新した上で再度Zipに固め、アップロードすればOK。

パッケージファイルからの実行

以下のドキュメントに記載の通り、Windowsベース、Linuxベースで、さらにSKUの違いでいろいろ制約がある点に注意が必要。

パッケージから関数を実行できるようにする / Enable functions to run from a package
https://docs.microsoft.com/azure/azure-functions/run-functions-from-deployment-package#enable-functions-to-run-from-a-package

SKUWindowsLinux
ConsumptionWEBSITE_RUN_FROM_PACKAGE = 1 を強く推奨WEBSITE_RUN_FROM_PACKAGE = URL のみ
PremiumWEBSITE_RUN_FROM_PACKAGE = 1 を推奨WEBSITE_RUN_FROM_PACKAGE = 1 を推奨
App ServiceWEBSITE_RUN_FROM_PACKAGE = 1 を推奨WEBSITE_RUN_FROM_PACKAGE = 1 を推奨

リモートビルドをするには

リモートビルドとは、文字通りローカルでビルドするのではなく、Azure Functionsランタイム側でビルドさせるしくみ。App Serviceとの共通テクノロジーなのでApp Serviceでも利用できる。

リモートビルド / Remote build
https://docs.microsoft.com/azure/azure-functions/functions-deployment-technologies#remote-build

基本的にはZipファイルにソースコードを入れて、デプロイするのは変わらないが、以下の設定をAzure Portal > 設定 > 構成 > アプリケーション設定 に入れる必要がある。

ENABLE_ORYX_BUILD=true
SCM_DO_BUILD_DURING_DEPLOYMENT=1

リモートビルド時に依存関係を解決していくので、Zipファイル内には依存関係が入っていなくてもかまわない。

ファイルはAzure CLIもしくはFunction Core Toolsでアップロードする。CLIだとZipファイルをアップロードするが、Function Core Toolsの場合はソースコードをそのままアップロードするように呼び出す(実のところは、内部でZipにした上でアップロードしているので、明示的にZipファイルを指定するか、ファイルのディレクトリを指定するかの違い)。いずれもパッケージデプロイとして取り扱われることには違いがない。

# Azure CLIの場合
$ az functionapp deployment source config-zip \
  -g <Resource Group> \
  -n <Function App> \
  --build-remote true \
  --src <Zipファイル名>

#Function Core Toolsの場合
$ cd <Function appのroot>
$ func azure functionapp publish <FunctionAppName> --python

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中