Azure Resource Manager - 基本＋Functionsのデプロイ

# 概要

[クイック スタート](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-first-function-resource-manager?tabs=visual-studio-code%2Cazure-cli)を参考にARMテンプレートを使用して、`Azure Functions`をリソースグループにデプロイする

# 前提

- デプロイ先のリソースグループの作成
- VSCode拡張機能`Azure Resource Manager (ARM) Tools`のインストール


`Azure Resource Manager (ARM) Tools`でARM テンプレートのひな型作成、値の検証、入力候補表示等が可能（[参考](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/quickstart-create-templates-use-visual-studio-code?tabs=CLI#create-an-arm-template)）

![image-20211125112244786.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/64fdfa7d-7e58-96b3-9f9a-c0b5f1d24f6a.png)


# 作成対象リソース

`Azure Portal`から`Azure Functions`を作成した場合、以下画像のように
`Azure Functions`以外に、ストレージアカウント、プラン、Application Insightsが含まれる
そのため、ARMテンプレートに、これら4つのリソースを定義する

![image-20211125114328412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/2806bc0f-73e7-eed7-66f5-5adde25099c6.png)


# 進め方

[クイック スタート](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-first-function-resource-manager?tabs=visual-studio-code%2Cazure-cli#review-the-template)に[サンプル](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-first-function-resource-manager?tabs=visual-studio-code%2Cazure-cli#review-the-template)があるが、バージョン等が古い場合があるため、以下のような手順でARMテンプレートを作成していく
以下ストレージアカウントの場合

## 1. 拡張機能でひな型を生成する

以下画像のように`resources`以下で`sto`等を入力すると候補が出てくるので`Enter`でひな型が生成される

![image-20211125130946155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/9ff735ca-1d30-39df-1953-352bac5e6b18.png)

以下自動生成されたひな形

![image-20211125132249312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/9de94bb9-a5ba-27e1-2243-379558f9adc7.png)




## 2. サンプルを参考にする

`Azure Functions`のARM テンプレートからリソースを生成するクイック スタートにある[サンプル](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-first-function-resource-manager?tabs=visual-studio-code%2Cazure-cli#review-the-template)を参考にする



## 3. テンプレートエクスポートを参考にする

`Azure Portal`から`Azure Functions`と共に生成されたストレージアカウントのテンプレートのエクスポートで出力されたARMテンプレートを参考にする
※ 必須パラメータ以外も出力されるので必要な値のみ参照する
※ `Azure Functions`のテンプレートエクスポートでは環境変数が含まれていない等、必要なプロパティが全て含まれているたけではない

![image-20211125141958493.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/f92bb4ca-849e-e898-f851-e10ffe270769.png)




## 4. ARMテンプレートのドキュメントから調べる

ARMテンプレートのドキュメントでプロパティの値を調べるなどして適切な設定を行う
リソースタイプ`Microsoft.Storage/storageAccounts`のドキュメント：https://docs.microsoft.com/en-us/azure/templates/microsoft.storage/storageaccounts?tabs=bicep

# テンプレート

```json
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "storageAccountType": {
      "type": "string",
      "defaultValue": "Standard_LRS"
    },
    "functions_name": {
      "type": "String",
      "defaultValue": "arm-test-functions"
    }
  },
  "functions": [],
  "variables": {
    "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'azfunctions')]",
    "hostingPlanName": "[parameters('functions_name')]",
    "applicationInsightsName": "[parameters('functions_name')]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-04-01",
      "kind": "Storage",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      }
    },
    {
      "type": "Microsoft.Web/serverfarms",
      "apiVersion": "2020-12-01",
      "name": "[variables('hostingPlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Y1",
        "tier": "Dynamic"
      },
      "properties": {
        "name": "[variables('hostingPlanName')]"
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2020-12-01",
      "kind": "functionapp",
      "name": "[parameters('functions_name')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ],
      "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "siteConfig": {
          "appSettings": [
            {
              "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
              "value": "[reference(resourceId('microsoft.insights/components', variables('applicationInsightsName')), '2020-02-02-preview').InstrumentationKey]"
            },
            {
              "name": "AzureWebJobsDashboard",
              "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';EndpointSuffix=', environment().suffixes.storage, ';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value)]"
            },
            {
              "name": "AzureWebJobsStorage",
              "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';EndpointSuffix=', environment().suffixes.storage, ';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value)]"
            },
            {
              "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
              "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';EndpointSuffix=', environment().suffixes.storage, ';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value)]"
            },
            {
              "name": "FUNCTIONS_EXTENSION_VERSION",
              "value": "~4"
            },
            {
              "name": "FUNCTIONS_WORKER_RUNTIME",
              "value": "node"
            },
            {
              "name": "WEBSITE_CONTENTSHARE",
              "value": "[toLower('functionName')]"
            },
            {
              "name": "WEBSITE_NODE_DEFAULT_VERSION",
              "value": "~14"
            }
          ]
        }
      }
    },
    {
      "type": "microsoft.insights/components",
      "apiVersion": "2020-02-02",
      "name": "[variables('applicationInsightsName')]",
      "location": "[parameters('location')]",
      "kind": "web",
      "tags": {
        "[concat('hidden-link:', resourceId('Microsoft.Web/sites', variables('applicationInsightsName')))]": "Resource"
      },
      "properties": {
        "Application_Type": "web",
        "ApplicationId": "[variables('applicationInsightsName')]"
      }
    }
  ],
  "outputs": {}
}
```



## Microsoft.Storage/storageAccounts（ストレージアカウント）

`sku`に関しては、[SKU の種類](https://docs.microsoft.com/ja-jp/rest/api/storagerp/srp_sku_types)と、
以下`Azure Portal`から`Azure Functions`を作成した場合に生成されるストレージアカウントのARMテンプレートを参考に決定

![image-20211125141958493.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/bae30aad-dced-6434-2c4a-5664aa7e30ff.png)




## Microsoft.Web/serverfarms（プラン）

`sku`に関しては、
以下`Azure Portal`から`Azure Functions`を作成した場合に生成されるプランのARMテンプレートを参考に決定

![image-20211125145105038.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/b0ea31eb-0d77-83a2-97fb-abf854f94f60.png)




## Microsoft.Web/sites（Funcitons）

基本的には[サンプル](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-first-function-resource-manager?tabs=visual-studio-code%2Cazure-cli#review-the-template)を参照
`appSettings`が環境変数の設定になるが、以下の値は開発/実行環境に合わせて要変更

- `FUNCTIONS_EXTENSION_VERSION`：Funcitonsのランタイムバージョン

![image-20211125154402961.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/a122e1e2-8734-3d99-c892-03c94a903678.png)


- `FUNCTIONS_WORKER_RUNTIME`：*ランタイムスタック*（プログラム言語）
- `WEBSITE_NODE_DEFAULT_VERSION`：nodeバージョン



## microsoft.insights/components

基本的には[サンプル](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-first-function-resource-manager?tabs=visual-studio-code%2Cazure-cli#review-the-template)を参照
欠けていた必須プロパティ（`kind`, `Application_Type`）の追加等を行っている

# デプロイ

デプロイコマンド

```
az deployment group create --name <デプロイ名> --resource-group <デプロイ先リソースグループ名> --template-file <ARMテンプレートパス>
```



デプロイが完了するとリソースグループにリソースが追加される

![image-20211125155450786.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/486ed296-aabd-162e-59c0-a0ed333831f0.png)


デプロイ時に指定したデプロイ名でデプロイ結果が確認できる

![image-20211125155616445.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/345a7196-b175-3dd7-d2aa-d94dc6f4da79.png)




Funcitonsの環境変数で指定したランタイムバージョン等は以下から確認できる

![image-20211125155810885.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/9aad599b-74c6-db08-3194-f61083dbc42f.png)


![image-20211125155827532.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/1c801468-c0bc-1cea-65ff-73e4b263337f.png)