APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【Azure】デプロイ履歴から ARM テンプレートを作成する

はじめに

Power Platform 推進チームの小野です。

本稿では、Azure のデプロイ履歴から、そのデプロイを再現する ARM テンプレートを作成する方法 について解説します。Power Automate と共通点の多い Azure Logic Apps で、一部パラメータを変更したデプロイができるようにするための下準備になります。

やりたいこと

手動で作成したリソースのセットをテンプレートにして、同じスペックのリソースを再作成できるようにする。

作成するリソース

  • 仮想マシン
  • パブリック IP アドレス
  • ネットワーク セキュリティ グループ (NSG)
  • 仮想ネットワーク (Vnet)
  • ネットワーク インターフェース (NIC)
  • ディスク

手順解説

流れ

  • Virtual Machines
    • テンプレートのもとになる仮想マシンを作成する
  • リソース グループ
    • 作成したリソースを削除
    • デプロイからテンプレートをダウンロード
  • ローカル PC
    • ダウンロードした JSON ファイルを編集
  • テンプレートの仕様
    • テンプレートの仕様 (テンプレートスペック) として保存
    • デプロイしてみる

Virtual Machines

テンプレートのもとになる仮想マシンを作成する

まずは、テンプレートとなるスペックを指定して、仮想マシンを作成します。今回はテスト用ということで、コストを抑えた最低限のスペックで作成しています。

仮想マシン作成

スペックを指定して作成ボタンをクリックすると、仮想マシンのデプロイが始まります。

デプロイ完了

リソース グループ

作成したリソースを削除

デプロイが完了したら、念のため作成されたリソースを確認します。作成先のリソースグループに移動すると、仮想マシンと、それに紐づくパブリックIP・NSG・Vnet・NIC・ディスクが作成されていることがわかります。

今回はテンプレートを作成することが目的なので、作成されたリソースそのものは不要です。余計なコストの発生を避けるためにも、作成された 6つのリソースにチェックを入れて削除しておきます。

作成したリソースを削除

デプロイからテンプレートをダウンロード

リソースグループ>設定>デプロイ から、先ほどの仮想マシンのデプロイを選択します。

デプロイ一覧画面

この画面から再デプロイやテンプレートスペックとして保存などができますが、今回はテンプレートファイルを手元で編集したいので、テンプレート>ダウンロード を選択してください。ExportedTemplate-●●●.zip といった名前の ZIP ファイルがダウンロードされます。

テンプレート>ダウンロード

ローカル PC

ダウンロードした JSON ファイルを編集

ダウンロードした ZIP ファイルには、以下の 2つの JSON ファイルが格納されているはず。

ZIPファイルの中身

  • template.json:可変値のの指定
{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "type": "String"
        },
        "networkInterfaceName": {
            "type": "String"
        },
:
  • parameters.json:可変値のの指定
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "value": "japaneast"
        },
        "networkInterfaceName": {
            "value": "r-ono-testvm317"
        },
:

今回は、可変値の型の指定をしている template.json ファイルに、デフォルト値として parameters.json の値を埋め込む形で、可変値入力済みのテンプレートファイルを作成していきます。

具体的には、parameters.json の value を、template.json に defaultValue として転記する作業を行います。template.json を別名で保存(new.json) し、type の後ろにカンマを入れ、defaultValue として parameters.json の value を転記。これを可変値の数だけ繰り返します…

  • new.json:template.json に defaultValue を追記
{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "type": "String",
            "defaultValue": "japaneast"
        },
        "networkInterfaceName": {
            "type": "String",
            "defaultValue": "r-ono-testvm317"
        },
:

※今の値を defaultValue としてエクスポートする方法をご存知の方、情報いただけると幸いです。リソースグループ内でリソース 6つを選択してエクスポートすると defaultValue ごとエクスポートできるんですが、ディスク作成のための情報がエクスポートされず、デプロイに失敗します…

テンプレートの仕様

テンプレートの仕様 (テンプレートスペック) として保存

JSON ファイルが作成できたら、テンプレートの仕様 の画面から、テンプレート スペックの作成 をクリックします。

※日本語表記が「テンプレートの仕様」だったり「テンプレート スペック」だったりしますが、同じものを指していると思われます。

テンプレートの仕様

テンプレート名などだけでなく、バージョンも必須項目なので指定を忘れずに。新規作成なので、1.0 でよいでしょう。

テンプレートの作成画面

次の「テンプレートの編集」画面で、先ほど作成した JSON を転記します。「テンプレート本文が有効な JSON ではありません。」と表示されている場合は、カンマのつけ忘れやカッコの過不足を確認してください。エラー表示が消えたら、「確認および作成」ボタンを押します。

JSON を転記

デプロイしてみる

先ほど作成したテンプレートを使ったデプロイができることを確認しておきましょう。テンプレートの仕様 (テンプレート スペック) の一覧画面から、先ほど作成したテンプレートを選択し、「展開」をクリックします。

作成したテンプレート

仮想マシン作成と似た画面になり、可変値にデフォルト値が設定されていることが確認できます。Admin Password だけは defaultValue: null になっていたのでこの画面で入力し、作成を押します。

デプロイ前画面

デプロイ完了後、リソースグループの画面から、6つのリソースが作成されたことが確認できます。(このままにしておくとコストがかかるので、適宜削除してください)

デプロイ完了

これで、はじめに行ったデプロイを再実行するようなテンプレートを作成することができました

つまずいた点/注意点

defaultValue をテンプレートに含めてダウンロードできないか試行錯誤したのですが、うまくいかず… デプロイ履歴から作るテンプレートと、デプロイされたリソースを選択して作るテンプレートでは、中身が異なっていました。結局 JSON ファイルを手で修正するという力ワザで解決しました。よい方法を知っている方、情報いただけると幸いです。

なお、この ARMテンプレートだと、複数回デプロイしたいときは、各リソース名を都度修正する必要があります。作成するリソースと同名のものがリソースグループ内にすでに存在する場合、特にエラーにはならずにデプロイが完了しますが、実際にはリソースは作成されず、既存リソースにも影響はありませんでした。

おわりに

Azure のリソースは、色々な方法でテンプレート化できることがわかりました。デプロイやリソース単位で、テンプレートとしてリソースグループに保存したり、JSON 形式でダウンロードしたりできます。

一方で、defaultValue ありのエクスポートができなかったり、仮想マシンとディスクを同時にテンプレート化できなかったり、思い通りにいかないところも。今回は Azure Portal の GUI 上でエクスポートを試みていましたが、Azure CLI を使いこなせれば、もっと柔軟な操作が可能なのかもしれません。

次回のブログでは、今回作成した ARM テンプレートをもとに、リソース名をユニークな値としてデプロイを行う仕組みを Azure Logic Apps で作成します。