【Azure/自動化】ARM(Azure Resource Manager)テンプレートの使い方(デプロイ編)

こんにちは、Aireです。

Azureを利用する場合、ARMテンプレートを使用するとあらかじめ定義しておいた情報を基にAzureリソースの迅速なデプロイが可能です。

本記事ではARMテンプレートの使い方として、ARMテンプレートを作成してからAzureにデプロイするまでの手順を紹介します。

本記事を読むと
  • ARMテンプレートの構成要素を理解できる
  • ARMテンプレートのデプロイ方法を理解できる
  • 簡単なARMテンプレート(”Hello World!”メッセージのみ出力)を作成できる
  • ARMテンプレートをAzureにデプロイできる
  • ARMテンプレートをAzureにデプロイした結果を確認できる
目次

ARMテンプレートとは

Azure Resource Manager(ARM)テンプレートは、Azureリソースのデプロイ手順を記述したJSON形式のテンプレートファイルです。作成したARMテンプレートは繰り返し使用できるため、同じ設定の仮想マシンを繰り返しデプロイしたり、複数のリソースを一括デプロイすることが可能です。

ARMテンプレートファイルの構成要素

ここではARMテンプレートの構成要素を記載します。必須の構成要素と任意の構成要素の2種類があります。

schema(必須)

ARMテンプレートで使用するJSONスキーマ(テンプレートの記述ルール)のバージョンを定義します。

contentVersion(必須)

ARMテンプレートのバージョン(e.g., 1.0.0.0)を定義します。このバージョン番号はユーザが自由に指定可能です。

apiProfile(任意)

リソースのAPIバージョンを定義します。

parameters(任意)

リソースのデプロイ時に指定するパラメータを定義します。パラメータは、値の種類を制限するといったことも可能です。(数字のみ可とするなど)

functions(任意)

ARMテンプレート内で使用する関数を定義します。

variables(任意)

ARMテンプレート内で使用する変数を定義します。

resources(必須)

リソースグループまたはサブスクリプションで、デプロイまたは更新する必要がある項目を定義します。parametersセクションのパラメータの値やvariablesセクションの変数を使用可能です。本セクションで値を直接指定することも可能です。

outputs(任意)

デプロイの最後に返される値を定義します。デプロイログに任意のメッセージを追加することが可能です。

ARMテンプレートのデプロイ方法

ARMテンプレートをAzureにデプロイする方法としては以下があります。

1. ローカルテンプレート(Local Template)をデプロイする

ローカルコンピュータ上で作成したARMテンプレートをAzureにデプロイする方法です。

2. メインテンプレート(Main Template)とリンク済みテンプレート(Linked Template)をデプロイする

メインとなるARMテンプレート(Main Template)と、そこからリンクを介して参照される独立したテンプレートファイル(Linked Template)をAzureにデプロイする方法です。本デプロイ方法により、複雑なソリューションを複数の関連するARMテンプレートに分割した状態で、メインテンプレートからそれらをデプロイできます。

リンク済みテンプレートはローカルファイルに保存できず、ローカルネットワーク上でしか利用できないファイルに保存することもできません。HTTPまたはHTTPSを含むリンク済みテンプレートのURI値を指定するか、relativePathプロパティを使用して、親テンプレートに対して相対的な場所にリモートのリンク済みテンプレートを配置できます。手段の一つとして、メインテンプレートとリンク済みテンプレートをBlobコンテナに格納する方法があります。

3. 継続的デプロイパイプラインでデプロイする

Azure Pipelinesを利用してARMテンプレートを継続的にビルドおよびデプロイする方法です。Azure Pipelinesは、Azure DevOpsが提供する機能の一つであり、継続的インテグレーションおよびデリバリー(CI/CD)サービスと呼ばれます。コードのテストやビルドを実行した後、Gitプロバイダ(GitHubなど)と連携し、主要クラウドにデプロイすることが可能です。

Azure DevOpsはクラウド上でDevOpsを実践するためのサービス群です。チームでのコード開発の効率化や品質向上に役立つ機能が提供されます。

ARMテンプレートのデプロイ手順

本章では前述のデプロイ方法の具体的な手順を紹介します。今回はデプロイ時に”Hello World!”メッセージを出力するARMテンプレートを作成しAzureにデプロイしてみます。

事前準備(共通)

はじめに共通手順として、ARMテンプレートの作成やデプロイに使用するエディタツールやCLIツールをインストールします。

  1. ローカルコンピュータにVisual Studio Codeをインストール(テンプレート作成時に使用)
  2. Visual Studio CodeにARM Tools拡張機能をインストール(テンプレート作成時に使用)
  3. ローカルコンピュータにAzure PowerShellまたはAzure CLIをインストール(テンプレートデプロイ時に使用)

ローカルコンピュータにVisual Studio Codeをインストール

Visual Studio CodeにARM Toolsをインストールして使用すると、ARMテンプレートの作成をスムーズに行えます。

Visual Studio Codeを以下からダウンロードし、ローカルコンピュータにインストールします。

Visual Studio CodeにARM Tools拡張機能をインストール

Visual Studio Codeをインストール後、Visual Studio Codeの[拡張機能]メニューからARM Toolsをインストールします。

以下のサイトにアクセスし、ARM Toolsをインストールすることも可能です。

ローカルコンピュータにAzure PowerShellまたはAzure CLIをインストール

ARMテンプレートのデプロイに使用するCLIツールとして、Azure PowerShellまたはAzure CLIをインストールします。以下のMicrosoftの公式サイトを参考にしてください。Azure PortalからARMテンプレートをデプロイする場合は本手順は不要です。

ローカルテンプレートのデプロイ手順

ローカルテンプレートをデプロイする手順は以下の通りです。

  1. Visual Studio CodeでARMテンプレート(ローカルテンプレート)を作成
  2. Azureにサインイン
  3. (任意)既定のサブスクリプションを設定
  4. (任意)リソースグループを作成
  5. ARMテンプレートをAzureにデプロイ

Visual Studio CodeでARMテンプレート(ローカルテンプレート)を作成

新規にテンプレートファイル(ここではsample.jsonとしています)を作成後、”arm”と入力しResource Group Templateを選択します。

以下のように空のARMテンプレートが作成されます。

outputsセクションに以下のように入力します。プロパティ名(ここではoutput1としています)は任意の文字列を指定可能です。

Azureにサインイン

CLIツールでARMテンプレートをデプロイする場合は、Visual Studio Code上でターミナルを開くかローカルコンピュータにインストール済みのターミナルを起動し、以下のコマンドを実行します。Azure Portal上でデプロイする場合は、https://portal.azure.com/からAzure Portalにサインインします。

(任意)既定のサブスクリプションを設定

サブスクリプションが複数ある場合、必要に応じて使用するサブスクリプションを指定します。(Azure Portalからの操作の説明は省略します)

(任意)リソースグループを作成

ARMテンプレートをデプロイするリソースグループを作成します。既存のリソースグループを使用する場合は本手順は不要です。(Azure Portalからの操作の説明は省略します)

ARMテンプレートをAzureにデプロイ

ARMテンプレートをAzureにデプロイします。以下の実行例では、デプロイ名に日時情報を含めることで、デプロイ名が一意になるようにしています。

ARMテンプレートのデプロイ後、Azure Portal上でリソースグループの[設定]セクションから[デプロイ]を選択すると、デプロイ情報が確認できます。

デプロイ名をクリックすると、ARMテンプレートのデプロイ結果が確認できます。

出力欄を確認すると、”Hello World!”というメッセージが確認できます。

メインテンプレートとリンク済みテンプレートのデプロイ手順

メインテンプレートとリンク済みテンプレートをデプロイする手順は以下の通りです。

  1. Visual Studio CodeでARMテンプレート(メインテンプレートとリンク済みテンプレート)を作成
  2. Azureにサインイン
  3. (任意)既定のサブスクリプションを設定
  4. (任意)リソースグループを作成
  5. (任意)ストレージアカウントとコンテナを作成
  6. ARMテンプレートをBlobコンテナにアップロード
  7. ARMテンプレートをAzureにデプロイ

Visual Studio CodeでARMテンプレート(メインテンプレートとリンク済みテンプレート)を作成

はじめにリンク済みテンプレートファイル(ここではlinkedTemplate.jsonとしています)を作成します。新規ファイルを作成後、”arm”と入力しResource Group Templateを選択します。

以下のように空のARMテンプレートが作成されます。

outputsセクションに以下のように入力します。outputsセクションのプロパティ名(ここではmessageとしています)は任意の文字列を指定可能です。

次にメインテンプレートファイル(ここではmainTemplate.jsonとしています)を作成します。

新規ファイルを作成後、リンク済みテンプレートと同じように空のARMテンプレートを作成し、resourcesセクションとoutputsセクションに以下のように入力します。outputsセクションのプロパティ名(ここではmessageFromLinkedTemplateとしています)は任意の文字列を指定可能です。なお、ハイライト行はリンク済みテンプレートの呼び出し方法を示しています。

Azureにサインイン

CLIツールでARMテンプレートをデプロイする場合は、Visual Studio Code上でターミナルを開くかローカルコンピュータにインストール済みのターミナルを起動し、以下のコマンドを実行します。Azure PortalでARMテンプレートをデプロイする場合は、https://portal.azure.com/からAzure Portalにサインインします。

(任意)既定のサブスクリプションを設定

サブスクリプションが複数ある場合、必要に応じて使用するサブスクリプションを指定します。(Azure Portalからの操作の説明は省略します)

(任意)リソースグループを作成

ARMテンプレートをデプロイするリソースグループとストレージアカウント用のリソースグループを作成します。既存のリソースグループを使用する場合は本手順は不要です。(Azure Portalからの操作の説明は省略します)

(任意)ストレージアカウントとコンテナを作成

ARMテンプレートを格納するためのストレージアカウントとコンテナを作成します。既存のリソースを使用する場合は本手順は不要です。(Azure Portalからの操作の説明は省略します)

ARMテンプレートをBlobコンテナにアップロード

メインテンプレートとリンク済みテンプレートをコンテナにアップロードします。(Azure Portalからの操作の説明は省略します)

ARMテンプレートをAzureにデプロイ

メインテンプレートをAzureにデプロイします。以下の実行例では、デプロイ名に日時情報を含めることで、デプロイ名が一意になるようにしています。

  1. コンテナのパブリックアクセスレベルが”コンテナ”の場合
  1. コンテナのパブリックアクセスレベルが”プライベート”の場合

ARMテンプレートのデプロイ後、Azure Portal上でリソースグループの[設定]セクションから[デプロイ]を選択すると、デプロイ情報が確認できます。

デプロイ名をクリックすると、ARMテンプレートのデプロイ結果が確認できます。

出力欄を確認すると、”Hello World!”というメッセージが確認できます。

継続的デプロイパイプラインを用いたデプロイ手順

Azure Pipelinesを使用してテンプレートをデプロイする手順は以下の通りです。

  1. GitHubリポジトリ(リモートリポジトリ)を作成
  2. リモートリポジトリをローカルに複製
  3. DevOpsプロジェクトを作成
  4. パイプラインを作成し、ARMテンプレートをAzureにデプロイ

GitHubリポジトリ(リモートリポジトリ)を作成

https://github.comにアクセスし、GitHubにサインインします。アカウントがなければ作成してください。

リポジトリの作成画面に移動し、リポジトリを作成します。リポジトリ名は”ArmPipeline-repo”としておきます。リポジトリの公開ですが、パブリックとプライベートのどちらも選択可能です。

作成完了後、リポジトリのURL(https://github.com/<アカウント名>/<リポジトリ名>)を残しておきます。

リモートリポジトリをローカルに複製

以下のコマンドを実行し、リモートリポジトリをローカル環境に複製します。Gitコマンドを使用するため、事前にGitをインストールしてください。

上記コマンドの実行後、HelloWorldフォルダにARMテンプレートファイル(ここではsample.jsonとしています)を格納します。ファイルの中身は以下とします。

GitコマンドでARMテンプレートファイル(sample.json)をリモートリポジトリにプッシュします。

プッシュ後、GitHubサイト上でsample.jsonを開き、[Raw]をクリックします。その後、表示されたページのURL(https://raw.githubusercontent.com/〜/sample.json)をコピーしておきます。

DevOpsプロジェクトを作成

https://aex.dev.azure.com/からAzure DevOpsにサインインし、新しい組織を作成します。

DevOpsプロジェクトを作成します。

DevOpsプロジェクトをAzureにデプロイするための”サービス接続”を作成します。

[Project settings]を選択します。

[Pipelines]の[Service connections]に移動し、[Create service connection]を選択します。

[Azure Resource Manager]を選択し、[Next]を選択します。

[Service principal (automatic)]を選択し、[Next]を選択します。

以下の項目について選択または入力し、[Save]を選択します。

  • [Scope level]:[Subscription]を選択します。
  • [Subscription]:使用しているサブスクリプションを選択します。
  • [Resource Group]:空白のままにします。
  • [Service connection name]:サービス接続名を入力します。
  • [Grant access permission to all pipelines]:チェックを入れます。

パイプラインを作成し、ARMテンプレートをAzureにデプロイ

ARMテンプレートをAzureにデプロイするためのパイプラインを作成します。

[Pipelines]を選択し、[Create Pipeline]を選択します。

[Connect]タブで[GitHub]を選択します。

[Authorize AzurePipelines]を選択します。要求された場合はGitHubアカウントのパスワードを入力します。

[Select]タブで作成したリポジトリを選択します。

作成したリポジトリが選択されていることを確認し、[Approve & Install]を選択します。

[Configure]タブで [Starter pipeline]を選択します。

azure-pipelines.ymlファイルが表示されます。既存のスクリプト(下図の赤枠内)を削除後、最終行にカーソルを移動した状態で[Show assistant]を選択します。

タスク欄から[ARM template deployment]を選択します。

Azure Details欄では以下のように選択または入力します。

  • [Deployment scope]:[Resource Group]を選択します。
  • [Azure Resource Manager connection]:作成したサービス接続名(本記事ではArmPipeline-con)を選択します。
  • [Subscription]:サブスクリプションを選択します。
  • [Action]:[Create or update resource group]を選択します。
  • [Resource group]:新しいリソースグループの名前(本記事ではArmPipelineRG)を入力します。
  • [Location]:リソースグループのリージョン(本記事ではJapan East)を選択します。

Template欄では以下のように選択または入力します。

  • [Template location]:[URL of the file]を選択します。
  • [Template link]:前述の手順でコピーしておいたURL(https://raw.githubusercontent.com/〜/sample.json)を入力します。
  • [Template parameters link]:空欄のままにしておきます。
  • [Override template parameters]:空欄のままにしておきます。
  • [Deployment mode]:[Incremental]を選択します。

Advanced欄では以下のように選択または入力します。

  • [Deployment name]:デプロイ名(本記事ではDeployPipelineTemplate)を入力します。
  • [Deployment outputs]:空欄のままにしておきます。

[Add]を選択後、azure-pipelines.ymlファイルに設定が追加されたことを確認して[Save and run]を選択すると、以下のように実行結果が表示されます。

パイプラインを実行した後、Azure Portal上でリソースグループの[設定]セクションから[デプロイ]を選択すると、以下のようにデプロイ情報を確認できます。

デプロイ名をクリックすると、ARMテンプレートのデプロイ結果が確認できます。

出力欄を確認すると、”Hello World!”というメッセージが確認できます。

初めてパイプラインを実行すると以下のエラーメッセージが表示されます。
[error]No hosted parallelism has been purchased or granted. To request a free parallelism grant, please fill out the following form https://aka.ms/azpipelines-parallelism-request

既定では、Azure DevOpsで作成した新しい組織は同時実行パイプラインが許可されておらず、マイクロソフトにパイプラインの許可を要求する必要があります。エラーメッセージ内のhttps://aka.ms/azpipelines-parallelism-requestにアクセスし、いくつかの質問に回答すると、リクエストが提出されて数日以内に返信が届きます。(私がリクエストを提出した場合は、2営業日でリクエストが受領されたメッセージが届きました)

詳細は公式サイトのChanges to Azure Pipelines free grantsを参照してください。

ARMテンプレートを更新&再デプロイ

ARMテンプレートを更新し、リモートリポジトリに変更をプッシュすると、パイプラインが自動的にリソースを更新します。ここでは、デプロイ時のメッセージを更新してみます。

ローカルリポジトリにあるARMテンプレートファイル(ここではsample.json)を開き、outputsセクションを更新します。(メッセージの内容を適当に変更しています)

GitコマンドでARMテンプレートファイル(sample.json)の変更をリモートリポジトリにプッシュします。

再度Azure Portal上でリソースグループの[設定]セクションから[デプロイ]を選択すると、デプロイ時のメッセージが更新されていることを確認できます。

おわりに

本記事では簡単なARMテンプレートを作成してAzureにデプロイするところまでを行いました。次回は実際にAzure VMなどのAzureリソースをARMテンプレートからデプロイしてみたいと思います。

それでは、また。

この記事を書いた人

目次