本記事は Microsoft Learn の「JSON ARM テンプレートを使用して Azure インフラストラクチャをデプロイする」というモジュールをまとめたものである。
Azure Resource Manager テンプレート構造を探索する
Infrastructure as Code
「コードとしてのインフラストラクチャ(Infrastructure as Code、IaC)」とは、アプリケーションに必要なインフラストラクチャを人の手作業ではなくコードとして記述・管理し、そのコードを実行することで自動的に環境を構築・デプロイする方法。
IaCの利点は以下の通り。
- 一貫性のある構成:同じコードを実行することで環境を正確に再現でき、人為的ミスや環境差異を減らせる
- スケーラビリティの向上:コードの実行により大量のサーバー環境構築や拡張が迅速かつ均一に行える
- 迅速な展開:手動作業が減り、インフラセットアップのスピードが大幅に向上する
- 追跡可能性の向上:コードがバージョン管理されるため、インフラの変更履歴を管理できる
これにより、開発チームはアプリケーションコードとインフラ構成の両方を中央のコードリポジトリで管理でき、効率的かつ安定した運用が可能になる。IaCは、手動設定によるミスや工数削減、迅速な環境整備を実現する重要な技術。
ARM テンプレートとは
ARMテンプレートは、Azure Resource Manager(ARM)が理解できる、インフラストラクチャと構成を定義するJSON形式のファイル。宣言型の構文を使っており、どのようなリソースを作成するかやそのプロパティを示す。命令型のように手順を逐一書くのではなく、必要なリソースの「状態」を宣言し、ARMがその状態になるようにリソースの作成や設定を自動で行う。
ARM テンプレートを使用する利点
ARM テンプレートを使うことで、インフラの構築や管理をコードとして自動化でき、手作業によるミスを減らし効率的に環境を整備できる。同じテンプレートを何度実行しても常に同じ結果を得ることができる「冪等性」があり、安定したデプロイが可能。さらに、Resource Manager がリソースの依存関係を自動的に把握して適切な順序で作成を調整し、可能な場合はリソースを並行して作成することで、スクリプトによるデプロイよりも短時間で処理が完了する。
加えて、継続的デプロイ(CI/CD)ツールと連携することで、リリース作業を自動化し、迅速かつ安全にインフラやアプリケーションの更新が行える。これらの特徴により、ARMテンプレートは効率化と信頼性を両立させる重要な仕組みとなっている。
ARM テンプレートファイル構造
ARM テンプレートを作成する際には、テンプレートを構成する各要素とその役割を正しく理解しておくことが重要。ARM テンプレートファイルは一般的に以下の主要な要素で構成されている。
-
schema
テンプレートの JSON 構造を定義するスキーマファイルの場所を示す必須セクションで、テンプレートの検証に使われる。バージョン番号は利用範囲やJSONエディターによって異なる。 -
contentVersion
テンプレートのバージョン情報(例:1.0.0.0)を定義する必須セクション。これによりテンプレートの重要な変更が明確になり、適切なテンプレートを使ってデプロイできる -
apiProfile
省略可能なセクションで、リソースの API バージョンの一括指定ができ、テンプレート内の各リソースで個別に API バージョンを書かなくて済む -
parameters
省略可能だが、デプロイ時にユーザーが指定する値を定義するセクション。たとえば、リソース名やリージョン、パスワードなどを動的に設定できる -
variables
省略可能で、テンプレート内で繰り返し使う定数や計算結果を格納し、コードを簡潔かつ保守しやすくする -
functions
省略可能なユーザー定義関数のセクションで、複雑な式を繰り返す場合に使い、テンプレートの可読性と再利用性を高めます。 -
resources
必須のセクションで、作成や管理対象の Azure リソース(仮想マシン、ストレージなど)を詳細に定義する。ここでリソースの種類、プロパティ、依存関係を指定する -
outputs
省略可能で、デプロイの結果として返したい値(たとえば、作成したリソースのIPアドレスなど)を指定するセクション
ARM テンプレートを Azure にデプロイする
次のいずれかの方法で、ARM テンプレートを Azure にデプロイできる
- ローカル環境に保存したテンプレートファイルを直接デプロイ
- テンプレートファイルがホストされているURLを指定してリンクされたテンプレートをデプロイ
- Azure Pipelinesなどの継続的デプロイ(CI/CD)パイプラインを利用して、自動化された方式でテンプレートをデプロイ
そのためにまず、Azure CLI または Azure PowerShell を使用して Azure にサインインする。
az login
Connect-AzAccount
次に、リソース グループを定義する。 次のコマンドを使用して、既に定義されているリソースグループを使用することも、新規に作成することもできる。
az group create \
--name {name of your resource group} \
--location "{location}"
New-AzResourceGroup -Name {name of your resource group} -Location "{location}"
Azure でリソースグループに ARM テンプレートをデプロイするには、Azure CLI の az deployment group create
コマンド、もしくは Azure PowerShell の New-AzResourceGroupDeployment
コマンドを使う。
どちらのコマンドを使う場合でも、デプロイ履歴で分かりやすく管理できるように、リソースグループ名、リージョン、デプロイの名前を指定する必要がある。作業を簡単にするために、テンプレートファイルのパスを変数に保存しておくと便利。以下にその例を示す。
templateFile="{provide-the-path-to-the-template-file}"
az deployment group create --name blanktemplate --resource-group myResourceGroup --template-file $templateFile
$templateFile = "{provide-the-path-to-the-template-file}"
New-AzResourceGroupDeployment -Name blanktemplate -ResourceGroupName myResourceGroup -TemplateFile $templateFile
複雑なソリューションをデプロイするときは、複数のテンプレートに分割して管理する「リンクされたテンプレート」を使う。メインのテンプレートから他のテンプレートを呼び出して順次デプロイする仕組み。これにより、大きな構成も分かりやすく整理できる。リンクされたテンプレートを安全に管理するためには、SAS トークンを使ってテンプレートが格納された場所へのアクセスを制限する方法もある。また、ARM テンプレートのデプロイは自動化のために CI/CD パイプラインと連携することが多く、その代表的なツールが Azure Pipelines や GitHub Actions。
テンプレートにリソースを追加する
ARM テンプレートにリソースを追加するには、まずそのリソースを提供する「リソースプロバイダー」とリソースの種類を理解しておく必要がある。リソースの種類は「{resource-provider}/{resource-type}」という形式で表される。たとえば、ストレージアカウントを追加したい場合は、リソースプロバイダーが「Microsoft.Storage」、リソースの種類が「storageAccounts」なので、テンプレートには「Microsoft.Storage/storageAccounts」と記述する。必要なリソースプロバイダーはAzureの公式ドキュメントで確認できる。
例えば、ストレージアカウントは以下のようになる。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.1",
"apiProfile": "",
"parameters": {},
"variables": {},
"functions": [],
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-05-01",
"name": "learntemplatestorage123",
"location": "westus",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2",
"properties": {
"supportsHttpsTrafficOnly": true
}
}
],
"outputs": {}
}
Azure Resource Manager テンプレートを作成してデプロイする
ARM テンプレートを作成する
-
Visual Studio Code を開き、 azuredeploy.json という名前の新しいファイルを作成する
-
Visual Studio Code ARM テンプレート拡張機能には、テンプレートの開発に役立つスニペットが構成されている。 まず空のテンプレートを追加する。 ファイルの 1 行目に「arm」と入力する
-
Visual Studio Code では、arm で始まるいくつかの選択肢が自動的に表示される。 Azure Resource Manager (ARM) テンプレートを選択する。 Visual Studio Code によって、テンプレートのスキーマと言語が自動的に処理される
ファイルは次のようになる。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"functions": [],
"variables": {},
"resources": [],
"outputs": {}
}
ARM テンプレートを Azure にデプロイする
- Visual Studio Code でターミナル>新しいターミナルを選択してターミナルウィンドウを開く
- ターミナルウィンドウのコマンドバーに bash と表示されている場合は、動作する適切なシェルがあり、次のセクションに進むことができる
- Git Bash を選択する
Azure へのサインイン
1.ターミナルウィンドウで、次のコマンドを実行して Azure にサインインする
az login
2.開いたブラウザー ウィンドウで、自分のアカウントにサインインする
3.次のコマンドを実行して、このセッションで実行するすべての Azure CLI コマンドの既定のサブスクリプションを設定する
az account set --subscription "Concierge Subscription"
既定のリソースグループを設定する
リソース グループを設定するには、次のコマンドを実行する。
az configure --defaults group="learn-eb3e28a3-d200-47f5-acd2-508a3eec8ccf"
テンプレートを Azure にデプロイする
次のコマンドを実行して、ARM テンプレートを Azure にデプロイする。
templateFile="azuredeploy.json"
today=$(date +"%d-%b-%Y")
DeploymentName="blanktemplate-"$today
az deployment group create --name $DeploymentName --template-file $templateFile
ARM テンプレートにリソースを追加する
- Azure Resource Manager Tools for Visual Studio Code 拡張機能のスニペットを使用して、ARM テンプレートに Azure ストレージアカウントリソースを追加する。azuredeploy.json ファイルで、リソースブロック "resources":[],の角かっこ内にカーソルを置く
- 角かっこ内に
storage
と入力する。関連するスニペットのリストが表示される。 [arm-storage] を選択する
ファイルは次のようになる。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"functions": [],
"variables": {},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-05-01",
"name": "storageaccount1",
"tags": {
"displayName": "storageaccount1"
},
"location": "[resourceGroup().location]",
"kind": "StorageV2",
"sku": {
"name": "Premium_LRS"
}
}
],
"outputs": {}
}
- リソース名と displayName の値を一意のものに変更する( learnexercise12321 など)。 この名前は Azure 全体で一意である必要がある
- SKU の値を Premium_LRS から Standard_LRS に変更する
- リソースの場所は、リソースがデプロイされているリソース グループと同じ場所に設定される
更新された ARM テンプレートをデプロイする
実行内容を適切に反映するようにデプロイの名前を変更するターミナルで、次の Azure CLI コマンドを入力する。
templateFile="azuredeploy.json"
today=$(date +"%d-%b-%Y")
DeploymentName="addstorage-"$today
az deployment group create --name $DeploymentName --template-file $templateFile
デプロイをチェックする
デプロイが完了したら、Azure portal に戻る。 リソースグループに移動すると、2つの成功したデプロイが表示される。
パラメーターと出力を使用して Azure Resource Manager テンプレートの柔軟性を高める
ARM テンプレートパラメーター
ARMテンプレートのパラメーターを使うと、環境ごとに異なる値を指定してデプロイを柔軟にカスタマイズできる。たとえば、開発環境と本番環境で異なるストレージアカウントのSKUを設定したい場合、パラメーター化することで同じテンプレートを再利用可能。
パラメーターはテンプレートの parameters
セクションで定義し、デプロイ時に値を渡す。値の指定はコマンドラインやパラメーターファイルを使って行える。テンプレート内のパラメーターは最大256個まで定義可能。
"parameters": {
"<parameter-name>": {
"type": "<type-of-parameter-value>",
"defaultValue": "<default-value-of-parameter>",
"allowedValues": [
"<array-of-allowed-values>"
],
"minValue": <minimum-value-for-int>,
"maxValue": <maximum-value-for-int>,
"minLength": <minimum-length-for-string-or-array>,
"maxLength": <maximum-length-for-string-or-array-parameters>,
"metadata": {
"description": "<description-of-the-parameter>"
}
}
}
}
使用できるパラメーターの種類は次のとおり。
- string
- secureString
- int
- boolean
- object
- secureObject
- array
パラメーターの使用に関するレコメンデーション
パラメーターは、環境ごとに異なるSKUやサイズ、容量などの設定に使う。また、リソース名を自分で指定して識別しやすくしたい場合にも利用する。各パラメーターには説明を付け、可能な限り既定値を設定すると便利。ただし、セキュリティ上の理由からユーザー名やパスワードはテンプレート内にハードコーディングや既定値設定をせず、常にパラメーターとして扱う。パスワードやシークレットには secureString
型を使い、機密データの JSON オブジェクトには secureObject
型を利用します。これらの型のパラメーターはデプロイ後に読み取ることはできない。
ARM テンプレートでパラメーターを使用する
テンプレートの parameters
セクションに、ストレージ アカウント SKU のパラメーターが定義されているテンプレートファイルの例を次に示す。 実行時に値が指定されていない場合は、使用されるパラメーターの既定値を指定できる。
"parameters": {
"storageAccountType": {
"type": "string",
"defaultValue": "Standard_LRS",
"allowedValues": [
"Standard_LRS",
"Standard_GRS",
"Standard_ZRS",
"Premium_LRS"
],
"metadata": {
"description": "Storage Account type"
}
}
}
次に、リソース定義でパラメーターを使用する。 構文は [parameters('name of the parameter')]
。
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-05-01",
"name": "learntemplatestorage123",
"location": "[resourceGroup().location]",
"sku": {
"name": "[parameters('storageAccountType')]"
},
"kind": "StorageV2",
"properties": {
"supportsHttpsTrafficOnly": true
}
}
]
テンプレートをデプロイするときに、パラメーターの値を指定できる。
templateFile="azuredeploy.json"
az deployment group create --name testdeployment1 --template-file $templateFile --parameters storageAccountType=Standard_LRS
$templateFile="azuredeploy.json"
New-AzResourceGroupDeployment -Name testdeployment1 -TemplateFile $templateFile -storageAccountType Standard_LRS
ARM テンプレートの出力
ARM テンプレートの outputs セクションでは、デプロイが成功した後に返される値を指定できる。
"outputs": {
"<output-name>": {
"condition": "<boolean-value-whether-to-output-value>",
"type": "<type-of-output-value>",
"value": "<output-value-expression>",
"copy": {
"count": <number-of-iterations>,
"input": <values-for-the-variable>
}
}
}
項目名 | 必須 | 説明 |
---|---|---|
output-name |
必須 | 出力の名前。有効な JavaScript の識別子で指定。デプロイ後にこの名前で参照される。 |
condition |
任意 | 出力するかどうかを決めるブール値。true で出力、false でスキップ。省略時は true 。 |
type |
必須 | 出力値のデータ型(例:string 、int 、bool など)。 |
value |
任意 | 出力する値。テンプレート内の式の評価結果を指定する。 |
copy |
任意 | 複数の出力値を繰り返し返すために使用。ループ的な出力に使う。 |
ARM テンプレートで出力を使用する
ストレージ アカウントのエンドポイントを出力する例を次に示す。
"outputs": {
"storageEndpoint": {
"type": "object",
"value": "[reference('learntemplatestorage123').primaryEndpoints]"
}
}
ARM テンプレートを再度デプロイする
ARMテンプレートは「冪等」であり、同じ環境に何度デプロイしても、テンプレートに変更がなければ環境は変わらない。パラメーターなど変更があった部分だけが更新される。テンプレートには必要なリソースをすべて含められ、安全に何度も再実行可能で、リソースは既に存在する場合は作成されず、変更があるときだけ更新される。
Azure Resource Manager テンプレートにパラメーターと出力を追加する
ARM テンプレートのパラメーターを作成する
1.Visual Studio Code の azuredeploy.json ファイルで、parameters 属性の中に「par」と入力する。 関連するスニペットの一覧が表示され、 new-parameter
を選択する。これは、テンプレートに汎用パラメータを追加する。 次の例のようになる
"parameters": {
"parameter1": {
"type": "string",
"metadata": {
"description": "description"
}
}
},
2.パラメータを parameter1 から storageName に変更し、型は文字列のままにする。 minLength 値 3 と maxLength 値 24 を追加する。 description 値 The name of the Azure storage resource を追加する。これで、パラメーターブロックは次の例のようになる
"parameters": {
"storageName": {
"type": "string",
"minLength": 3,
"maxLength": 24,
"metadata": {
"description": "The name of the Azure storage resource"
}
}
},
3.resources と name の両方の値の displayName ブロックで新しいパラメーターを使用する。 ファイル全体は、次のコード例のようになる
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageName": {
"type": "string",
"minLength": 3,
"maxLength": 24,
"metadata": {
"description": "The name of the Azure storage resource"
}
}
},
"functions": [],
"variables": {},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-05-01",
"name": "[parameters('storageName')]",
"tags": {
"displayName": "[parameters('storageName')]"
},
"location": "[resourceGroup().location]",
"kind": "StorageV2",
"sku": {
"name": "Standard_LRS"
}
}
],
"outputs": {}
}
パラメーター化された ARM テンプレートをデプロイする
次の Azure CLI コマンドを入力する。デプロイされたら確認する。
templateFile="azuredeploy.json"
today=$(date +"%d-%b-%Y")
DeploymentName="addnameparameter-"$today
az deployment group create --name $DeploymentName --template-file $templateFile --parameters storageName={your-unique-name}
許可される値を制限する別のパラメーターを追加する
1.storageName パラメーターの右中かっこの後にカーソルを置く。 コンマを追加し、Enter を押す
2.再び、「par」と入力し、新しいパラメーターを選択する
3.新しいジェネリック パラメーターを次のコードのように変更する
"storageSKU": {
"type": "string",
"defaultValue": "Standard_LRS",
"allowedValues": [
"Standard_LRS",
"Standard_GRS",
"Standard_RAGRS",
"Standard_ZRS",
"Premium_LRS",
"Premium_ZRS",
"Standard_GZRS",
"Standard_RAGZRS"
]
}
4.パラメーターを使用するように storageSKU を更新する
"sku": {
"name": "[parameters('storageSKU')]"
}
ファイル全体は、次のコード例のようになる。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageName": {
"type": "string",
"minLength": 3,
"maxLength": 24,
"metadata": {
"description": "The name of the Azure storage resource"
}
},
"storageSKU": {
"type": "string",
"defaultValue": "Standard_LRS",
"allowedValues": [
"Standard_LRS",
"Standard_GRS",
"Standard_RAGRS",
"Standard_ZRS",
"Premium_LRS",
"Premium_ZRS",
"Standard_GZRS",
"Standard_RAGZRS"
]
}
},
"functions": [],
"variables": {},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-05-01",
"name": "[parameters('storageName')]",
"tags": {
"displayName": "[parameters('storageName')]"
},
"location": "[resourceGroup().location]",
"kind": "StorageV2",
"sku": {
"name": "[parameters('storageSKU')]"
}
}
],
"outputs": {}
}
ARM テンプレートをデプロイする
許可リストに含まれる storageSKU パラメーターを使用して、デプロイする。 次に、許可リストに含まれていない storageSKU パラメーターを使用して、テンプレートのデプロイを試みる。
1.次のコマンドを実行して、テンプレートをデプロイする
templateFile="azuredeploy.json"
today=$(date +"%d-%b-%Y")
DeploymentName="addSkuParameter-"$today
az deployment group create --name $DeploymentName --template-file $templateFile --parameters storageSKU=Standard_GRS storageName={your-unique-name}
このデプロイは成功する。
2.次のコマンドを実行する
templateFile="azuredeploy.json"
today=$(date +"%d-%b-%Y")
DeploymentName="addSkuParameter-"$today
az deployment group create --name $DeploymentName --template-file $templateFile --parameters storageSKU=Basic storageName={your-unique-name}
ARM テンプレートに出力を追加する
ここでは、ARM テンプレートの outputs セクションにストレージアカウントリソースのエンドポイントの出力を追加する。
1.Visual Studio Code の azuredeploy.json ファイルで、出力属性 "outputs":{}, の中かっこ内にカーソルを置く
2.Enter キーを押し、「out」と入力する。関連するスニペットの一覧が表示される。 [新しい出力] を選択する。 次の例のような一般的な出力がテンプレートに追加される
"outputs": {
"output1": {
"type": "string",
"value": "value"
}
3."output1" を "storageEndpoint" に変更し、type の値を "object" に変更する。 value の値を "[reference(parameters('storageName')).primaryEndpoints]" に変更する。
"outputs": {
"storageEndpoint": {
"type": "object",
"value": "[reference(parameters('storageName')).primaryEndpoints]"
}
出力を含む ARM テンプレートをデプロイする
テンプレートをデプロイし、JSON として出力されたエンドポイントを確認する。
1.次のコマンドを実行して、テンプレートをデプロイする
templateFile="azuredeploy.json"
today=$(date +"%d-%b-%Y")
DeploymentName="addoutputs-"$today
az deployment group create --name $DeploymentName --template-file $templateFile --parameters storageSKU=Standard_LRS storageName={your-unique-name}