ARMテンプレート基礎

2024年5月4日

オブジェクト形式とは


JSONにおける「オブジェクト形式」とは、キーと値のペアの集合を表すデータ構造のことを指します。JSONオブジェクトは波括弧({})で囲まれ、中には0個以上のキーと値のペアがコンマ(,)で区切られて記述されます。各ペアはキー(文字列)と値(どんなJSONデータ型も可)から成り立っています。

JSONオブジェクトの例

{
    "name": "John",
    "age": 30,
    "isStudent": false,
    "address": {
        "street": "123 Main St",
        "city": "Anytown"
    },
    "phoneNumbers": ["123-456-7890", "987-654-3210"]
}

この例では、nameageisStudentaddress、および phoneNumbers がキーです。それぞれのキーに対応する値として、文字列、数値、ブール値、別のオブジェクト、そして配列が使用されています。

オブジェクト形式の特徴

  • 構造化: キーと値のペアを使用することでデータが構造化され、プログラムからアクセスしやすくなります。
  • 階層性: オブジェクトは他のオブジェクトを含めることができ、複雑な階層的データ構造を作成することが可能です。
  • 柔軟性: オブジェクト内の値として文字列、数値、配列、真偽値、さらにはnullなど、任意のJSON型を使用できます。

オブジェクト形式は、プログラミング言語の辞書やハッシュマップ、レコードなどと似たデータ構造に相当します。これにより、データに名前付きでアクセスできるため、情報を整理しやすく、プログラム内で効率的に扱うことができます。

2つのデプロイモード

https://learn.microsoft.com/ja-jp/training/modules/arm-template-whatif/2-deployment-modes?pivots=jsonpowershell

増分モード

既定のデプロイ モードは “増分" です。 このモードでは、Resource Manager は何も削除しません。 リソース グループに存在するが、テンプレートで指定されていないリソースは、Resource Manager によって変更されず、そのまま残されます。 テンプレート内のリソースは、まだ存在しない場合、リソース グループに “追加" されます。存在している場合は、Resource Manager によって、テンプレート内の構成に更新されます。

完全モード

デプロイを “完全" モードで実行するには、明示的に要求する必要があります。 このモードを使用する場合、Azure 内に存在するが、テンプレートで指定されていないリソースは削除されます。 完全モードでは、リソース グループ内のすべてのリソースが削除されるわけではありません。一部のリソースの種類は除外されます

完全モードを使用する必要がある状況

デプロイする際に必ず完全モードを使用すると、誤ったリソースが後に残らないようにすることができます。 つまり、環境内の “構成のドリフト" を回避するのに役立ちます。

★”構成のドリフト”とは、管理されている環境の実際の構成が、その環境がもともと意図されていた設定や定義から時間とともに逸脱すること

AzureリソースをARMテンプレートでエクスポートすることについて

そもそものエクスポートの位置づけ

テンプレートのエクスポートで記載されるテンプレートは、そもそもデプロイテンプレートにそのまま使えるものではありません。デプロイテンプレートとは若干形式が異なるため修正が必要なものとなります。

以下、公式ドキュメントからの抜粋です。

テンプレートをデプロイする – Azure portal – Azure Resource Manager | Microsoft Learn

エクスポートしても、Azureリソースが完全にARMテンプレートに反映されないケース有

例①秘密鍵、シークレット等、各サービスが意図してARMテンプレートにエクスポートしないもの

例えばApplication Gatewayにアップロードした証明書の秘密鍵などはARMテンプレートに記載されません。

例②Blobストレージに格納されるBlobデータの様な、データプレーンに該当するため、ARMにエクスポートされないもの

例えばBlobストレージのBlobデータや、SQL DBに格納されるデータなどはARMテンプレートに記載されません。

例③ARMテンプレートと各サービスの互換性がないため、エクスポートされないもの

端的に言えば、ARM テンプレートと各サービスの互換性がないため、エクスポート時に警告が表示されることがあります。
エクスポートできないリソースタイプがあると指摘されてしまいます。
Japan PaaS Support Team Blog (azure.github.io)

参考

他にもデプロイテンプレートに必要な情報を集める手段として、各サービスが提供しているREST APIから、各サービスの構成を取得するGET APIがあります。
例えばAzure Storageでは下記の様なAPIを提供しています。
Storage Accounts – Get Properties – REST API (Azure Storage Resource Provider) | Microsoft Learn