Azure Resource Manager テンプレートを使用して Azure Logic Apps ワークフローをデプロイする

完了

Azure をしばらく使用したことがあれば、きっと Azure Resource Manager について耳にしたことがあるでしょう。 Resource Manager の役割を確認し、Resource Manager テンプレートの構成要素を定義してみましょう。

Azure Resource Manager とは

Azure Resource Manager は、クラウド リソースを管理および整理するためのインターフェイスです。 Resource Manager はクラウド リソースをデプロイするための手段と考えることができます。

Azure リソース グループに慣れ親しんでいれば、これを使用して関連するリソースのセットを 1 つの単位として扱えることをご存じでしょう。 Resource Manager を使用してリソース グループを編成すると、すべてのリソースを 1 つの操作でまとめてデプロイ、管理、削除することができます。

アナリストのために実行する財務モデルについて考えてみます。 モデルを実行するには、1 つまたは複数の仮想マシン (VM)、データを格納するデータベース、およびすべてのものの間を接続できるようにする仮想ネットワークが必要になる可能性があります。 Resource Manager では、これらの資産を同じリソース グループの中にデプロイし、それらをまとめて管理して監視できます。 完了したら、リソース グループ内のすべてのリソースを 1 つの操作で削除できます。

Resource Manager テンプレートとは

Resource Manager "テンプレート" では、デプロイに含まれるすべての Resource Manager リソースが正確に定義されています。 単一の操作として、リソース グループに Resource Manager テンプレートをデプロイできます。

Resource Manager テンプレートは JSON ファイルであり、テンプレートを "宣言型のオートメーション" の形式にします。 宣言型のオートメーションとは、必要なリソースが "" かということは定義しますが、それを作成する "方法" は定義しないことを意味します。 言い換えると、ユーザーは必要なものを定義し、Resource Manager はリソースが正しくデプロイされるようにする必要があります。

宣言型のオートメーションは、Web ブラウザーによって HTML ファイルが表示される方法に似ています。 HTML ファイルでは、ページに "どのような" 要素を表示するかは記述されていますが、それを "どのように" 表示するかは記述されていません。 "どのように" は、Web ブラウザーの役目です。

Note

Resource Manager テンプレートは "ARM テンプレート" と呼ばれる場合もあります。 ここではフル ネームである "Azure Resource Manager テンプレート" または "Resource Manager テンプレート" を使用します。

Resource Manager テンプレートを使用する理由

Resource Manager テンプレートを使用すると、デプロイが高速になり繰り返しやすくなります。 たとえば、ポータルで VM を作成し、完了するまで待ってから、次の VM を作成する、といったことは必要なくなります。 デプロイ全体が、Resource Manager によって自動的に処理されます。

他の考慮すべきベネフィットとして次のようなものがあります。

  • テンプレートによって一貫性が向上します

    Resource Manager テンプレートにより、ユーザーがデプロイを記述するための共通言語が提供されます。 テンプレートのデプロイに使用されるツールまたは SDK に関係なく、テンプレート内での構造、形式、表現は同じままです。

  • テンプレートは複雑なデプロイを表現するのに役立ちます

    テンプレートを使用すると、複数のリソースを正しい順序でデプロイできます。 たとえば、OS ディスクやネットワーク インターフェイスを作成する前に、仮想マシンをデプロイしたくない場合があります。 Resource Manager では、各リソースとその依存リソースの対応が明らかにされて、依存リソースが最初に作成されます。 依存関係の対応は、デプロイが正しい順序で実行されるのに役立ちます。

  • テンプレートにより、エラーが発生しやすい手動タスクが減ります

    手動でリソースを作成して接続すると、時間がかかり、途中で間違いが起きやすくなります。 Resource Manager によって、毎回同じ方法でデプロイが行われることが保証されます。

  • テンプレートはコードです

    テンプレートでは、コードを使用して要件を表現します。 テンプレートは、他のソフトウェアと同じように共有、テスト、バージョン管理できる一種の "コードとしてのインフラストラクチャ" と考えることができます。 また、テンプレートはコードであるため、辿ることができる "書面による記録" を作成できます。 テンプレート コードでは、デプロイが文書化されます。 ほとんどのユーザーは、Git などの何らかのバージョン管理でテンプレートを保持します。 テンプレートを変更すると、そのリビジョン履歴によってテンプレート (およびデプロイ) が時間経過と共にどのように進化したかも文書化されます。

  • テンプレートにより再利用が推進されます

    テンプレートには、テンプレートの実行時に設定されるパラメーターを含めることができます。 パラメーターでは、ユーザー名、パスワード、ドメイン名などを定義できます。 テンプレート パラメーターを使用すると、ステージングや運用といった複数のバージョンのインフラストラクチャを作成できますが、利用されるテンプレートは同じです。

  • テンプレートはリンク可能です

    Resource Manager テンプレート同士をリンクして、テンプレート自体をモジュール形式にすることができます。 小さいテンプレートを記述してそれぞれでソリューションの一部を定義し、それらを組み合わせて完全なシステムを作成することができます。

財務アナリストが実行するモデルはそれぞれ異なりますが、基になるインフラストラクチャにはパターンがあります。 たとえば、ほとんどのモデルでは、データを格納するデータベースが必要です。 多くのモデルでは、同じプログラミング言語、フレームワーク、オペレーティング システムを使用して、詳細が実行されます。 コンピューティング、ストレージ、ネットワークなど、個々のコンポーネントを記述するテンプレートを定義できます。 その後、コンポーネントを組み合わせて、各アナリストの特定のニーズを満たすことができます。

Resource Manager テンプレートの内容

注意

ここでは、コードの例をいくつか示し、各セクションの構成を把握できるようにします。 表示されているものになじみがなくても心配しないでください。 他の人のテンプレートを確認し、より実践的な経験を積むにつれて独自のテンプレートを書くことができるようになります。

以前に JavaScript Object Notation (JSON) を使用して、サーバーと Web アプリケーションの間でデータを送信したことがあるかもしれません。 JSON も、アプリケーションやインフラストラクチャの構成方法を記述する一般的な方法です。

JSON を使用すると、オブジェクト (仮想マシンなど) として格納されているデータをテキストで表現できます。 基本的に、JSON ドキュメントはキーと値のペアのコレクションです。 各キーは文字列です。 その値には、文字列、数値、ブール式、値のリスト、またはオブジェクト (他のキーと値のペアのコレクション) を使用できます。

Resource Manager テンプレートには、以下のセクションを含めることができます。

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "",
    "parameters": {  },
    "variables": {  },
    "functions": [  ],
    "resources": [  ],
    "outputs": {  }
}

これらのセクションは JSON を使用して表されますが、実際の JSON 言語とは関連していません。 各セクションを詳しく見てみましょう。

パラメーター

このセクションでは、テンプレートの実行時に構成できる値を指定します。 たとえば、テンプレート ユーザーにユーザー名、パスワード、ドメイン名の指定を許可できます。

次の例では 2 つのパラメーター (1 つは VM のユーザー名用で、もう 1 つはそのパスワード用) が使用されています。

"parameters": {
  "adminUsername": {
    "type": "string",
    "metadata": {
      "description": "Username for the Virtual Machine."
    }
  },
  "adminPassword": {
    "type": "securestring",
    "metadata": {
      "description": "Password for the Virtual Machine."
    }
  }
}

変数

ここでは、テンプレート全体で使用される値を定義します。 変数を使用すると、テンプレートの保守が簡単になります。 たとえば、ストレージ アカウント名を変数として 1 回定義し、テンプレート全体でその変数を使用できます。 ストレージ アカウント名が変わった場合、必要なのは変数を更新することだけです。

次の例では、VM のネットワーク機能を記述するいくつかの変数が示されています。

"variables": {
  "nicName": "myVMNic",
  "addressPrefix": "10.0.0.0/16",
  "subnetName": "Subnet",
  "subnetPrefix": "10.0.0.0/24",
  "publicIPAddressName": "myPublicIP",
  "virtualNetworkName": "MyVNET"
}

関数

このセクションでは、テンプレート全体で繰り返し記述したくないプロシージャを定義します。 変数と同じように、関数を使用するとテンプレートの保守が簡単になります。 次に示す例の関数では、グローバルに一意である必要がある名前を持つリソースを作成するときに、使用できる一意の名前が作成されます。

"functions": [
  {
    "namespace": "contoso",
    "members": {
      "uniqueName": {
        "parameters": [
          {
            "name": "namePrefix",
            "type": "string"
          }
        ],
        "output": {
          "type": "string",
          "value": "[concat(toLower(parameters('namePrefix')), uniqueString(resourceGroup().id))]"
        }
      }
    }
  }
],

リソース

このセクションでは、デプロイを構成する Azure リソースを定義します。

次の例では、パブリック IP アドレス リソースを作成しています。

{
  "type": "Microsoft.Network/publicIPAddresses",
  "name": "[variables('publicIPAddressName')]",
  "location": "[parameters('location')]",
  "apiVersion": "2018-08-01",
  "properties": {
    "publicIPAllocationMethod": "Dynamic",
    "dnsSettings": {
      "domainNameLabel": "[parameters('dnsLabelPrefix')]"
    }
  }
}

ここで、リソースの種類は Microsoft.Network/publicIPAddresses です。 名前は変数セクションから読み取られ、場所 (または Azure リージョン) はパラメーター セクションから読み取られます。

リソースの種類は時間と共に変化する可能性があるので、apiVersion では使用するリソースの種類のバージョンが参照されています。 リソースの種類が進化して変わったら、準備ができた時点で、テンプレートを変更して最新の機能を使用できます。

出力

このセクションでは、テンプレートの実行時に受け取りたいすべての情報を定義します。 たとえば、VM の IP アドレスや FQDN を受け取りたいことがあります。これらは、デプロイを実行するまでわからない情報です。

次の例では、hostname という名前の出力を示しています。 FQDN の値は、VM のパブリック IP アドレスの設定から読み取られます。

"outputs": {
  "hostname": {
    "type": "string",
    "value": "[reference(variables('publicIPAddressName')).dnsSettings.fqdn]"
  }
}

テンプレートに Azure Logic Apps ワークフローをデプロイする方法

Azure Logic Apps ワークフローは、Azure 内のリソースです。 そのため、Resource Manager テンプレートの resources セクション内のデプロイするリソースの一覧にそれを追加することによって、テンプレート内にそれをデプロイすることができます。 ワークフローが定義されるためには、resources セクションに何を追加すればよいでしょうか。 問題のワークフローの JSON のワークフロー定義を resources セクションに追加します。 実際、次の JSON スニペットは、前のユニットで説明した基本的なワークフローをデプロイするための Resource Manager テンプレートを示しています。 強調表示されている部分からわかるように、resources セクションには完全なワークフロー定義が含まれています。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Logic/workflows",
            "apiVersion": "2017-07-01",
            "name": "HelloLogicAppsTemplate",
            "location": "westus2",
            "properties": {
                "state": "Enabled",
                "definition": {
                    "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
                    "contentVersion": "1.0.0.0",
                    "parameters": {},
                    "triggers": {
                        "manual": {
                            "type": "Request",
                            "kind": "Http",
                            "inputs": {
                                "method": "GET",
                                "schema": {}
                            }
                        }
                    },
                    "actions": {
                        "Response": {
                            "runAfter": {},
                            "type": "Response",
                            "kind": "Http",
                            "inputs": {
                                "body": "Hello Logic Apps Template!",
                                "statusCode": 200
                            }
                        }
                    },
                    "outputs": {}
                },
                "parameters": {}
            }
        }
    ],
    "outputs": {
        "logicAppUrl": {
           "type": "string",
           "value": "[listCallbackURL(concat(resourceId('Microsoft.Logic/workflows/', 'HelloLogicAppsTemplate'), '/triggers/manual'), '2017-07-01').value]"
        }
     }
}

次のいずれかの方法を使用して、このテンプレートをデプロイできます。

  • Azure portal を使用して展開する。
  • PowerShell Az モジュールを使用して展開する。
  • Azure コマンド ライン インターフェイス (CLI) からデプロイする

このモジュールでは、Azure CLI と az deployment group コマンドを使用してテンプレートをデプロイします。

Resource Manager テンプレートを記述する方法

Resource Manager テンプレートを記述するにはいろいろな方法があります。 最初からテンプレートを記述することもできますが、既存のテンプレートをニーズに合わせて変更するのが一般的です。

最初のテンプレートを入手する方法をいくつか次に示します。

  • Azure portal を使用し、既存のリソース グループ内のリソースを基にしてテンプレートを作成します。
  • 自分またはチームが作成した似た目的を持つテンプレートを使用して開始します。
  • Azure クイック スタート テンプレートから始めます。方法については、次のユニットで説明します。

方法に関係なく、テンプレートを記述するときはテキスト エディターで作業します。 好みのエディターを使用できますが、特にテンプレートの作成用に設計されているものとして Visual Studio Code の Azure Resource Manager Tools 拡張機能があります。 この拡張機能を使用すると、テンプレート コード内を移動しやすくなり、多くの一般的なタスクのオートコンプリートが提供されます。

テンプレートを調べたり書いたりするときは、ドキュメントを参照して、利用できるリソースの種類やその使用方法を理解してください。

次のユニットでは、既存のテンプレートを調べ、Azure CLI からデプロイします。