ARMテンプレート基礎
オブジェクト形式とは
JSONにおける「オブジェクト形式」とは、キーと値のペアの集合を表すデータ構造のことを指します。JSONオブジェクトは波括弧({}
)で囲まれ、中には0個以上のキーと値のペアがコンマ(,
)で区切られて記述されます。各ペアはキー(文字列)と値(どんなJSONデータ型も可)から成り立っています。
JSONオブジェクトの例
{
"name": "John",
"age": 30,
"isStudent": false,
"address": {
"street": "123 Main St",
"city": "Anytown"
},
"phoneNumbers": ["123-456-7890", "987-654-3210"]
}
この例では、name
、age
、isStudent
、address
、および phoneNumbers
がキーです。それぞれのキーに対応する値として、文字列、数値、ブール値、別のオブジェクト、そして配列が使用されています。
オブジェクト形式の特徴
- 構造化: キーと値のペアを使用することでデータが構造化され、プログラムからアクセスしやすくなります。
- 階層性: オブジェクトは他のオブジェクトを含めることができ、複雑な階層的データ構造を作成することが可能です。
- 柔軟性: オブジェクト内の値として文字列、数値、配列、真偽値、さらにはnullなど、任意のJSON型を使用できます。
オブジェクト形式は、プログラミング言語の辞書やハッシュマップ、レコードなどと似たデータ構造に相当します。これにより、データに名前付きでアクセスできるため、情報を整理しやすく、プログラム内で効率的に扱うことができます。
2つのデプロイモード
増分モード
既定のデプロイ モードは “増分" です。 このモードでは、Resource Manager は何も削除しません。 リソース グループに存在するが、テンプレートで指定されていないリソースは、Resource Manager によって変更されず、そのまま残されます。 テンプレート内のリソースは、まだ存在しない場合、リソース グループに “追加" されます。存在している場合は、Resource Manager によって、テンプレート内の構成に更新されます。
完全モード
デプロイを “完全" モードで実行するには、明示的に要求する必要があります。 このモードを使用する場合、Azure 内に存在するが、テンプレートで指定されていないリソースは削除されます。 完全モードでは、リソース グループ内のすべてのリソースが削除されるわけではありません。一部のリソースの種類は除外されます
完全モードを使用する必要がある状況
デプロイする際に必ず完全モードを使用すると、誤ったリソースが後に残らないようにすることができます。 つまり、環境内の “構成のドリフト" を回避するのに役立ちます。
★”構成のドリフト”とは、管理されている環境の実際の構成が、その環境がもともと意図されていた設定や定義から時間とともに逸脱すること
AzureリソースをARMテンプレートでエクスポートすることについて
そもそものエクスポートの位置づけ
テンプレートのエクスポートで記載されるテンプレートは、そもそもデプロイテンプレートにそのまま使えるものではありません。デプロイテンプレートとは若干形式が異なるため修正が必要なものとなります。
以下、公式ドキュメントからの抜粋です。
テンプレートをデプロイする – Azure portal – Azure Resource Manager | Microsoft Learn

エクスポートしても、Azureリソースが完全にARMテンプレートに反映されないケース有
例①秘密鍵、シークレット等、各サービスが意図してARMテンプレートにエクスポートしないもの
例えばApplication Gatewayにアップロードした証明書の秘密鍵などはARMテンプレートに記載されません。
例②Blobストレージに格納されるBlobデータの様な、データプレーンに該当するため、ARMにエクスポートされないもの
例えばBlobストレージのBlobデータや、SQL DBに格納されるデータなどはARMテンプレートに記載されません。
例③ARMテンプレートと各サービスの互換性がないため、エクスポートされないもの
端的に言えば、ARM テンプレートと各サービスの互換性がないため、エクスポート時に警告が表示されることがあります。
エクスポートできないリソースタイプがあると指摘されてしまいます。 –
Japan PaaS Support Team Blog (azure.github.io)
参考
他にもデプロイテンプレートに必要な情報を集める手段として、各サービスが提供しているREST APIから、各サービスの構成を取得するGET APIがあります。
例えばAzure Storageでは下記の様なAPIを提供しています。
Storage Accounts – Get Properties – REST API (Azure Storage Resource Provider) | Microsoft Learn
paramtersについて
- テンプレート本体のファイルとパラメータファイルに分かれている
- テンプレート本体に「parameters」の項目があり、外部(パラメータファイルなど★)から渡す値(パラメータ)を定義する ★ARMテンプレートでデプロイする際、コマンドでパラメータを渡すことも可能
- パラメータファイルを使わずに値を記載する ことができます。その場合、テンプレート本体内のparametersの項目に
defaultValue
を設定することで、外部から値を渡さなくてもテンプレート本体のみで動作するようにできます。
テンプレート本体とパラメータの関係
テンプレート本体に定義されたパラメータは、テンプレート内で使用されます。例えば、仮想ネットワークの名前やリージョンを動的に設定する場合、以下のようになります:
例:テンプレート本体
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string",
"defaultValue": "eastus",
"metadata": {
"description": "リソースを作成するリージョン"
}
},
"vnetName": {
"type": "string",
"metadata": {
"description": "仮想ネットワークの名前"
}
}
},
"resources": [
{
"type": "Microsoft.Network/virtualNetworks",
"apiVersion": "2021-02-01",
"name": "[parameters('vnetName')]",
"location": "[parameters('location')]",
"properties": {
"addressSpace": {
"addressPrefixes": ["10.0.0.0/16"]
}
}
}
]
}
例: パラメータファイル
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"value": "japaneast"
},
"vnetName": {
"value": "myVNet"
}
}
}
テンプレート本体は、parameters
セクションでパラメータを定義し、それをリソース定義内で参照しています。パラメータファイルは、テンプレートに渡す具体的な値を指定しています。
parameters と variables の違い
どちらもARMテンプレート内で値を扱うための仕組みですが、「どこから値を取得し、どう使うか」 に大きな違いがあります。
variables はその名の通り変数なので、”テンプレート内”で繰り返し使う値があるときに、使える便利な値です。

paramters で定義したパラメータを、variablesで利用することも可能
テンプレート内で繰り返し使われる値(変数)を、テンプレートデプロイ時に都度変更できるようにしておきたいときは、パラメータを変数の中に組み込むことで、実現可能(以下例の、太字部分)
テンプレート例
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"prefix": {
"type": "string",
"defaultValue": "myapp",
"metadata": {
"description": "リソース名のプレフィックス"
}
},
"location": {
"type": "string",
"defaultValue": "japaneast",
"metadata": {
"description": "リソースのリージョン"
}
}
},
"variables": {
"storageAccountName": "[concat(parameters('prefix'), uniqueString(resourceGroup().id))]",
"vnetName": "[concat(parameters('prefix'), '-vnet')]"
},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-09-01",
"name": "[variables('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2",
"properties": {}
},
{
"type": "Microsoft.Network/virtualNetworks",
"apiVersion": "2021-02-01",
"name": "[variables('vnetName')]",
"location": "[parameters('location')]",
"properties": {
"addressSpace": {
"addressPrefixes": ["10.0.0.0/16"]
}
}
}
]
}
教材
まずは、以下の教材を一通り進めるのがおすすめ
チュートリアル – テンプレートの作成とデプロイ – Azure Resource Manager | Microsoft Learn
ディスカッション
コメント一覧
まだ、コメントがありません