今の Azure Functions は Application Insights が無いとモニタリング周りが成り立たないですが、ARM Template を使うと単独でデプロイされるので同時に Application Insights を作るようにします。
Azure Functions の Consumption Plan で作る場合のサンプルは用意されているので、これをベースに Application Insights のデプロイを追加します。
ARM Template の apiVersion
を新しいバージョンに変更すると作成時にエラーになったりするので、非常に扱いにくい項目です。新しいバージョンを選べないのは謎ですね。
まずは Application Insights を作成してからじゃないと Instrumentation Key が取得できないので、リソースを作成する順番も重要です。実際の定義を順に見ていきます。
Application Insights のリソース定義
作成に必要な項目は名前ぐらいなので、非常にシンプルです。大体は App Service と同じ名前でリソースを用意すると思うので、同名で作るようにしておきます。
{ "type": "Microsoft.Insights/components", "name": "[variables('functionAppName')]", "apiVersion": "2014-04-01", "location": "[resourceGroup().location]", "tags": { "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/sites/', variables('functionAppName'))]": "Resource" }, "properties": { "applicationId": "[variables('functionAppName')]" } }
apiVersion によっては項目が変わっているみたいですが、ひとまず動作したものを紹介しておきます。
Azure Functions のリソース定義
上で作成した Application Insights を使う側になる Azure Functions のリソース定義です。Function Runtime のバージョンは v2 を指定してあるので、必要であれば変更してください。
{ "type": "Microsoft.Web/sites", "name": "[variables('functionAppName')]", "apiVersion": "2016-03-01", "location": "[resourceGroup().location]", "kind": "functionapp", "dependsOn": [ "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]", "[resourceId('Microsoft.Insights/components', variables('functionAppName'))]" ], "properties": { "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", "siteConfig": { "appSettings": [ { "name": "APPINSIGHTS_INSTRUMENTATIONKEY", "value": "[reference(resourceId('Microsoft.Insights/components', variables('functionAppName')), '2015-05-01').InstrumentationKey]" }, { "name": "AzureWebJobsDashboard", "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountId'),'2015-05-01-preview').key1)]" }, { "name": "AzureWebJobsStorage", "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountId'),'2015-05-01-preview').key1)]" }, { "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING", "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountId'),'2015-05-01-preview').key1)]" }, { "name": "WEBSITE_CONTENTSHARE", "value": "[toLower(variables('functionAppName'))]" }, { "name": "FUNCTIONS_EXTENSION_VERSION", "value": "beta" } ], "clientAffinityEnabled": false } } }
重要なポイントは dependsOn
と APPINSIGHTS_INSTRUMENTATIONKEY
の定義です。dependsOn を使って Application Insights が作成されるまで待つようにしつつ、App Service 作成タイミングで Instrumentation Key を参照するように書きます。
実際に作成した ARM Template は以下で全体を公開しています。
Azure Portal の Template Deployment へのリンクを貼れば、あっという間に必要なリソースを作成できるボタンが完成するので非常に楽です。
Run-From-Zip を組み合わせるとデプロイも簡単なので最高です。