しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Functions と Application Insights を同時に ARM Template でデプロイする

今の 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
    }
  }
}

重要なポイントは dependsOnAPPINSIGHTS_INSTRUMENTATIONKEY の定義です。dependsOn を使って Application Insights が作成されるまで待つようにしつつ、App Service 作成タイミングで Instrumentation Key を参照するように書きます。

実際に作成した ARM Template は以下で全体を公開しています。

Azure Portal の Template Deployment へのリンクを貼れば、あっという間に必要なリソースを作成できるボタンが完成するので非常に楽です。

Run-From-Zip を組み合わせるとデプロイも簡単なので最高です。