この記事は更新から24ヶ月以上経過しているため、最新の情報を別途確認することを推奨いたします。
追記(2022/1/28): 更新がおくれましたが、次の記事を公開しました。
パーソルプロセス&テクノロジーの内田です。業務でARMテンプレートをカスタマイズする機会があったので、気付いたポイントを備忘録としてまとめます。
本記事は全部で2回に渡る予定であり、今回はARMテンプレートの説明をメインに行います。次回はARMテンプレートを元に実際にリソースを作成していく予定です。
はじめに
まず抑えておくべきポイントは公式ドキュメントへの参考リンクです。
ARMテンプレートを作成する際には必ずこのドキュメントを参照します。
Azure Resource Manager template reference – Azure template
次に開発環境を整えます。Visual Studio Codeに専用のモジュールが用意されているので、これを使うのが便利です。(スニペットや入力補完、検証機能が付いています)
テンプレートを作成するには
VScodeを開いて適当なファイル名でjsonファイルを開きます。言語モードがAzure Resource Managerであることを確認したら「arm!」と入力しテンプレートを選択します。
parameters, functions, variablesを編集するのが好ましいですが、最初の内は深く考えずresourcesをハードコーディングします。この時「arm-」と入力すれば各種リソースのARMテンプレートのスニペットが候補として表示されますが、公式ドキュメントから任意のスキーマのテンプレートをコピペする方が無難でしょう。
例えば仮想マシンを構築したいのであれば、Microsoft.Compute/VirtualMachinesのテンプレート リファレンスを確認します。任意のバージョンを選択して、それをコピーした後resourcesに貼り付けます。
後はこの中身を編集するのみです。ハードコーディングして、何となくイメージを掴むことができれば上出来です。
テンプレートをカスタマイズする
ARMテンプレートを作成するメリットは、使いまわせること、一貫したデプロイ結果を期待できることにあります。ここからはparameters, functions, variablesについて説明していきます。
parameters
parametersで事前に定義した項目はデプロイ時に引数として値を渡すことができます。以下のように定義します。
上記の画像の場合「parameter1」という名前で「string」型の値を受け取ることができます。typeで指定できる値はarray, bool, int, object, secureObject, securestring, stringの7種類です。またtype, metadataの他defaultValueという項目で既定値を指定でき、allowedValues, maxLength, maxValue, minLength, minValueという項目でバリデーションを実施することも可能です。
テンプレート内でパラメータを利用するには、パラメータ関数 parameters(‘parameter name’) を使用します。例えば上記で定義したparameter1を使う場合は次のようになります。
functions
ARMテンプレートでは関数を利用することができます。関数にはシステムに元から備わっている「テンプレート関数」と自身で作成する「ユーザー定義関数」の2つがあり、functionsでユーザー定義関数を定義することができます。
上記の画像の場合「namespacename」名前空間の「functionname」という関数を定義しています。テンプレート内でこの関数を利用するには namespacename.functionname(‘parameter’) とします。
注意点として、ユーザー定義関数には次の制限事項があります。
- 関数は変数にアクセスできません。
- 関数は、関数内で定義されているパラメーターのみを使用できます。 ユーザー定義関数内で parameters 関数を使用する場合は、その関数のパラメーターに制限されます。
- 関数は、その他のユーザー定義関数を呼び出すことはできません。
- 関数では、reference 関数、またはいずれの list 関数も使用できません。
- 関数のパラメーターでは既定値を指定できません。
variables
variablesで事前に定義した項目は変数として利用することができます。
上記の画像の場合「variable1」という変数名に「value」という値を代入しています。
parameters, functions, variablesの使い分け
どのように使ってもよいのですが、可読性や使いやすさを考えて次のように利用することが望ましいと考えています。
- parametersには必要最低限の項目だけ用意する
- 複雑な値はparametersの値を元に、variablesで定義する
- variablesで冗長な箇所がある場合にはfunctionsでユーザー定義関数を作成する
- 固定値や1回しか使わない項目はハードコーディングする
その他抑えておきたいポイント
- ブラケットはテンプレート式を表す
例えばパラメータ関数を呼び出すときには“[parameters(‘parameter name’)]” と記法するわけですが、Resource Managerではブラケット[]の内側はテンプレート式となるため、リテラル値ではなく構文として解釈されます。そのため、functionsやvariablesを呼び出すときにもブラケットを使用します。 - 使用頻度の高い標準テンプレート関数
concat(arg1, arg2, …):文字列を結合し、連結文字列を返します。
resouceGroup():リソースグループオブジェクトを返します。resourceGroup().locationを使って、デプロイするリソースlocationの一貫性を保ちます。
resourceId([subscriptionId], [resourceGroupName], resourceType, resourceName1, [resourceName2], …):特定のリソースのリソースIDを返します。他のリソースと関連するプロパティを持つ場合に利用します。
copyIndex(loopName, offset):copyオブジェクトと一緒に利用します。仮想マシンを複数台作成する場合など、一度に複数のリソースを作成する際に利用します。
今回はこれで以上となります。次回はこれらのポイントを抑えた上で、仮想マシンを複数台作成し、それらの仮想マシンをドメイン参加させるARMテンプレートを作っていきたいと思います。