目的
最も簡単な「リソースグループ」をARMテンプレートで作成することで、ARMテンプレートを使用したリソース作成を体験する。
ARMテンプレートとは
ARMテンプレート(Azure Resource Manager Template)は、リソース情報を定義したjson形式のファイルである。Azure ポータルではGUIでステップバイステップで作成するが、ARMテンプレートを利用することで、予め定義した内容でコマンド(Azure CLI or Azure Powershell)からリソースを作成できる。

ARMテンプレートを利用する理由
ARMテンプレートを利用することにより、以下の3つのメリットがあると思うので、ぜひともARMテンプレートを活用したリソース構築を習得し、効率的に学習をすすめたい。
リソース作成作業の自動化
クラウド利用の利点の一つとして、検証目的のために何度でもリソースをビルド&削除することができる点が挙げられる。今後同じリソースを何度も作成と削除を繰り返しながら検証することになるが、これを毎回手動で実行するのは手間なので自動化したい。
リソース作成作業の自動化への慣れ
当然最初はポータルでリソースを作成するが、ついついポータルから手動でポチポチやりがちなので、作成方法を大体把握したらきちんと自動化できるよう、今のうちに自動化に慣れておきたい。
CI/CDへの組み込みの検証
プログラムだけではなく、リソースの構築も一緒にpipelineに組み込むことで、実際の仕事で検証環境や本番環境への展開も視野に自動化を構成することができるようになることを期待している。
ARMテンプレートの自動生成
ARMテンプレートに全く慣れていない場合、最初の取っ掛かりとしてポータルからのエクスポートが良い。Azureポータルでリソースを作成を実行する直前で、画面に設定した情報を基にリソースのテンプレートをダウンロードできるので、これを基に調査するアプローチで行く。
リソースグループをポータルで作成(実行直前まで)
Azureログイン後の画面で「リソースグループ」にマウスホバーし、表示されたポップアップから「作成」を選択する。

「基本」タブ
以下のように入力した。
- リソースグループ名:ARMTemplateRG
- リージョン:東日本

「タグ」タブ
ARMテンプレートの確認用に1つだけ、”owner”という名前に”masatoshuw”という値のタグを追加した。

「確認および作成」タブ
ここで、「作成」ではなく、「Automationのテンプレートをダウンロードする」を選択する。

ARMテンプレートファイルのダウンロード
テンプレートをダウンロードできる画面に遷移する。
コマンドメニューの「ダウンロード」を選択すると、テンプレートファイルとパラメータファイルの2つのファイルが含まれたzipファイルがダウンロードされる。

テンプレート画面の見方
ダウンロードされたファイルを見る前に、この画面の見方について理解しておく。
「テンプレート」- 「テンプレート」タブ
以下の赤枠で囲った部分は、隣のjsonファイルの定義と同期しているので、ファイルの内容を把握しやすい。

以下、赤枠の内容を少し詳細にみてみる。
パラメータ
このjsonファイルに定義された入力情報を示す。このテンプレートでは3つのパラメータがあることを表している。
- rgName(string)
リソースグループ名の文字列オブジェクトを表す。
- rgLocation(string)
リソースグループを作成するリージョンの文字列オブジェクトを表す。
- tags(object)
タグのNameValueの配列オブジェクトを表す。
上記3つのパラメータは、jsonファイルの「/parameters」配下の各オブジェクトと紐付いている。
変数
jsonファイルに定義された変数を表している。jsonファイルの「/variables」配下のオブジェクトと紐付いているが、ここでは変数定義がないので空となっている。
リソース
jsonファイルに定義されたリソースを表している。jsonファイルの「/resources」配下の配列オブジェクトと紐付いている。ここでは1つの「リソースグループ」があることを表している。
画面に表示されている「Microsoft.Resources/resourceGroups」とは、リソースグループを表す型名を表しており、jsonファイルの「type」の値として定義されている内容が表示されている。これはAzure に対して「ここで宣言するのはリソースグループである」ということを伝えるモノであると理解できる。
※jsonファイルの詳細は後ほど確認する。
「テンプレート」- 「パラメーター」タブ
次にパラメータタブを確認する。テンプレートタブに表示されていたパラメーターの実際の値が定義されている。

パラメーターもjsonファイルとして定義されている。テンプレートタブに表示されていた変数名が定義されており、具体的な値が設定されている。
- rgName = “ARMTemplateRG”
- rgLocation = “japaneast”
- tags = “owner”:”masatoshuw”
これらはリソースグループ作成時に画面に入力/選択したもので、これらはパラメーターとして設定されていたことが分かる。ARMテンプレートとしては、テンプレートjsonとパラメータjsonの2つのファイルが必要であることがわかった。
また、テンプレートはリソースの属性情報が定義されており、具体的な属性値はパラメータとして与えることができることもわかった。
「テンプレート」 – 「スクリプト」タブ
この画面はスクリプトの利用方法に関するドキュメントへのリンクだけなのでスキップする。

ARMテンプレートを使ったリソースグループの作成
ダウンロードしたテンプレートファイルとパラメーターファイルを使ってAzure CLIでリソースグループを作成する。Azure CLIを使用したリソースの作成には4つのスコープがあり、実施しようとしている内容に応じて使い分ける。
ここでは2つ目の「サブスクリプションへのリソース作成」時に使用するコマンドを使っていく。
- リソースグループへのリソース作成
WebAppsやStorage等、リソースグループ内に配置するリソース作成のテンプレートを使用。
- サブスクリプションへのリソース作成
サブスクリプションへのPolicy定義、RBAC定義、リソースグループ作成のテンプレートを使用。
- 管理グループへのリソース作成
管理グループへのPolicy定義、RBAC定義、リソースグループと複数リソースを定義したテンプレートを使用。
- テナントへのリソース作成
サブスクリプション定義、管理グループ定義、コスト管理などの手プレートを使用。

Azure CLIからAzure へログイン
以下のコマンドを実行し、Azureへログインする。
$> az login
実行すると、既定のブラウザが起動し、ログインが求められる。
※私の場合、多要素認証を有効にしているため、スマートフォンのAuthenticatorアプリで認証することになっている。
認証が正常に行われた場合、以下のようにログイン完了メッセージが表示される。
$> az login
The default web browser has been opened at https://login.microsoftonline.com/common/oauth2/authorize. Please continue the login in the web browser. If no web browser is available or if the web browser fails to open, use device code flow with `az login --use-device-code`.
You have logged in. Now let us find all the subscriptions to which you have access...
[
{
"cloudName": "AzureCloud",
"homeTenantId": "xxx",
"id": "xxx",
"isDefault": true,
"managedByTenants": [],
"name": "PayAsYouGo-0520",
"state": "Enabled",
"tenantId": "xxx",
"user": {
"name": "xxx@gmail.com",
"type": "user"
}
}
]
$>
※今回は取り急ぎサービス管理者アカウントでログインしたが、通常は普通のアカウントは使用せず、「Service principal」という自動化ツールや他アプリからのアクセス時に使用するIDを使うことが推奨されているので、別の記事でこのあたりも確認していく。

リソースグループの作成コマンドの実行
次に、azコマンドを入力し、ダウンロードしたテンプレートファイルとパラメータファイルを指定してサブスクリプションにリソースグループを作成する。
$> az deployment sub create --name PayAsYouGo-0520 --location japaneast --template-file ./template.json --parameters ./parameter.json
作成までに数秒かかるが、完了すると以下のメッセージが表示される。
$> az deployment sub create --name PayAsYouGo-0520 --location japaneast --template-file ./template.json --parameters ./parameters.json
{
"id": "/subscriptions/871e8b6f-0727-42ce-840e-02bf7d76541a/providers/Microsoft.Resources/deployments/PayAsYouGo-0520",
"location": "japaneast",
"name": "PayAsYouGo-0520",
"properties": {
"correlationId": "595fc963-89fa-4a8b-9232-2869747fa49b",
"debugSetting": null,
"dependencies": [],
"duration": "PT1.2628343S",
"error": null,
"mode": "Incremental",
"onErrorDeployment": null,
"outputResources": [
{
"id": "/subscriptions/871e8b6f-0727-42ce-840e-02bf7d76541a/resourceGroups/ARMSample"
}
],
"outputs": {},
"parameters": {
"rgLocation": {
"type": "String",
"value": "japaneast"
},
"rgName": {
"type": "String",
"value": "ARMSample"
},
"tags": {
"type": "Object",
"value": {
"owner": "masatoshuw"
}
}
},
"parametersLink": null,
"providers": [
{
"id": null,
"namespace": "Microsoft.Resources",
"registrationPolicy": null,
"registrationState": null,
"resourceTypes": [
{
"aliases": null,
"apiProfiles": null,
"apiVersions": null,
"capabilities": null,
"defaultApiVersion": null,
"locationMappings": null,
"locations": [
"japaneast"
],
"properties": null,
"resourceType": "resourceGroups",
"zoneMappings": null
}
]
}
],
"provisioningState": "Succeeded",
"templateHash": "8970316812717434998",
"templateLink": null,
"timestamp": "2021-07-24T16:42:40.364661+00:00",
"validatedResources": null
},
"tags": null,
"type": "Microsoft.Resources/deployments"
}
$>
サブスクリプションへのリソースグループの作成に関するAzure CLIコマンドの詳細は以下参照。

リソースグループの確認
まずはポータルで確認。
ちゃんと出来てた。

続けてAzure CLIでも確認。
ちゃんと出来てた。
$> az group list --subscription PayAsYouGo-0520 --query "[?name=='ARMSample']"
[
{
"id": "/subscriptions/871e8b6f-0727-42ce-840e-02bf7d76541a/resourceGroups/ARMSample",
"location": "japaneast",
"managedBy": null,
"name": "ARMSample",
"properties": {
"provisioningState": "Succeeded"
},
"tags": {
"owner": "masatoshuw"
},
"type": "Microsoft.Resources/resourceGroups"
}
]
$>
※「–query」は出力される情報の条件を指定する引数。
※「–subscription」はオプションで、指定しなければデフォルトサブスクリプションが自動的に適用されるので、サブスクリプションが1つしか無い場合は指定不要。でも明示的に指定することを癖付けることで、複数のサブスクリプションがある環境で人的ミスを削減できるかも。
リソースグループのリスト表示に関するAzure CLIコマンドは以下参照。

ここまで長々と書いてきたが、振り返ってみるととても単純で簡単な作業だ。別の記事で様々なリソースをARMテンプレートで作成する内容を共有する。
リソースグループの削除
削除は非常に簡単で、Azure CLIのdeleteコマンドを使えば瞬殺である。
$> az group delete --name ARMSample
Are you sure you want to perform this operation? (y/n): y
$>
ここではあえてサブスクリプションの指定は省略した。省略するとデフォルトサブスクリプションが自動的に適用されるので、サブスクリプションが1つしかない環境であればこれで良いという参考までに。
以下補足。
- 「–name」は削除対象のリソースグループ名を指定するが、省略形「-n」でも同様に動作する。
- 「–yes」を指定すると、確認メッセージを表示せずにコマンドが即時実行される。
※今回は指定していないので確認メッセージは表示されており、「y」をキー入力して実行を確定させている。
リソースグループの削除に関するAzure CLIの詳細は以下参照。

リソースグループを作成するためのテンプレートの詳細
最後にテンプレートの中身について確認する。
テンプレート本体
今回使用したテンプレートは以下の通り。
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.1",
"parameters": {
"rgName": {
"type": "string"
},
"rgLocation": {
"type": "string"
},
"tags": {
"type": "object",
"defaultValue": {}
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Resources/resourceGroups",
"apiVersion": "2018-05-01",
"location": "[parameters('rgLocation')]",
"name": "[parameters('rgName')]",
"properties": {},
"tags": "[parameters('tags')]"
}
],
"outputs": {}
}
$schemaプロパティ
テンプレートファイルのjsonスキーマを定義する。これは固定文字列なので自動生成されたテンプレートをそのまま利用すれば良い。
サブスクリプションに対するデプロイ時のスキーマは以下参照。

jsonファイルのschemaについては以下参照。
少し余談になるが、Azure Portalからダウンロードしたテンプレートのschemaと、Microsoft社のドキュメントに記載のschemaが異なっていた。
- ドキュメントのschema
https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#
試しに2つのテンプレートファイルを作成し、それぞれに異なるschemaを定義して実行してみたが、どちらも正常に作成出来た。リソースグループに関しては、schema の違いは影響が無いようだ。
contentVersionプロパティ
ARMテンプレートのバージョン番号を表す。このバージョン番号は作成者により自由に利用できる。

1つだけ注意事項として、テンプレートは入れ子構造にすることができるのだが、その場合はこのプロパティは親子で同じ番号にしなければエラーになるらしい。

parametersプロパティ
文字通り、テンプレートに記載した宣言情報に対してパラメータを指定できるようにする。ここでは、「rgName」という文字列型、「rgLocation」という文字列型、「tags」という配列型の情報をパラメータとして指定できるように宣言している。パラメータは、別途パラメータファイルとしてコマンド実行時に指定する必要がある。

variablesプロパティ
テンプレート内で利用できる変数を宣言できる。今回のテンプレートでは変数は使用していないが、例えばリソース名の接頭辞や接尾辞を変数として定義しておき、各リソースの名前に規則性をもたせる等が想定できる。

※このドキュメントでは、変数宣言時にconcat関数を使って、宣言した変数と特定文字列を結合している処理が定義されている。関数が使えるということがこれで分かった。
resourcesプロパティ
これがリソース宣言の本体。ここは各リソースによって定義内容が変わるので、各リソース定義のドキュメントを参照しつつ、実際に利用するときに定義していくことにする。
ちなみに、リソースグループ作成に関するARMテンプレートの詳細は以下参照。

まとめ
この記事では、ARMテンプレートを使ったリソースグループを作成する方法について習得した内容を共有した。
ARMテンプレートの構成、パラメーターファイルの用途、コマンドの実行方法等に注力して、より明確に理解するために、あえてリソースグループという非常に単純なリソースに絞ってやってみた。
別の記事で、改めてもう少し複雑でかつ頻繁に利用するであろうリソースについても習得した内容を共有したい。
コメント