このエントリは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
SKU | Windows | Linux |
---|---|---|
Consumption | WEBSITE_RUN_FROM_PACKAGE = 1 を強く推奨 | WEBSITE_RUN_FROM_PACKAGE = URL のみ |
Premium | WEBSITE_RUN_FROM_PACKAGE = 1 を推奨 | WEBSITE_RUN_FROM_PACKAGE = 1 を推奨 |
App Service | WEBSITE_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