6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【簡単】ARM ToolsとARM Template Viewerで簡単にAzureでInfrastructureAsCodeをはじめる

Last updated at Posted at 2020-01-26

はじめに

ARM Templateを実装するにあたってVisualStudioCodeの拡張機能を使えば驚くほど簡単だったため、実際にやってみて分かった注意点を含めて備忘録として残します。誰かの助けになれば幸いです。

準備

Azure Resource Manager (ARM) Toolsを使う

さっそくARM Templateをファイル template.json(任意の名前でもOK)として作成します。
ARM Toolsはインストールしてあれば特別な設定必要なく使用可能です。
そのままコードにキーワードを打てばARM Templateの記載に必要なあらゆることが簡単に実装できるようになっています。
本記事では以下を実施します。

  • ARM Templateのお決まりのテンプレートを生成する
  • ストレージアカウントを構築する定義を実装する
  • AppServicePlanを構築する定義を実装する
  • functionAppを構築する定義を実装する

ARM Templateのお決まりのテンプレートを生成する

非常にシンプルでarmと打ち込むだけです。以下のようにARM Templateでまず記載すべきスケルトンが生成できます。

スクリーンショット 2020-01-26 14.59.02.png スクリーンショット 2020-01-26 14.59.53.png

ここではfunctionsは使わないため生成したスケルトンから定義は削除します。

ストレージアカウントを構築する定義を実装する

構築するリソースはresources定義の中に定義します。
armstorageを打ち込むだけでスケルトンと同様ストレージアカウントの定義が生成できます。

スクリーンショット 2020-01-26 15.10.20.png

瞬時に以下まで実装してくれます。

スクリーンショット 2020-01-26 15.11.31.png

基本的にはARM Toolsが生成する定義で良いですが、以下に注意してリファレンスを見ながらコードを修正します。

更新したapiVersionに従い、定義を修正します。ARM ToolsでWARNINGが出るのでそれを修正すればOKです。
WARNINGによるとskuとkindの定義を追加します。

スクリーンショット 2020-01-26 15.24.52.png

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のウィンドウ右上の目のマークをクリックすると描画できます。

スクリーンショット 2020-01-26 13.43.21.png

以下が表示できます。

スクリーンショット 2020-01-26 13.20.37.png

以下のリソースが生成される理解となります。

  • 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で確認できます。

スクリーンショット 2020-01-26 13.31.01.png

サンプル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を確認できたら正しくデプロイされています。

スクリーンショット 2020-01-26 13.35.50.png

以上

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?