ARMテンプレートのデプロイにおいてARMテンプレート上で記載されているリソースと既にAzure上にデプロイされているリソースはどのように紐づくのか

特定の情報によって自動的に紐づく

ARM テンプレートのデプロイ時に、下記情報を指定することによって、Azure 上の既存のリソースを特定でき、ARM テンプレートに記載されているリソースと自動的に紐づけられます。

・デプロイ先のスコープ情報:「サブスクリプション ID」、「リソース グループ名」

・ARM テンプレートの “Resource” セクションに含まれる情報:「リソース タイプ」、「リソース名」、「API バージョン」などのリソース情報

上記情報によって Azure リソースの「リソース ID」を判断でき、その「リソース ID」によって Azure 上の既存のリソースを特定できます(デプロイごとにリソース ID と対応する既存リソースが存在するかどうかを自動的に確認しているということです)。

Azureの「リソースID」

Azure の「リソース ID」は、Azure Resource Manager におけるリソースの一意な識別子を示しており、以下のフォーマットで表記されます。

/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderName}/ {resourceType}/{resourceName}

仕組み詳細

ARM テンプレートに含まれているリソースと既にデプロイされているリソースを紐づけている仕組みについて下記に説明します。

まず、ARM テンプレートのデプロイには「スコープ」という概念があります。

「リソース グループ」、「サブスクリプション」、「管理グループ」または「テナント」といった「スコープ」をターゲットにして ARM テンプレートをデプロイすることができます。

詳細については、下記ドキュメントを参照ください。

REST API とテンプレートを使用してリソースをデプロイする – Azure Resource Manager | Microsoft Learn

例えば、「リソース グループ」スコープで ARM テンプレートをデプロイする場合、下記 API によってデプロイが実行されます。

Deployments – Create Or Update – REST API (Azure Resource Management) | Microsoft Learn

===== 抜粋はここから =====

リソース グループにリソースをデプロイします。
テンプレートとパラメーターは、要求または JSON ファイルへのリンクで直接指定できます。

PUT https://management.azure.com/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.Resources/deployments/{deploymentName}?api-version=2021-04-01

===== 抜粋はここまで =====

上記サンプルの通り、リクエスト時には「サブスクリプション ID」、「リソース グループ名」および「デプロイメント名(対象の ARM テンプレート)」が指定されます。

また、ARM テンプレートの “Resource” セクションには対象リソースの「リソース タイプ」、「リソース名」、「API バージョン」などのリソース情報が記載されております。

例:

“resources": [
    {
      “type": “Microsoft.Storage/storageAccounts",
      “apiVersion": “2021-04-01",
      “name": “storageAccountA",
      “location": “[resourceGroup().location]",
      “sku": {
        “name": “Standard_LRS"
      },
      “kind": “StorageV2",
      “properties": {}
    },

]

結果、「サブスクリプション ID」、「リソース グループ名」といったデプロイ先の情報および「リソース タイプ」、「リソース名」などのリソース情報を指定することによって、Azure 上の既存のリソースを特定できて自動的に紐づけられます。