Azure ARMテンプレート入門!IaCでクラウド環境を標準化・自動化する方法を徹底解説
生徒
「Azure(アジュール)でサーバーやネットワークを毎回手動で作るのが大変なんです。もっと楽に、同じ環境を何度も作る方法はありますか?」
先生
「それなら『Azure ARM(アーム)テンプレート』が最適ですよ。これはInfrastructure as Code(インフラストラクチャ・アズ・コード)、略してIaC(アイエーシー)という仕組みを使って、インフラを構成図ではなく『設計図のデータ』として管理する方法です。」
生徒
「設計図のデータですか?難しそうですが、初心者でも使えますか?」
先生
「大丈夫ですよ。一度書き方を覚えれば、ボタンを何度もクリックする手間がなくなります。最近ではより書きやすい『Bicep(バイセップ)』という言語も登場しています。基本から順番に見ていきましょう!」
1. Azure ARMテンプレートとは?
Azure ARM(アジュール・エーアールエム)テンプレートとは、Microsoft Azure上のリソース(仮想マシン、ストレージ、ネットワークなど)を定義するためのJSON(ジェイソン)形式のファイルです。正式名称は「Azure Resource Manager(リソース・マネージャー)テンプレート」と言います。通常、クラウドの操作はポータル画面からマウスで行いますが、このテンプレートを使うと「どのような構成にするか」をテキストファイルに記述し、それをAzureに読み込ませるだけで自動的に環境が構築されます。
この仕組みはInfrastructure as Code(インフラ構成のコード化)と呼ばれ、現代のシステム開発において欠かせない技術となっています。手動操作によるミスを防ぎ、誰が実行しても全く同じ環境を作成できる「再現性」が最大のメリットです。歴史的には、クラウドの規模が巨大化するにつれて、手作業での管理が限界を迎えたために普及しました。料理で例えるなら、毎回感覚で作るのではなく、正確な「レシピ」を用意して、誰でも同じ味を再現できるようにする作業に似ています。
2. IaCによる環境の標準化とメリット
IaC(インフラストラクチャ・アズ・コード)を導入することで、インフラ構築の「標準化(ひょうじゅんか)」が可能になります。標準化とは、社内やプロジェクト内で「正しい構成のルール」を共通化することです。例えば、セキュリティ設定が施された仮想マシンのテンプレートを一つ作っておけば、開発環境でも本番環境でも、その安全な設定をそのまま再利用できます。
主なメリットには以下の3点があります。
- 迅速なデプロイ:コマンド一つで数十個のリソースを数分で作成できます。
- ミスの削減:設定の漏れや選択間違いなどのヒューマンエラーがなくなります。
- 履歴の管理:Git(ギット)などのツールと組み合わせることで、「いつ、誰が、どこを変更したか」をプログラムのソースコードと同じように管理できます。
3. ARMテンプレートの基本構造(JSON形式)
ARMテンプレートはJSON(JavaScript Object Notation)という形式で記述されます。波括弧や角括弧を多用するため、最初は少し複雑に見えるかもしれませんが、基本となる4つの要素(パラメーター、変数、リソース、出力)を理解すれば怖くありません。ここでは、もっとも単純なストレージアカウントを作成するテンプレートの例を見てみましょう。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageName": {
"type": "string",
"metadata": {
"description": "作成するストレージアカウントの名前を入力します。"
}
}
},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-04-01",
"name": "[parameters('storageName')]",
"location": "japaneast",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2"
}
]
}
4. 次世代のIaC言語「Bicep」の登場
前述のJSON形式は、記述量が多くなりがちで、初心者には少し読みづらいという課題がありました。そこで登場したのがBicep(バイセップ)です。Bicepは、ARMテンプレートをより簡単(簡潔)に書くために開発されたドメイン固有言語(DSL)です。名前の由来は「力こぶ(上腕二頭筋)」で、ARM(腕)をより強化するという意味が込められています。
Bicepを使うと、JSONで100行必要だった記述が、わずか数十行で済むこともあります。また、VS Code(ブイエスコード)などのエディタを使えば、入力補完が強力に効くため、初心者の方にはBicepから学習を始めることを強くおすすめします。最終的にはAzure内部で自動的にARMテンプレート(JSON)に変換されて実行される仕組みになっています。
// Bicepでストレージアカウントを定義する例
param storageName string
resource myStorage 'Microsoft.Storage/storageAccounts@2021-04-01' = {
name: storageName
location: 'japaneast'
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
}
5. コマンドラインからのデプロイ方法
作成したテンプレートをAzureに反映させることを「デプロイ(展開)」と呼びます。デプロイには主に「Azure CLI(アジュール・シーエルアイ)」や「Azure PowerShell(パワーシェル)」を使用します。初心者の方は、まずはAzure CLIを自分のパソコンにインストールして、黒い画面(ターミナルやコマンドプロンプト)から操作してみましょう。
まずはAzureにログインし、リソースをまとめる箱である「リソースグループ」を作成してから、テンプレートを実行します。以下は、作成したmain.bicepファイルをAzureに送り込んで、実際にサーバーなどを構築する際のコマンド例です。
az login
az group create --name MyResourceGroup --location japaneast
az deployment group create --resource-group MyResourceGroup --template-file main.bicep
(デプロイ成功のメッセージがJSON形式で表示されます)
6. テンプレート化すべきリソースの例
どのようなリソースをテンプレート化すれば効果的なのでしょうか。基本的には「一度作って終わり」ではないものはすべてコード化すべきです。例えば、Webアプリを動かすための「App Service(アップ・サービス)」や、データを保存する「Azure SQL Database(エスキューエル・データベース)」などです。これらをセットでテンプレート化しておけば、ボタン一つで開発用、テスト用、本番用と複数の環境を量産できます。
ここで、Azure SQL Databaseを定義するためのBicepコードの一部を見てみましょう。データベースサーバーと、その中に入るデータベース自体を関連付けて定義しています。このように、複数の部品を組み合わせて一つのシステムとして定義できるのがIaCの強みです。
resource sqlServer 'Microsoft.Sql/servers@2021-11-01' = {
name: 'my-sqlserver-unique-name'
location: 'japaneast'
properties: {
administratorLogin: 'adminUser'
administratorLoginPassword: 'ComplexPassword123!'
}
}
resource sqlDatabase 'Microsoft.Sql/servers/databases@2021-11-01' = {
parent: sqlServer
name: 'customerDB'
location: 'japaneast'
sku: {
name: 'Basic'
}
}
7. 冪等性(べきとうせい)という重要な概念
IaCを学ぶ上で避けて通れないのが冪等性(べきとうせい)という言葉です。これは「ある操作を何度繰り返しても、同じ結果になる」という性質を指します。例えば、ARMテンプレートを1回実行して仮想マシンが1台作られた後、もう一度同じテンプレートを実行しても、2台目が作られるのではなく「すでに1台あるので、変更はありません」という状態で終了します(設定が変更されていれば、その差分だけが更新されます)。
この性質があるおかげで、運用担当者は現在のクラウドの状態をいちいち細かく確認しなくても、常に「テンプレート(設計図)通りの状態」に保つことができます。これは「あるべき姿(Desired State)」を管理するという、モダンなインフラ運用の考え方に基づいています。手動操作だと、誤って2つ作ってしまったり、設定を上書きしてしまったりするリスクがありますが、ARMテンプレートならその心配がありません。
8. 初心者が学習を始めるためのステップ
最後に、初心者が具体的にどのように学習を進めればよいか解説します。まずは、Azureポータル(ブラウザ画面)でリソースを一つ手動で作ってみることから始めましょう。実は、Azureポータルには「テンプレートの書き出し」という機能があります。自分で作った設定を、そのままARMテンプレート(JSON)としてダウンロードできるのです。
まずはその中身を眺めてみて、「あ、ここがサーバーの名前だな」「ここが場所の指定だな」と理解を深めるのが近道です。その後、より簡潔なBicepに書き換えてみる練習をすると、スムーズに上達します。Microsoft Learn(ラーン)という公式サイトでも、無料の演習環境が用意されているので、積極的に活用してみましょう。クラウドエンジニアとしての第一歩は、この自動化技術をマスターすることから始まります。
bicep --version
Bicep CLI version 0.26.54 (677e52d8)
az bicep install
(Bicepのインストールが完了し、利用可能になります)
まとめ
ここまで、Azure ARMテンプレートとBicepを活用したインフラのコード化(IaC)について詳しく解説してきました。クラウドコンピューティングの世界では、リソースを手動で作成する時代から、設計図をデータとして管理し、自動で構築する時代へと完全に移行しています。Microsoft Azureが提供するこの仕組みを理解することは、エンジニアとしての生産性を劇的に向上させるだけでなく、ヒューマンエラーを排除し、システムの信頼性を高めるための必須スキルと言えるでしょう。
ARMテンプレートはJSON形式という標準的なデータ構造を採用しており、プログラムに馴染みのない方でも、タグの意味を一つずつ紐解けば構造を理解できます。さらに、後継として登場したBicepは、人間にとっての読みやすさと書きやすさを追求した言語であり、モダンな開発現場では主流となりつつあります。インフラを「コード」として扱うことで、Gitによるバージョン管理や、チーム内での構成情報の共有が容易になり、開発サイクル全体のスピードアップに直結します。
また、本記事で触れた「冪等性(べきとうせい)」という概念は、IaCの核心部分です。何度実行しても「あるべき姿」に収束するという安心感は、複雑な大規模システムを運用する上で最大の武器となります。初心者の皆さんは、まずはAzureポータルから既存リソースのテンプレートをエクスポートすることから始め、徐々に自分専用の再利用可能なライブラリを構築していってください。自動化の第一歩を踏み出すことで、インフラ構築の楽しさと奥深さをより一層感じられるはずです。
C#によるテンプレート操作の例
Azure SDK for .NETを使用すれば、C#プログラムから直接ARMテンプレートをデプロイすることも可能です。自動化システムの一部として組み込む際に非常に役立ちます。以下に、Azure SDKを使ってテンプレートをデプロイする際の基本的なコード構造を示します。
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Resources;
using Azure.ResourceManager.Resources.Models;
// Azure認証情報の取得とクライアントの初期化
var armClient = new ArmClient(new DefaultAzureCredential());
var subscription = await armClient.GetDefaultSubscriptionAsync();
var resourceGroup = await subscription.GetResourceGroups().GetAsync("MyResourceGroup");
// デプロイメントの定義
var deploymentContent = new ArmDeploymentContent(new ArmDeploymentProperties(ArmDeploymentMode.Incremental)
{
Template = BinaryData.FromString(File.ReadAllText("azuredeploy.json")),
Parameters = BinaryData.FromString(File.ReadAllText("azuredeploy.parameters.json"))
});
// デプロイの実行
var deploymentOperation = await resourceGroup.Value.GetArmDeployments().CreateOrUpdateAsync(Azure.WaitUntil.Completed, "myDeployment", deploymentContent);
Console.WriteLine("デプロイが完了しました。");
デプロイを開始しています...
リソースの整合性を確認中...
デプロイが完了しました。
ステータス: Succeeded
データベース構築の自動化(SQL実行例)
IaCでインフラを整えた後は、その中のデータを管理する番です。例えば、テンプレートで作成したAzure SQL Databaseに対して、初期データを投入するような運用も自動化の範疇に含まれます。ここでは、構築された環境でユーザー情報を管理するテーブルの操作例を見てみましょう。
SQL実行前のテーブルの状態を確認します(まだ空の状態、あるいは初期状態)。
id | user_name | role | created_at
---+--------------+------------+--------------------
1 | admin_user | Owner | 2026-03-01 10:00:00
2 | guest_user | Reader | 2026-03-01 11:30:00
新しい環境に合わせて、開発チームのメンバーを追加するSQL文を実行します。
INSERT INTO users (id, user_name, role, created_at) VALUES (3, 'tanaka_dev', 'Contributor', GETDATE());
INSERT INTO users (id, user_name, role, created_at) VALUES (4, 'sato_tester', 'Reader', GETDATE());
INSERT INTO users (id, user_name, role, created_at) VALUES (5, 'suzuki_mgr', 'Owner', GETDATE());
SELECT * FROM users;
SQL実行後のテーブルの状態です。正常にレコードが追加されています。
id | user_name | role | created_at
---+--------------+-------------+--------------------
1 | admin_user | Owner | 2026-03-01 10:00:00
2 | guest_user | Reader | 2026-03-01 11:30:00
3 | tanaka_dev | Contributor | 2026-03-31 11:48:00
4 | sato_tester | Reader | 2026-03-31 11:48:05
5 | suzuki_mgr | Owner | 2026-03-31 11:48:10
生徒
「先生、ありがとうございました!ARMテンプレートやBicepを使うと、今までポータルでカチカチ操作していたのが嘘みたいにスムーズになりますね。特に『冪等性』の話が面白かったです。何度やっても壊れない設計図、というのは安心感があります。」
先生
「そうですね。インフラをコードで管理するということは、単に楽をするだけでなく、システムの変更履歴を残せるという大きな価値があります。不具合が起きた時も、コードを以前の状態に戻すだけで環境を復旧できるんですよ。」
生徒
「なるほど。まさにプログラムと同じ管理ができるんですね。JSONは少し目が回りそうでしたが、Bicepなら自分でも書けそうな気がしてきました。VS Codeの設定から始めてみます!」
先生
「その意気です。Bicepの拡張機能を入れると、エラーチェックや自動補完が効くので、タイピングミスも防げます。まずは小さなリソース、例えばストレージアカウント一つからコード化に挑戦してみてください。それがクラウドエンジニアとしての大きな一歩になりますよ。」
生徒
「はい!まずは自分の手で作ったリソースを、Azureポータルからテンプレートとして書き出すところからやってみます。これなら今の設定がどうコードで表現されているか一目瞭然ですね。」
先生
「素晴らしい学習ステップですね!コマンドライン操作も慣れてくると、デプロイがもっと楽しくなりますよ。Azure CLIのaz deploymentコマンドもぜひ手になじませてくださいね。」