「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-戻る
--[[クラウド・インフラ自動化]] > [[IaC (Infrastructure as Code)]]
--[[Azure]]
---[[Azure Resource Manager (ARM)]]
---[[FgCF (Financial-grade Cloud Fundamentals)]]

* 目次 [#ye466976]
#contents

*概要 [#dd860c08]
-ARMテンプレートとも。

-[[Azure]]では、主にARM テンプレートを利用して、~
インフラ~OS レイヤまでのインフラ構築の「自動化(IaC)」を行う
--[[リソース>Azure Resource Manager (ARM)#c500a780]]を一貫性のある形で繰り返しデプロイするための[[宣言型>Azure Resource Manager (ARM)#j9444a15]]のテンプレート。
--[[リソース・グループ>Azure Resource Manager (ARM)#f9664018]]へのデプロイ対象となる[[リソース>Azure Resource Manager (ARM)#c500a780]]を定義する JSON ファイル。
--デプロイ対象[[リソース>Azure Resource Manager (ARM)#c500a780]]間の[[依存関係>Azure Resource Manager (ARM)#d69a9c7b]]も、このテンプレートによって定義される。

*詳細 [#z44cef64]

**機能 [#p9ee71fc]

***入力 [#p3c360d2]
Resource Manager はテンプレートを解析し、~
その構文を適切な[[リソース・プロバイダ>Azure Resource Manager (ARM)#e403ab83]]の REST API 操作に変換する。

***出力 [#h8a9e179]
既存の[[リソース・グループ>Azure Resource Manager (ARM)#f9664018]]のテンプレートの取得
-[[リソース・グループ>Azure Resource Manager (ARM)#f9664018]]の現在の状態をエクスポート
-特定のデプロイに使用されたテンプレートを表示

**構造 [#j5bde1e7]
ARMテンプレートとパラメタ・ファイルから構成される

***ARMテンプレート [#e07a645e]
作成するリソース群を指定する(template.json)。

***ARMパラメタ・ファイル [#udf232a1]
-可変要素をパラメタ化する(parameters.json)。
-テンプレート実行時に外部から値を与える。

**編集と実行 [#mf1aa24e]

***編集 [#o2b381e1]
[[Visual Studio Code]] に ARM Tools プラグインを入れ編集。

***実行 [#jd78faf1]
Azureポータルから保存・実行すると便利。

※ ローカルで実行するには、PowerShellライブラリのインストールなど環境構築が必要になる。

*作り方 [#h519dc16]

**Automation [#c1249dd8]
-スクラッチで記載するのは難しいので、~
Automationオプション、Automationスクリプトを使用する。

-リソースの作成前 or 作成後でやり方が変わってくる。

--リソース作成時にテンプレートを引き抜く。~
ポータルからのリソース作成時に、Automationオプションを確認

--リソース作成後にテンプレートを引き抜く。~
[[リソース・グループ>Azure Resource Manager (ARM)#f9664018]]またはリソースから、Automationスクリプトを出力

-以下のトレード・オフがあるので、~
2つの方法を併用して作成する。
||Automationオプション&br;リソース作成時にテンプレートを引き抜く。|Automationスクリプト&br;リソース作成後にテンプレートを引き抜く。|h
|GOOD|綺麗な JSON が入手できる|合体(依存関係アリ、構成変更後)のJSONを入手できる。|
|BAD|・一部の新しいリソースでサポートされていない。&br;・全てがパラメタライズされた状態の JSON。&br;・単体(依存関係ナシ、構成変更前)のJSONしか入手できない。|・リソースによっては、JSON化出来ないモノがある。&br;・半端にパラメタライズされた状態の JSON。&br;・余分な値や、重複した出力がされることがある。|

**サンプル・シナリオ [#p24371c3]
ハブネットワークの ARMテンプレート作成
-[[仮想ネットワークの作成>#c0d17073]]
-[[サブネットの作成>#t4c9f01a]]
-[[ルート・テーブル(UDR)の作成>#x13c3711]]
-[[VPN Gatewayの作成>#me590a04]]
-[[Azure Firewallの設定>#a26efe1b]]
-[[診断ログ・ストレージの作成>#m34c7dce]]
-[[仮想マシン>Azureの仮想マシン]]の作成[[1>#f943a09c]]、[[2>#x08bbc78]]

※ 以下、サンプル・シナリオの[[手順>#jbff77a2]]

**手順 [#jbff77a2]

***[[仮想ネットワーク>Azureの仮想ネットワーク]]の作成 [#c0d17073]
リソース作成時のテンプレート引き抜き機能を使用する。

-ポータル上で[[仮想ネットワーク>Azureの仮想ネットワーク]]、[[Azure Firewall]](+パブリックIP)を構成する。

-作成前に、Automationオプションを選択し、~
ARMテンプレートとパラメタ・ファイルを引き抜く。

-テンプレートに、[[基本的な修正>#r98079fc]]を施す。

-テンプレートの修正後、実際にリソースを作成する。
--作成したテンプレートを Azure ポータルから登録し、展開をテスト
--記述にバグがある場合には配置が失敗する → [[配置が成功するまで、trial and error。>#id9cc917]]

***サブネットの作成 [#t4c9f01a]
既存リソースから、リソース作成後のテンプレート引き抜き機能を使用する。~
(作成時は引き抜き不可であるため)

-先ず、ポータル上でサブネットを3つ構成する([[仮想ネットワーク>Azureの仮想ネットワーク]]のサブ・リソース)。
--管理VM用
--DNS等配置用
--Gateway用

-作成後に、Automationスクリプトを選択すると、~
当該リソースが含まれる[[リソース・グループ>Azure Resource Manager (ARM)#f9664018]]全体を~
ARMテンプレートとパラメタ・ファイルに引き抜く。

-Automationスクリプトの特徴。
--[[リソース・グループ>Azure Resource Manager (ARM)#f9664018]]全体が引き抜かれる。
--既定値や、現在の状態など、余分なパラメタ値が引き抜かれる。
--サブ・リソースが独立したリソースとして展開される。
---このため、全体的に冗長になる。
---また、依存関係が展開先に変更される。

-Automationスクリプトをテンプレートにマージする。

--[[コチラのテンプレート>#c0d17073]]をベースに、Automationスクリプトを参考にして、~
展開されたリソース(サブネット)は、([[仮想ネットワーク>Azureの仮想ネットワーク]]の)サブ・リソース的にマージする。
---ココでは、サービス・エンドポイントの定義が追加されているのでコレもマージする。
---既定値や、現在の状態など、GUIから設定していない余分な値は、移行しないようにする。

--最後に、テンプレートに、[[基本的な修正>#r98079fc]]を施す。

-テンプレートの修正後、実際にリソースを作成する。

***ルート・テーブル([[UDR>Azureの仮想ネットワーク#e8a3a7cc]])の作成 [#x13c3711]
同様に、既存リソースから、リソース作成後のテンプレート引き抜き機能を使用する。~
(リソース依存関係の指定がポイント)

-ポータル上でルート・テーブル([[UDR>Azureの仮想ネットワーク#e8a3a7cc]])を構成する。

-Automationオプションを確認する(依存関係ナシ、構成変更前)。

-上記のルート・テーブルをポータル上で実際に作成し、

-Automationスクリプトを生成する(依存関係アリ、構成変更後)。

-Automationスクリプトを確認する。
--ルート・テーブルとルートが生成され、関連付けは、サブネット側に入る。
--ルート・テーブルのサブ・リソースのルートが展開され、重複して出力される。

>※ [[前段階>#t4c9f01a]]のAutomationスクリプトとDiffを取るなどすると良さそうではある。

-Automationスクリプトをテンプレートにマージする。

--ベースのテンプレートに新規リソースとサブ・リソースの定義だけをマージする。
---ルート・テーブルとルートの作成の定義
---サブネットに追加されたルート・テーブル割当の定義

--依存関係を分析して、依存関係を設定し直す。~
依存関係設定は、親同士の依存関係に置き換えると良い。
---「サブネット → ルート・テーブル」の依存関係を、
---「[[仮想ネットワーク>Azureの仮想ネットワーク]] → ルート・テーブル」の依存関係に修正。

--最後に、テンプレートに、[[基本的な修正>#r98079fc]]を施す。

-テンプレートの修正後、実際にリソースを作成する。

***[[VPN Gateway]]の作成 [#me590a04]
再び、リソース作成時のテンプレート引き抜き機能を使用する。~
(テンプレートに含めるリソースの範囲がポイント)

-ポータル上でGateway用サブネットに、~
[[VPN Gateway]](+パブリックIP)を構成する。~
(対向ネットワークが無いと設定できない所は構成しない等)

-作成前に、Automationオプションを選択し、~
ARMテンプレートとパラメタ・ファイルを引き抜く。

-Automationオプションをテンプレートにマージする。

--リソース作成後のテンプレート引き抜き機能を使用した後に、~
リソース作成時のテンプレート引き抜き機能を使用する場合、~
(既にあるリソースが前提になっているので)~
以下の様に依存関係の修正が必要になることがある。
---定義にリソースを識別する固定値のIDが使用されている場合、~
resourceId関数を使用した動的解決が必要になることがある。
---また、依存関係設定は、親同士の依存関係に置き換えると良い。

--最後に、テンプレートに、[[基本的な修正>#r98079fc]]を施す。

-テンプレートの修正後、実際にリソースを作成する。

***[[Azure Firewall]]の設定 [#a26efe1b]
%%既存リソースからのテンプレート引き抜き機能に対応していない場合の扱い方%%~
現時点では、上記の引き抜き機能が実装された。~
(されていない場合は、リファレンス頼りになる)

-ポータル上で[[Azure Firewall]]に以下を構成する。
--Windows Update
--[[DNSクエリ>DNSサーバ]]

-上記をポータル上で実際に適用し、~

-Automationスクリプトを生成・確認する。

-Automationスクリプトをテンプレートにマージする。
--[[Azure Firewall]]の、propertiesの、~
xxxxxRuleCollectionsをテンプレートにマージする。
--最後に、テンプレートに、[[基本的な修正>#r98079fc]]を施す。

-テンプレートの修正後、実際にリソースを作成する。

***[[診断ログ>Azureの監視と管理#lf757ca0]]・ストレージの作成 [#m34c7dce]
再び、リソース作成時のテンプレート引き抜き機能を使用する。~
(グローバル一意リソースが存在するケース)

-ポータル上で[[ストレージ・アカウント>Azureのストレージ#t36c3007]]を構成する。

-作成前に、Automationオプションを選択し、~
ARMテンプレートとパラメタ・ファイルを引き抜く。

-Automationオプションをテンプレートにマージする。

--[[ストレージ・アカウント>Azureのストレージ#t36c3007]]のセクションをテンプレートにマージする。
---virtualNetworkRulesのサブネットの固定値のIDをresourceIdで動的解決する。
---[[コチラ>#t4c9f01a]]の段階で、サブネットにサービスエンド・ポイントが指定されている。
---そして、(サブネットではなく)[[仮想ネットワーク>Azureの仮想ネットワーク]]への依存関係を追加する。

--最後に、テンプレートに、[[基本的な修正>#r98079fc]]を施す。

-テンプレートの修正後、実際にリソースを作成する。~
(この際、グローバル一意リソース用の変数入力が求められる)

***[[仮想マシン>Azureの仮想マシン]]の作成1 [#f943a09c]
管理VM用サブネットに管理用の[[仮想マシン>Azureの仮想マシン]]を作成するが、[[仮想マシン>Azureの仮想マシン]]では、

-リソース作成時のテンプレート引き抜き機能と
-リソース作成後のテンプレート引き抜き機能とを

併用する(そして、評価式の修正のコツがポイント)。

-ポータル上で[[仮想マシン>Azureの仮想マシン]]を構成する。

-作成前に、Automationオプションを選択し、~
ARMテンプレートとパラメタ・ファイルを引き抜く。

--[[仮想マシン>Azureの仮想マシン]]は、多数のリソースから構成されることが解る。
---NIC
---[[NSG>Network Security Group (NSG)]]
---パブリックIP
---[[仮想マシン>Azureの仮想マシン]]

--また、各リソース間に依存関係もある。
---NIC → ([[NSG>Network Security Group (NSG)]]、パブリックIP)
---[[NSG>Network Security Group (NSG)]] → (-)
---パブリックIP → (-)
---[[仮想マシン>Azureの仮想マシン]] → (NIC)

-Automationオプションをテンプレートにマージする。

--パスワードは、グローバル一意リソース同様、~
parametersセクションに変数を追加する(が、型はsecureStringにする)

--parametersセクションに変数の加工が必要な場合、variablesセクションが使用されている。
>variablesを使用しないように展開すると、この中に動的解決スべきパラメタを確認できるので、~
この値をresourceIdで動的解決する(NICが利用するサブネットやNSGのIDが該当する)。

--最後に、テンプレートに、[[基本的な修正>#r98079fc]]を施す。

-上記の[[仮想マシン>Azureの仮想マシン]]をポータル上で実際に作成し、~

-Automationスクリプトを生成・確認する。~
すると、追加で以下の依存関係が確認できる。

--NIC → (サブネット)
--[[仮想マシン>Azureの仮想マシン]] → ([[ストレージ・アカウント>Azureのストレージ#t36c3007]])

-Automationスクリプトをテンプレートにマージする。

--上記の依存関係を追加するが、同様に、~
親同士の依存関係に置き換えると良い(サブネット → [[仮想ネットワーク>Azureの仮想ネットワーク]])。

--最後に、テンプレートに、[[基本的な修正>#r98079fc]]を施す。

-テンプレートの修正後、実際にリソースを作成する。~
(この際、グローバル一意リソース用の変数入力が求められる)

***[[仮想マシン>Azureの仮想マシン]]の作成2 [#x08bbc78]
DNS等配置用サブネットにDNSサーバ用の[[仮想マシン>Azureの仮想マシン]]を作成するので、~
冗長化のタメに[[可用性セット>Azureの冗長化#gebb4e38]]に2台の[[仮想マシン>Azureの仮想マシン]]を配置するが、~
この場合、1台作成してコピペで増やすという方法が採れる。

-先ず、ポータル上で[[可用性セット>Azureの冗長化#gebb4e38]]を作成する。

-作成前に、Automationオプションを選択し、~
ARMテンプレートとパラメタ・ファイルを引き抜く。

-Automationオプションをテンプレートにマージする。

--[[可用性セット>Azureの冗長化#gebb4e38]]をマージ。
--テンプレートに、[[基本的な修正>#r98079fc]]を施す。

-上記の[[可用性セット>Azureの冗長化#gebb4e38]]をポータル上で実際に作成し、

-更に、ポータル上で当該 [[可用性セット>Azureの冗長化#gebb4e38]]上に[[仮想マシン>Azureの仮想マシン]]を構成する。

-作成前に、Automationオプションを選択し、~
ARMテンプレートとパラメタ・ファイルを引き抜く。

-Automationオプションをテンプレートにマージする。
--[[仮想マシン>Azureの仮想マシン]]を[[前述と同様の手順>#f943a09c]]でマージ。
--テンプレートに、[[基本的な修正>#r98079fc]]を施す。

-上記の[[仮想マシン>Azureの仮想マシン]]をポータル上で実際に作成し、~

-Automationスクリプトを生成・確認する。~
すると、追加で以下の依存関係が確認できる。
--NIC → (サブネット)
--[[仮想マシン>Azureの仮想マシン]] → ([[ストレージ・アカウント>Azureのストレージ#t36c3007]]、[[可用性セット>Azureの冗長化#gebb4e38]])

-Automationスクリプトをテンプレートにマージする。
--上記の依存関係を[[前述と同様の手順>#f943a09c]]で追加。
--最後に、テンプレートに、[[基本的な修正>#r98079fc]]を施す。

-最後に、[[仮想マシン>Azureの仮想マシン]]をコピペで増やし、リネームし、衝突が無いことを確認する。~
(アンチ・マルウェアなどを構成すると、VM名が含まれないリソースが含まれるケースもあるらしい)。

-テンプレートの修正後、実際にリソースを作成する。~
(この際、グローバル一意リソース用の変数入力が求められる)

-更に、静的IPを構成して、追加のフィードバックを行う。
--Automationスクリプトを生成・確認する。
--スクリプトをテンプレートにDiff&マージ。
--静的IPはNICのコンフィギュレーションらしい。

**ポイントのまとめ [#i40a179d]
[[Automation>#c1249dd8]]を使用してテンプレートを作成する際のポイントのまとめ。

***基本的な修正 [#r98079fc]
何れの場合も、以下の、基本的な修正を施す。

-テンプレート内のパラメタ値の具体値化を行う。
--template.jsonのresourcesセクションの"[parameters('XXXX')]"を、~
parameters.jsonのparametersセクションの具体値に変える。
--具体値に変えた、template.jsonのparametersセクションのパラメタを削除する。

-既定でGUIからの入力を使用するパラメタの動的値化を行う。

--[[リソース・グループ>Azure Resource Manager (ARM)#f9664018]]名(name)、リソースを作成する場所(location)

--"[parameters('XXXX')]"だった所を"[resourceGroup().XXXX]"に変更する。~
(これでテンプレートを実行する際に与えられるパラメタを使用するらしい)

-冗長なconcat関数は文字列にしてしまう。

***ユーザ入力を反映する場合 [#w08476cd]
グローバル一意リソースが存在する場合などのケースで利用する。

-parametersセクションを使用すると、~
実行時にユーザ入力を反映できる。

--parametersセクションに変数を追加する。
 "parameters": {
   "virtualDataCenterId": {
     "type": "string",
     "defaultValue": ""
   }
 },

--グローバル一意リソース名などに(文字列連結で)反映する。
  "name": "[concat('xxxxxx', parameters('virtualDataCenterId'))]",

-variablesセクションを使用すると、~
parametersセクションの変数を加工できる。

--variablesセクションに変数を追加しparametersを加工する。
 "variables": {
   "diagnosticsStorageAccountName": "[concat('azrefarchubrgdiag', parameters('virtualDataCenterId'))]"
 },

--グローバル一意リソース名などにvariablesを使用する。
 "name": "[variables('diagnosticsStorageAccountName'))]",

***テンプレートの新規作成 [#acf902ad]
[[仮想ネットワーク>Azureの仮想ネットワーク]]作成時、~
リソース作成時のテンプレート引き抜き機能を使用して、~
テンプレートを新規作成。

***テンプレートへのマージ [#p09bc07e]
-以降、基本的には、既存リソースから、~
リソース作成後のテンプレート引き抜き機能を使用して、~
Automationスクリプトをテンプレートにマージ。

--展開されたリソースはマージせず、
--サブ・リソースのみをテンプレートにマージする。
--[[同様に、依存関係を分析して、依存関係を設定し直す。>#o75c6ba6]]

-再び、リソース作成時のテンプレート引き抜き機能を使用して、~
Automationオプションをテンプレートにマージする場合、

--[[同様に、依存関係を分析して、依存関係を設定し直す。>#o75c6ba6]]

※ [[仮想マシン>Azureの仮想マシン]]等では、上記2つの方法を併用する。

***依存関係の分析と設定 [#o75c6ba6]
-依存関係設定

--基本的に、サブ・リソースは使用せず、~
親同士の依存関係に置き換えると良い。

--再び、Automationオプションを使用する場合、~
(既にあるリソースが前提になっているので)依存関係の修正が必要になることがある。
---定義にリソースを識別する固定値のIDが使用されている場合、~
resourceId関数を使用した動的解決が必要になることがある。
---また、依存関係設定は、親同士の依存関係に置き換えると良い。

-dependsOnのIDの書き方~
文字列と関数の2種類あり、文字列を使用する方法では、~
簡便な記述ができるようになっているが、指定が曖昧になり易い。
--文字列:"Microsoft.Network/virtualNetworks/azrefarc-hub-vnet/subnets/mgmt"
--関数:"[resourceId(resourceGroup().name, 'Microsoft.Network/virtualNetworks/subnets', 'azrefarc-hub-vnet', 'mgmt')]"

***配置が成功するまで、trial and error。 [#id9cc917]
-[[リソース・グループ>Azure Resource Manager (ARM)#f9664018]]名を変えることによって、
--並行展開が可能で素早く作業をすすめることが出来る。
--だだし、課金がされるので、並行して[[リソース・グループ>Azure Resource Manager (ARM)#f9664018]]の開放を行う。

-テンプレートが複雑、展開に時間のかかる~
リソースは最後にテンプレに追加するようにする。

--[[VPN Gatewayの作成>#me590a04]]
--[[仮想マシン>Azureの仮想マシン]]の作成[[1>#f943a09c]]、[[2>#x08bbc78]]
---JSON 定義がかなり大きなサイズになる。
---[[仮想ネットワーク>Azureの仮想ネットワーク]]、サブネットなどに比べるとデプロイに時間もかかるため(?)

***テンプレート化は構成が確定してから。 [#vebfde87]
-そもそもクラウドのインフラ構築は、~
「trial and error」な所があるため、~
序盤に着手すると手戻りが大きくなる可能性がある。

-故に、構築の序盤にはポータルを使用し、~
熟れてから、テンプレート化を開始するようにする。

*参考 [#o2690f57]

-Azure Resource Manager テンプレート入門と作成 | ブログ一覧 | DATUM STUDIO株式会社~
https://datumstudio.jp/blog/azure-resource-manager-%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E5%85%A5%E9%96%80%E3%81%A8%E4%BD%9C%E6%88%90

**Microsoft Azure [#y9bcdbb0]
-Azure Resource Manager テンプレート~
https://azure.microsoft.com/ja-jp/services/arm-templates/

**Microsoft Docs [#te7919bf]
-Azure Resource Manager

--テンプレートの概要~
https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/overview

--テンプレートをデプロイする - Azure portal~
https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/quickstart-create-templates-use-the-portal

--テンプレートのベスト プラクティス~
https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/template-best-practices

--テンプレートの構造と構文
https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/template-syntax

**Qiita [#wd81ee03]
-ARMTemplateデプロイ用のJsonをイジる~
https://qiita.com/sat0tabe/items/7d268d140aa849fbb665

-AzureのARMテンプレートを理解する
--part1 (基本編)~
https://qiita.com/j-tsurumi/items/cc86e9412349da80a323
--part2 (ネットワークリソース編)~
https://qiita.com/j-tsurumi/items/d7e9eda9da223764a799

-Azure Resource Manager テンプレートを
--使用した仮想マシンのデプロイ~
https://qiita.com/yuki451/items/9a6bfc0e544cdcc32788
--使用した自動シャットダウンの設定~
https://qiita.com/yuki451/items/347cac19e6a76455edb6
--使う複数のパラメーターをまとめてデプロイする PowerShell スクリプト~
https://qiita.com/yuki451/items/d8b1e5c9b8de8e9f2462

-ARMTemplateでAzureDNSのリソース作成とレコードを設定する(CLIもあるよ)~
https://qiita.com/HiroyukiSakoh/items/6d3538303bbc310dd59f
-Azure Function v2にHttpClientFactory+Polly~
を組み込み、HttpClientの再試行を実装する~
https://qiita.com/HiroyukiSakoh/items/92d1365db6447bd64550

**nakama [#gc82c333]
FgCF > ゼロトラスト型マルチクラウド IT 環境 > Azure による仮想データセンタ構築手法~
'> 共通技術 > ネットワーク基盤の構成方法 > ARM テンプレートの利用方法

-YouTube~
--前半:https://www.youtube.com/watch?v=Hi4Xh8O10W8
--後半:https://www.youtube.com/watch?v=aLLFJVcHY70

-video、ppt~
https://nakama.blob.core.windows.net/mskk/2019_01_03_PracticalARMTemplate.zip

※ 体系は[[コチラ>FgCF (Financial-grade Cloud Fundamentals)#rb4080e7]]、pwdは[[コチラ>FgCF (Financial-grade Cloud Fundamentals)#ve34867b]]

----
Tags: [[:インフラストラクチャ]], [[:クラウド]], [[:Azure]], [[:IaC]]
Tags: [[:インフラストラクチャ]], [[:クラウド]], [[:セキュリティ]], [[:Azure]], [[:IaC]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS