ARM テンプレート内の出力

この記事では、Azure Resource Manager テンプレート (ARM テンプレート) で出力値を定義する方法について説明します。 デプロイされたリソースから値を返す必要がある場合に出力を使用します。

各出力値の形式は、いずれかのデータ型に解決される必要があります。

ヒント

ARM テンプレートと同じ機能を備え、構文も使いやすいため、Bicep をお勧めします。 詳細については、「出力」を参照してください。

テンプレートでは出力が 64 個に制限されます。 詳細については、「テンプレートの制限」を参照してください。

出力値の定義

次の例は、デプロイされたリソースからプロパティを返す方法を示しています。

テンプレートに outputs セクションを追加します。 出力値には、パブリック IP アドレスの完全修飾ドメイン名が取得されます。

"outputs": {
  "hostname": {
    "type": "string",
    "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))).dnsSettings.fqdn]"
  },
}

名前にハイフンが含まれているプロパティを出力する必要がある場合は、ドット表記ではなく、名前を角かっこで囲みます。 たとえば、.property-name の代わりに ['property-name'] を使用します。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "variables": {
    "user": {
      "user-name": "Test Person"
    }
  },
  "resources": [
  ],
  "outputs": {
    "nameResult": {
      "type": "string",
      "value": "[variables('user')['user-name']]"
    }
  }
}

条件付き出力

condition 要素を使用して、条件付きで値を返します。 通常、リソースを条件付きでデプロイした場合に条件付き出力を使用します。 次の例は、新しくデプロイされたかどうかに基づいて、パブリック IP アドレスのリソース ID を条件付きで返す方法を示しています。

"outputs": {
  "resourceID": {
    "condition": "[equals(parameters('publicIpNewOrExisting'), 'new')]",
    "type": "string",
    "value": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddresses_name'))]"
  }
}

条件付き出力の簡単な例については、条件付き出力テンプレートに関する説明をご覧ください。

動的な出力の数

場合により、テンプレートの作成時に、返す必要がある値のインスタンスの数が不明なシナリオもあります。 反復出力を使用すると、可変数の値を返すことができます。 copy 要素を追加して、出力を反復します。

"outputs": {
  "storageEndpoints": {
    "type": "array",
    "copy": {
      "count": "[parameters('storageCount')]",
      "input": "[reference(concat(copyIndex(), variables('baseName'))).primaryEndpoints.blob]"
    }
  }
}

詳細については、「ARM テンプレートでの出力の反復処理」を参照してください。

リンク済みテンプレート

関連するテンプレートをデプロイするには、リンク済みテンプレートを使用します。 リンク済みテンプレートから出力値を取得するには、親テンプレートで reference 関数を使用します。 親テンプレートの構文は次のとおりです。

"[reference('<deploymentName>').outputs.<propertyName>.value]"

次の例では、リンクされているテンプレートから値を取得することによってロード バランサーの IP アドレスを設定する方法を示します。

"publicIPAddress": {
  "id": "[reference('linkedTemplate').outputs.resourceID.value]"
}

プロパティ名にハイフンが含まれている場合は、ドット表記ではなく、名前を角かっこで囲みます。

"publicIPAddress": {
  "id": "[reference('linkedTemplate').outputs['resource-ID'].value]"
}

入れ子になったテンプレート の出力セクションでは reference 関数を使用できません。 入れ子になったテンプレート内のデプロイされたリソースの値を返すには、入れ子になったテンプレートをリンク済みテンプレートに変換します。

パブリック IP アドレス テンプレートでは、パブリック IP アドレスが作成され、リソース ID が出力されます。 ロード バランサー テンプレートは、前のテンプレートにリンクします。 ロード バランサーの作成時に出力内のリソース ID が使用されます。

テンプレートの例

次のテンプレートでは、リソースはデプロイされません。 さまざまな型の出力を返すいくつかの方法を示します。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [],
  "outputs": {
    "stringOutput": {
      "type": "string",
      "value": "[deployment().name]"
    },
    "integerOutput": {
      "type": "int",
      "value": "[length(environment().authentication.audiences)]"
    },
    "booleanOutput": {
      "type": "bool",
      "value": "[contains(deployment().name, 'demo')]"
    },
    "arrayOutput": {
      "type": "array",
      "value": "[environment().authentication.audiences]"
    },
    "objectOutput": {
      "type": "object",
      "value": "[subscription()]"
    }
  }
}

出力値の取得

デプロイが成功すると、出力値はデプロイの結果で自動的に返されます。

デプロイ履歴から出力値を取得するには、スクリプトを使用できます。

(Get-AzResourceGroupDeployment `
  -ResourceGroupName <resource-group-name> `
  -Name <deployment-name>).Outputs.resourceID.value

出力でのオブジェクトの並べ替え

JSON では、オブジェクトは 0 個以上のキーと値のペアの順序付けられていないコレクションです。 順序付けは実装によって異なる可能性があります。 たとえば、Bicep items() 関数では、アルファベット順でオブジェクトを並べ替えます。 他の場所では、元の順序を保持できます。 この非決定性のため、デプロイのパラメーターと出力と対話するコードを記述するときは、オブジェクト キーの順序について想定することは避けてください。

次のステップ