This is the Trace Id: 9ac60c2fd406b884300cd44f3413e9ee

政府・公共機関向け Microsoft Azure  > 7. Azure 環境のテンプレート

Azure 環境のテンプレート

~コードによる Azure リソースの作成と管理~

画像:屋外の倉庫のイメージ

Microsoft Azure リソースの作成方法 

Microsoft Azure のリソースを作成して展開する方法としては、以下のようなものがあります。 

  1. GUI ツールである 「Azure Portal (Web ブラウザでアクセス)」 を利用する
  2. コマンドラインツールである 「Azure PowerShell」/「Azure CLI」 を利用する
  3. Azure REST API」 を利用する
     

上記ツールの概要と使い方を学びたい方は、以下の Microsoft Learn をご参照ください。

Azure REST API の利用方法に関する参考情報については以下をご参照ください。 

Azure Portal や Azure PowerShell / Azure CLI を用いれば、Azure リソースの作成は可能であり一般的に利用される手法となります。 
クラウドを利用するシステムが増えて管理システム数が増えた場合や、今後クラウド上に新たなシステムを多数展開する場合においては、この手法によるリソース作成が最適でなく課題となる場合もあります。 
クラウドの利用をシステム単位に捉え、都度個別に作成を自由に行う場合に発生する可能性のある具体的な課題例としては以下のようなものがあります。 

  1. 反復作業にも関わらず工数が削減できない、必要以上に時間がかかっている
    • 同じようなアーキテクチャのシステム (例: Web/AP/DB) を展開するのに、各システム単位で毎回同じような作成作業を行っている 
    • システム単位には 1 度の作業でも全体からすると何十回と同じ作業が行われており、標準化・自動化すべきところを最適化できていない 
    • 開発、テスト、本番などのインフラストラクチャ作成が自動化されておらず追加のテスト等が簡単にはできない
  2. システムのアーキテクチャや品質が安定しない
    • 達成したい目的がほぼ同じシステム (例: Web/AP/DB) なのに、システム単位にアーキテクチャが大きく異なり、成功するシステムもあれば問題を抱えてしまうシステムもある
    • 本来アーキテクチャはベストプラクティスにそったものであるべきところが、システム単位に統制のとれていない自由なアーキテクチャが採用されてしまい、運用管理面において不必要な問題や負荷を生じさせている

上記の課題例をイメージ図にしたものが下記です。

画像:システムA、B、Cの課題例

このような課題を解決する手法として、Azure リソースのコードによる定義と、定義したコードによるデプロイの自動化が推奨されています。 このような考え方は、Infrastructure as Code (IaC) とも呼ばれます。Infra structure as a Code (IaC) についてより詳しくお知りになりたい方は、「コードとしてのインフラストラクチャとは」をご参照ください。

IaC によりインフラストラクチャをコード定義する事ができるため、ベストプラクティスに準拠したアーキテクチャそのものを組織内外で共有する事が可能となります。
IaC を用いた場合の具体的なメリットとしては以下のようなものがあります。

  1. ベストプラクティスに準拠した成功するシステムを組織内外で共有・再利用できる
  2. 冪等性が確保され、必ず毎回同じインフラストラクチャが展開される事が保証できる
  3. インフラストラクチャの展開や管理工数が削減でき、ベストプラクティスに準拠する事でシステムが安定する
  4. インフラストラクチャをコードで定義する事で、自動展開やバージョン管理を行う事が可能となるため、アジャイル開発や DevOps 等の考え方にインフラストラクチャを組み込む事が可能となる

上記のメリットをイメージ図にしたものが下記です。

画像:IaC の考え方を用いたリソース展開と管理

Microsoft Azure 上においても、Infra structure as a Code (IaC) の考え方を利用してリソースの展開と管理を行う事で様々なメリットが得られ、クラウド環境をより有効活用する事が可能となります。

Azure Resource Manager template (ARM テンプレート)

Microsoft Azure 上で Infrastructure as a Code (IaC) の考え方を実現する機能として、Azure Resource Manager Template が標準提供されています。
Microsoft 提供の標準機能以外に、サードパーティプラットフォームでサポートされている「Terraform」等の IaC 機能を代わりに使用する事もできます。

本節では、Infrastructure as a Code (IaC) を実現する標準機能である Azure Resource Manager template (ARM テンプレート) の概要について説明します

Microsoft Azure にリソースを展開する時によく利用される CLI 機能として、Azure PowerShell / Azure CLI があります。いずれの機能を利用する場合においても、実際に Microsoft Azure に指示を出す時は内部的に Application Programming Interface (API) と呼ばれる Microsoft Azure に指示を出すためのインターフェースに接続しています。
Azure PowerShell / Azure CLI と ARM テンプレート は、最終的に全く同じリソースが展開できる点では同じですが、実際の利用方法は大きく異なります。
Azure PowerShell/CLI は命令型コードであり、ARM テンプレートは宣言型コードです。
命令型はステップバイステップでリソース展開を定義し、最終的インフラストラクチャを完成させます。宣言型は最終的な構成のみを定義しインフラストラクチャを完成させます。

下図のような仮想マシンと DB で構成される単純なインフラストラクチャを例に比較してみます。

画像:仮想マシンと DB で構成される単純なインフラストラクチャ

命令型である Azure PowerShell / Azure CLI を利用して上記イメージ図のような仮想マシンと DB で構成されるインフラストラクチャを完成させる場合、単純化すると以下の処理を順番に実行する事が必要になります。

  1. Virtual Network を作成する
  2. 仮想マシンを作成する
  3. DB を作成する
     

つまり、上記のような 1 つ 1 つの処理を行うためのコマンドをスクリプトとして記述していく必要があり、1 つ 1 つのコマンドは完全に独立したものとして実行されます。実行順序もスクリプト中で制御する必要があります。例えば、必ず Virtual Network を先に作成してから、仮想マシンを作成しないとエラーとなります。
Microsoft Azure 側も 1 つ 1 つの処理の相関を感知する事はできず、単純に別々の 1 つ 1 つの処理命令が来ているとしか認識できません。
各処理のスクリプト量も多くなり、作成者の技量によりスクリプト自体の品質もバラつきが発生します。手軽さゆえにコーディング規約が無い場合も想定され、俗人的なスクリプトを適切に管理し組織内外で共有するのは容易ではありません。
また、Azure PowerShell や Azure CLI のバージョンによりコマンド体系やパラメータが変更になる場合があり、その場合はスクリプト自体の更新が必要となります。
自分だけが理解できればいい自己学習用環境、組織内外での共有などを考える必要が無い状況においては、Bash や PowerShell に慣れている場合はすぐに使い始められるといったメリットやスクリプトならではの自由度もあり非常に有用です。実際に多くのユーザに Azure PowerShell や Azure CLI は数多く利用されています。

ARM テンプレートの場合は宣言型となり、インフラストラクチャ定義をコードで行います。

  1. 仮想マシンと DB と Virtual Network で構成されるインフラストラクチャのコードによる定義

処理が 1 つになっただけのように思えますが、全く異なります。ARM テンプレートはインフラストラクチャそのものを定義しているのであり、1 つ 1 つの処理を記述しているのではありません。
この違いをイメージ図にしたものが下記です。

画像:Azure PowerShell/CLI と ARM テンプレート詳細

ARM テンプレートを利用する事で複雑なシステム構成を、「ベストプラクティスを考慮した共有可能なインフラストラクチャを定義したコード」として扱う事が可能となり、IaC による管理が実現します。組織全体としてクラウドを利用し、組織全体としてインフラストラクチャを統合管理していく場合は ARM テンプレートの利用がより推奨されます。

ARM テンプレートについてより詳しくお知りになりたい方は、公式ドキュメントの「ARM テンプレートとは」をご参照ください。

JSON と Bicep

Azure Resource Manager template (ARM テンプレート) を用いたインフラストラクチャ定義は、JavaScript Object Notation (JSON) 形式か Domain-Specific Language (DSL) である Bicep 言語を利用します。
JSON と Bicep のどちらを用いてARM テンプレートを定義したとしても、ARM テンプレートは最終的には JSON に変換されて Microsoft Azure に必要なリソースが展開されます。
Bicep 登場の背景としては、JSON 構文による定義は冗長である場合があり、Microsoft は Microsoft Azure 用にインフラストラクチャを定義するための全く新しい Domain-Specific Language (DSL) である Bicep 言語を開発しました。Bicep 言語は JSON で記述された ARM テンプレートに対して透過的な抽象化レイヤです。ARM テンプレートは、JSON で記述しても、Bicep で記述しても同様に動作します。JSON で記述された ARM テンプレートを Bicep に変換する変換ツールも提供されています。ARM テンプレートを定義するのに、JSON と Bicep のどちらを利用してもかまいません。また、ARM テンプレートを JSON で定義しても、Bicep 言語で定義してもどちらも無償で利用できます。

ARM テンプレートを学習しながら試してみたい方は、以下 Microsoft Learn をご参照ください。 

ARM テンプレートの JSON と Bicep の詳細については以下公式ドキュメントをご参照ください。 

JSON と Bicep による Azure リソースのテンプレート定義は以下をご参照ください。 

リファレンス アーキテクチャとテンプレート

ARM テンプレートがあれば、ベストプラクティスに準拠したアーキテクチャを IaC として管理する事が可能となります。
クラウドを使い始めたばかりの組織の場合は、自組織に最適なベストプラクティスを盛り込んだアーキテクチャを最初から作成し、それをARM テンプレート化する事は難しい場合もあります。 
Microsoft Azure では、ビジネスや業務の目的ごとに参考となるアーキテクチャ(リファレンス アーキテクチャ)の情報が公開されています。また、参考となる ARM テンプレートも公開されています。 
最終的には各組織単位に独自のベストプラクティスを盛り込んだ ARM テンプレートを管理していく事になりますが、まずは参考となるリファレンス アーキテクチャと ARM テンプレートを用いて IaC による管理をスタートする事が可能です。 

例えばリファレンス アーキテクチャの例としては以下のようなものがあります。
スケーラブルな Web アプリケーション」 

図:Azure App Service Web アプリケーションでスケーラビリティとパフォーマンスを改善するための実証済みの方法
図:Azure Virtual Desktop の標準的なアーキテクチャ セットアップ
図:Azure Kubernetes Service (AKS) クラスターに関するリファレンス アーキテクチャ

公開されているリファレンス アーキテクチャ一については以下をご参照ください。 

参考となる Quick Start Template については以下をご参照ください。

Azure 各サービス単位の ARM テンプレート定義リファレンスにも参考となる ARM テンプレートへのリンクがある場合があります。
Azure の各サービス単位に参考となる ARM テンプレートを探す事もできますので、実際に ARM テンプレートを作成される方や知見のある方は以下をご参照ください。 

Azure のアーキテクチャで最初に検討すべきこと 

ARM テンプレートによる IaC を用いればベストプラクティスやリファレンス アーキテクチャに準拠したシステムを展開する事が可能となります。
システム数が多くなり組織として管理すべきクラウドの規模が大きくなる場合は、各システムの ARM テンプレートを開発する前に事前に考慮し決定しておくべき事があります。
それは Azure 環境の管理やガバナンスに関する内容です。

大規模な組織において多数のシステムが存在する場合、各システムのアーキテクチャよりも全体の環境を管理するための設計の方が遥かに重要です。 
Azure においては環境を効率よく統合管理するためのリファレンス情報と、統合管理を効率よく行うための参考となる ARM テンプレートが公開されています。Azure 上の管理機能サービスは ARM テンプレートで実装する事が可能なため、統合管理のリファレンスを IaC で展開する事も可能です。

どの組織においても基本部分の設計は大きく異なる事はないですが、詳細部については組織単位に最適解は全く異なります。例えば、セキュリティ、ガバナンス、ネットワークに求める要件は組織毎に大きく異なります。そのため、リファレンス情報を用いた自組織での事前検討が強く推奨されます。Azure では、大規模な組織のためのリファレンス情報を Enterprise-Scale (エンタープライズスケール) として公開しています。

エンタープライズスケールの詳細については以下をご参照ください。 
概念、統合管理に必要となるサービス、事前検討に必要なポイントなどが網羅されています。 

エンタープライズスケールの ARM テンプレートを含む参考実装については以下をご参照ください。

本情報の内容 (添付文書、リンク先などを含む) は、作成日時点でのものであり、予告なく変更される場合があります。