はじめに
ARM Templateを実装するにあたってVisualStudioCodeの拡張機能を使えば驚くほど簡単だったため、実際にやってみて分かった注意点を含めて備忘録として残します。誰かの助けになれば幸いです。
準備
- VisualStudioCodeをインストールします
- 拡張機能: Azure Resource Manager (ARM) Toolsをインストールします
- 拡張機能: ARM Template Viewerをインストールします
Azure Resource Manager (ARM) Toolsを使う
さっそくARM Templateをファイル template.json(任意の名前でもOK)として作成します。
ARM Toolsはインストールしてあれば特別な設定必要なく使用可能です。
そのままコードにキーワードを打てばARM Templateの記載に必要なあらゆることが簡単に実装できるようになっています。
本記事では以下を実施します。
- ARM Templateのお決まりのテンプレートを生成する
- ストレージアカウントを構築する定義を実装する
- AppServicePlanを構築する定義を実装する
- functionAppを構築する定義を実装する
ARM Templateのお決まりのテンプレートを生成する
非常にシンプルでarm
と打ち込むだけです。以下のようにARM Templateでまず記載すべきスケルトンが生成できます。
ここではfunctionsは使わないため生成したスケルトンから定義は削除します。
ストレージアカウントを構築する定義を実装する
構築するリソースはresources定義の中に定義します。
armstorage
を打ち込むだけでスケルトンと同様ストレージアカウントの定義が生成できます。
瞬時に以下まで実装してくれます。
基本的にはARM Toolsが生成する定義で良いですが、以下に注意してリファレンスを見ながらコードを修正します。
- apiVersionの修正
- 上記では
2015-06-15
ですがStorageAccountのリファレンスでは2019-04-01
のため修正します
- 上記では
更新したapiVersionに従い、定義を修正します。ARM ToolsでWARNINGが出るのでそれを修正すればOKです。
WARNINGによるとskuとkindの定義を追加します。
AppServicePlanを構築する定義を実装する
- 上記同様に
armplan
と打ち込みAppServicePlanの定義を生成します。 - 要領はStorageAccountと同じため詳細は省略します。
functionAppを構築する定義を実装する
- 同じく
armfunction
と打ち込みfunctionAppの定義を生成します - 生成後、AppServicePlanとStorageAccountの紐付けである
dependsOn
定義を修正します -
properties.siteConfig.appSettings.WEBSITE_RUN_FROM_PACKAGE
を定義し値を1とします- functionをzipでデプロイする時に必須となります
完成したARM Template
上記で説明した修正点に加え、parameters等リファクタリングした後のARM Templateは以下になります。
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"suffix": {
"type": "string",
"defaultValue": "2020012601"
},
"storageAccountSKU": {
"type": "string",
"defaultValue": "Standard_LRS",
"allowedValues": [
"Standard_LRS",
"Standard_GRS"
]
},
"storageAccountKind": {
"type": "string",
"defaultValue": "StorageV2"
},
"appServicePlanSku": {
"type": "string",
"defaultValue": "D1",
"allowedValues": [
"D1",
"B1"
]
}
},
"variables": {
"storageAccountName": "[concat('stracc', parameters('suffix'))]",
"appServicePlanName": "[concat('appsvr', parameters('suffix'))]",
"functionAppName": "[concat('funcapp', parameters('suffix'))]"
},
"resources": [
{
"name": "[variables('storageAccountName')]",
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2019-04-01",
"location": "[resourceGroup().location]",
"tags": {
"displayName": "[variables('storageAccountName')]"
},
"sku": {
"name": "[parameters('storageAccountSKU')]"
},
"kind": "[parameters('storageAccountKind')]"
},
{
"name": "[variables('appServicePlanName')]",
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2018-02-01",
"location": "[resourceGroup().location]",
"sku": {
"name": "[parameters('appServicePlanSku')]",
"capacity": 1
},
"properties": {
"name": "[variables('appServicePlanName')]"
}
},
{
"apiVersion": "2019-08-01",
"type": "Microsoft.Web/sites",
"name": "[variables('functionAppName')]",
"location": "[resourceGroup().location]",
"kind": "functionapp",
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
],
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]",
"siteConfig": {
"appSettings": [
{
"name": "AzureWebJobsDashboard",
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')),'2015-05-01-preview').key1)]"
},
{
"name": "AzureWebJobsStorage",
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')),'2015-05-01-preview').key1)]"
},
{
"name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')),'2015-05-01-preview').key1)]"
},
{
"name": "WEBSITE_CONTENTSHARE",
"value": "[toLower(variables('functionAppName'))]"
},
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~2"
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "dotnet"
},
{
"name": "WEBSITE_RUN_FROM_PACKAGE",
"value": "1"
}
]
}
}
}
],
"outputs": {
"functionName": {
"type": "string",
"value": "[variables('functionAppName')]"
}
}
}
ARM Viewerによる確認
VisualStudioCodeのウィンドウ右上の目のマークをクリックすると描画できます。
以下が表示できます。
以下のリソースが生成される理解となります。
- sites:functionApp
- serverfarms: AppServicePlan
- storageaccounts: そのまま
ARM Templateをデプロイする
AZ CLIでは以下のようにデプロイできます。Azure Portalでもデプロイできます。
$ az group deployment create -g <ResourceGroupName> --template-file template.json
これでARM Viewerで確認した構成がAzure Portalで確認できます。
サンプルfunctionをデプロイ
azure function coreをインストール
インストール方法はこちらの記事を参照してください。
dotnet sdkをインストール
dotnet functionを生成するにあたり、.net core sdkが必要となります。
今回、なぜか生成するHttp triggerテンプレートはdotnet2.1しかサポートされていないみたいなので、.net core SDK 2.1をあらかじめインストールします。
こちらを参考にすると以下のコマンドとなります。
$ wget -nv https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
$ sudo apt-get install apt-transport-https
$ sudo apt-get update
$ sudo apt-get install dotnet-sdk-2.1
$ sudo rm -f packages-microsoft-prod.deb
dotnet functionを生成
$ func init MyFunctionProj --dotnet
functionをデプロイ
func azure functionapp publish <function app name>
でデプロイします。
root@vagrant:/vagrant/arm-templates/functions/MyFunctionProj# func azure functionapp publish funcapp2020012601
Microsoft (R) Build Engine version 16.4.0+e901037fe for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.
Restore completed in 35.66 ms for /vagrant/arm-templates/functions/MyFunctionProj/MyFunctionProj.csproj.
MyFunctionProj -> /vagrant/arm-templates/functions/MyFunctionProj/bin/publish/bin/MyFunctionProj.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:01.69
Getting site publishing info...
Creating archive for current directory...
Uploading 3.44 MB [###############################################################################]
Upload completed successfully.
Deployment completed successfully.
Syncing triggers...
Functions in funcapp2020012601:
HttpTrigger - [httpTrigger]
Invoke url: https://funcapp2020012601.azurewebsites.net/api/httptrigger?code=xxxxxxxxxx
デプロイしたfunctionを確認する
Azure ポータルからデプロイしたfunctionを確認します。
HttpTriggerを確認できたら正しくデプロイされています。
以上