🍀

はじめてのAzure ARMテンプレート:最低限のエッセンスでVNetを構築する

に公開

1 はじめに

AzureのIaC(Infrastructure as Code)といえば、最近では Bicep が主流になりつつあります。とはいえ、現場ではまだまだ ARMテンプレート が数多く使われています。特に既存環境の保守や設定変更では、「まずARMテンプレートを読み解けること」が求められる場面が少なくありません。

私自身もAzureの構築や保守に携わっており、そこで昨年(2024年)初めてARMテンプレートに触れました。

しかし、公式ドキュメントは網羅的で情報量が多く、初心者にとっては「最初に押さえるべきポイント」が見えにくいのも事実です。「これ、どうやって読めばいいの?」と最初は戸惑いましたが、よく使うのは限られた部分で、押さえるべき基本構文を理解すればスッと内容が頭に入るようになります。

そこで本記事では、ARMテンプレートの基本構文をできるだけシンプルに整理し、「どこをどう読めばいいか」を解説していきます。

2 ARMテンプレートの基本構文

2.1 ARMテンプレートの全体像

ARMテンプレートは、Azureリソースをコードとして定義し、自動的にデプロイ・管理するための仕組みです。
JSON形式で記述しますが、基本的な構造は次のとおりです。

  • $schema: テンプレートが準拠するスキーマ(定義ルール)を指定します。

  • contentVersion: テンプレートのバージョンを表す任意の文字列で、管理目的に使います。

  • parameters: 外部から値を受け取るためのセクションです。型(string, int, bool, array, object など)やデフォルト値を設定できます。

  • variables: テンプレート内で再利用する値を定義します。parametersを組み合わせた計算結果や、複雑な値をまとめる際に利用します。

  • resources: 実際にAzureへデプロイするリソースを定義します。仮想ネットワーク、ストレージアカウント、仮想マシンなど、すべてここに記述します。

  • outputs(任意): デプロイ完了後に出力したい情報を定義します。たとえばリソースのIDや接続文字列などを取得できます。

ARMテンプレートを使うことで、手動操作ではなくコードで環境を一貫して構築・更新でき、インフラの再現性と自動化を実現できます。
ARMテンプレートの全体像
図. ARMテンプレートの全体像

以降、ARMテンプレートを理解するうえで特に大切なエッセンスである parameters、variables、resources について詳しく説明します。

2.2 parameters部

parametersは、ARMテンプレートに「外から値を渡すための入り口」です。
同じテンプレートでも、parametersを使うことで柔軟に設定を変えることができます。
たとえば、仮想マシンを作成するときに

  • リージョン(東日本、西日本など)

  • VMのサイズ(Standard_B1s など)

  • 管理者のユーザー名

といった値を毎回変えたい場合、それらをparametersとして定義しておきます。

これにより:

  • テンプレートを使い回せる

  • 環境ごとに設定を簡単に切り替えられる

  • コードを修正せずに、外から値を渡してデプロイできる

といったメリットがあります。
初心者にとっては「毎回書き換える値はparametersにしておけば便利」と覚えると分かりやすいです。

また、定義したパラメータは、parameters('パラメータ名') で呼び出せます。
ARMテンプレートのparameters部
図. ARMテンプレートのparameters部
ARMテンプレートのparameters部 > パラメータの呼び出しイメージ
図. ARMテンプレートのparameters部 > パラメータの呼び出しイメージ

2.3 variables部

variables部は、テンプレート内で繰り返し使う値を定義する場所です。
parametersが「外部から入力する値」であるのに対し、variablesは「テンプレート内部だけで有効な値」として扱います。

  • 計算結果や結合した文字列を格納できる

  • 何度も同じ式を書かずに済むため、テンプレートが読みやすくなる

  • 一度定義した値を繰り返し利用できる

つまり、「一度計算した値を変数に入れて再利用する」イメージです。

また、定義した変数は variables('変数名') で呼び出します。
配列型の場合は、variables('subnetNames')[0] のようにインデックスを指定できます。

ARMテンプレートのvariables部
図. ARMテンプレートのvariables部
ARMテンプレートのvariables部 > variablesの呼び出しイメージ
図. ARMテンプレートのvariables部 > variablesの呼び出しイメージ

2.4 resources部

resources部は、Azure上に実際にデプロイするリソースを定義する場所です。
仮想ネットワーク、サブネット、ストレージアカウント、仮想マシン、Key Vault など、作成したいリソースはすべてここに書きます。

  • 複数リソースを定義する場合は配列 [{ }, { }] として並べます

  • それぞれのリソースは1つずつオブジェクトで記述します


図. ARMテンプレートのresources部

3. ARMテンプレートで仮想ネットワークを作成

ここからは、ARMテンプレートを実際に使ってみましょう。
第3章では「仮想ネットワーク(VNet)」を作成するテンプレートを例にします。

3.1 ARMテンプレートの作成

この節では、仮想ネットワークを作成するためのARMテンプレートの例を示します。
このコードをデプロイすると、次のようなリソースがAzure上に作成されます。

  • 1つの仮想ネットワーク

  • その中に4つのサブネット

コードの中では、parametersで外部から値を受け取り、variablesで再利用する値を定義し、resourcesでAzureリソースを展開する流れを確認できます。

以下がテンプレートの全体像です。

ARMテンプレートコードサンプル

tmp_vnet_suzume01.json
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "japaneast"
    },
    "prefix": {
      "type": "string",
      "defaultValue": "suzume",
      "metadata": {
        "description": "Prefix for VNet and Subnet names"
      }
    }
  },
  "variables": {
    "vnetName": "[concat('vnet-', parameters('prefix'))]",
    "subnetNames": [
      "[concat('snet-', parameters('prefix'), '-01')]",
      "[concat('snet-', parameters('prefix'), '-02')]",
      "[concat('snet-', parameters('prefix'), '-03')]",
      "[concat('snet-', parameters('prefix'), '-04')]"
    ],
    "subnetPrefixes": [
      "192.168.1.0/26",
      "192.168.1.64/26",
      "192.168.1.128/26",
      "192.168.1.192/26"
    ]
  },
  "resources": [
    {
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2023-04-01",
      "name": "[variables('vnetName')]",
      "location": "[parameters('location')]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "192.168.1.0/24"
          ]
        },
        "subnets": [
          {
            "name": "[variables('subnetNames')[0]]",
            "properties": {
              "addressPrefix": "[variables('subnetPrefixes')[0]]"
            }
          },
          {
            "name": "[variables('subnetNames')[1]]",
            "properties": {
              "addressPrefix": "[variables('subnetPrefixes')[1]]"
            }
          },
          {
            "name": "[variables('subnetNames')[2]]",
            "properties": {
              "addressPrefix": "[variables('subnetPrefixes')[2]]"
            }
          },
          {
            "name": "[variables('subnetNames')[3]]",
            "properties": {
              "addressPrefix": "[variables('subnetPrefixes')[3]]"
            }
          }
        ]
      }
    }
  ]
}

解説

このARMテンプレートは、仮想ネットワーク(VNet)とサブネットを4つ作成する例です。

  • parameters部

    • location でリソースをデプロイするリージョンを指定(デフォルトは japaneast)

    • prefix はVNetやサブネット名の接頭辞(例: suzume)

  • variables部

    • vnetName で仮想ネットワークの名前を定義(例: vnet-suzume)

    • subnetNames にサブネット名を配列で定義(例: snet-suzume-01 ~ snet-suzume-04)

    • subnetPrefixes に各サブネットのアドレス範囲を定義

  • resources部

    • Microsoft.Network/virtualNetworks リソースを作成

    • アドレス空間は 192.168.1.0/24

    • その中に 4つのサブネットを作成し、それぞれに変数で定義した名前とアドレス範囲を割り当て

👉 ポイントは、parametersで外部入力を受け取り、variablesで再利用可能な値を整理し、最後にresourcesでAzureリソースを定義する流れです。

3.2 GUIからデプロイ(ざっくり)

ARMテンプレートはCLIや自動化ツールからもデプロイできますが、ここでは簡単のため、Azure PortalのGUIを使った方法を説明します。
Azure Portalの画面は時代とともに少しずつ変化していきますので、ここでは手順の細部にこだわらず、流れをざっくりと紹介します。

大まかな流れは以下のとおりです:

  1. Azure Portalの「リソースの作成」から 「テンプレートのデプロイ」 を選択

  2. 「エディターで独自のテンプレートを作成」を開く

  3. エディターに作成したテンプレートを貼り付け、内容を確認してデプロイ

この方法を使えば、Portal上でテンプレートの中身を確認しながらデプロイできるので、最初の学習段階でも分かりやすいでしょう。
Azure PortalにてARMテンプレートからリソースをデプロイ

図. Azure PortalにてARMテンプレートからリソースをデプロイ

🍀実際に触ってみるとよいでしょう。触っていくうちに、多少UIが変化しても自然と対応できるようになります。
そして私自身も、今後はGUIだけでなく自動化にも挑戦していきたいと考えています。😎

3.3 デプロイ結果の確認

3.1節のコードをデプロイした場合の出力結果を確認してみます。
AzurePortalで確認すると、ちゃんと仮想ネットワークと、サブネットが作成されています!
ARMテンプレートからデプロイされたリソース
図. ARMテンプレートからデプロイされたリソース

4. おわりに

いかがでしたでしょうか。
本記事では、ARMテンプレートの基本構造を確認し、parameters・variables・resourcesといった大切な要素を中心に解説しました。さらに、実際に仮想ネットワークを作成するテンプレートを紹介し、Azure PortalのGUIを使ったデプロイ方法も確認しました。

ARMテンプレートは「インフラをコードで管理する」ための強力な仕組みです。最初は少し難しく感じるかもしれませんが、触ってみると自然と理解できるようになります。ぜひ皆さんも試してみてください。

GUIでの操作はとても分かりやすい入口ですが、今後はCLIや自動化を使った方法が実務では重要になります。私自身も、これからは自動化に挑戦していきたいと思っています!
最近は生成AIを活用したコードの生成がトピックになっているので、今後の動向も楽しみです!

読んでいただきありがとうございました!
これからも一緒に少しずつステップアップしながら、Azureを楽しんでいきましょう!😉

Discussion