パラメーターと出力を使用して Azure Resource Manager テンプレートの柔軟性を高める

完了

最後のユニットでは、Azure Resource Manager (ARM) テンプレートを作成し、そのテンプレートに Azure ストレージ アカウントを追加しました。 テンプレートに問題があることに気付かれたかもしれません。 ストレージ アカウント名がハード コーディングされています。 このテンプレートは、同じストレージ アカウントを毎回デプロイする目的でしか使用できません。 ストレージ アカウントを別の名前でデプロイするには、新しいテンプレートを作成する必要があり、これは、デプロイを自動化するための実用的な方法ではありません。 ストレージ アカウント SKU もハードコーディングされているため、異なる環境でストレージ アカウントの種類を変更することができません。 このシナリオでは、各デプロイで、異なる種類のストレージ アカウントを使用する可能性があることを思い出してください。 ストレージ アカウント SKU のパラメーターを追加することで、テンプレートを再利用しやすくすることができます。

このユニットでは、テンプレートの parameters および outputs セクションについて説明します。

ARM テンプレート パラメーター

ARM テンプレート パラメーターを使用すると、特定の環境に合わせて調整された値を指定して、デプロイをカスタマイズできます。 たとえば、開発、テスト、運用など、どの目的の環境にデプロイするかに基づいて、異なる値を渡します。 たとえば、前のテンプレートでは、Standard_LRS ストレージ アカウント SKU が使用されています。 ストレージ アカウント SKU の名前をパラメーターにすると、ストレージ アカウントを作成する他のデプロイでこのテンプレートを再利用できます。 次に、テンプレートをデプロイするときに、この特定のデプロイに対して希望する SKU の名前を渡します。 このステップは、コマンドラインで行うことも、パラメーター ファイルを使用して行うこともできます。

テンプレートの parameters セクションで、リソースをデプロイするときに入力できる値を指定します。 テンプレート内のパラメーターは 256 個に制限されます。 パラメーター定義では、ほとんどのテンプレート関数を使用できます。

パラメーターに使用できるプロパティは次のとおりです。

"parameters": {
  "<parameter-name>": {
    "type": "<type-of-parameter-value>",
    "defaultValue": "<default-value-of-parameter>",
    "allowedValues": [
      "<array-of-allowed-values>"
    ],
    "minValue": <minimum-value-for-int>,
    "maxValue": <maximum-value-for-int>,
    "minLength": <minimum-length-for-string-or-array>,
    "maxLength": <maximum-length-for-string-or-array-parameters>,
    "metadata": {
      "description": "<description-of-the-parameter>"
    }
  }
}

使用できるパラメーターの種類は次のとおりです。

  • string
  • secureString
  • integers
  • boolean
  • object
  • secureObject
  • array

パラメーターの使用に関するレコメンデーション

パラメーターは、SKU、サイズ、容量などの環境によって異なる設定に対して使用します。 簡単に識別したり、内部の名前付け規則に準拠したりするために自分で指定したいリソース名にもパラメーターを使用します。 各パラメーターの説明を入力し、可能な限り既定値を使用します。

セキュリティ上の理由から、テンプレート内ではユーザー名やパスワードをハード コーディングしたり、既定値を指定したりしないでください。 ユーザー名とパスワード (またはシークレット) には常にパラメーターを使用します。 すべてのパスワードとシークレットに secureString を使用します。 JSON オブジェクトで機密データを渡す場合は、secureObject 型を使用します。 secureString 型や secureObject 型のテンプレート パラメーターは、リソースのデプロイ後に読み取ったり、収集したりすることはできません。

ARM テンプレートでパラメーターを使用する

ARM テンプレートの parameters セクションには、リソースをデプロイするときに入力できるパラメーターを指定します。 テンプレートではパラメーターが 256 個に制限されます。

テンプレートの parameters セクションに、ストレージ アカウント SKU のパラメーターが定義されているテンプレート ファイルの例を次に示します。 実行時に値が指定されていない場合は、使用されるパラメーターの既定値を指定できます。

"parameters": {
  "storageAccountType": {
    "type": "string",
    "defaultValue": "Standard_LRS",
    "allowedValues": [
      "Standard_LRS",
      "Standard_GRS",
      "Standard_ZRS",
      "Premium_LRS"
    ],
    "metadata": {
      "description": "Storage Account type"
    }
  }
}

次に、リソース定義でパラメーターを使用します。 構文は [parameters('name of the parameter')] です。 次に、デプロイするときに parameters 関数を使います。 次のモジュールで、関数について詳しく説明します。

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2023-05-01",
    "name": "learntemplatestorage123",
    "location": "[resourceGroup().location]",
    "sku": {
      "name": "[parameters('storageAccountType')]"
    },
    "kind": "StorageV2",
    "properties": {
      "supportsHttpsTrafficOnly": true
    }
  }
]

テンプレートをデプロイするときに、パラメーターの値を指定できます。 次のコマンドの最後の行に注目してください。

templateFile="azuredeploy.json"
az deployment group create \
  --name testdeployment1 \
  --template-file $templateFile \
  --parameters storageAccountType=Standard_LRS

ARM テンプレートの出力

ARM テンプレートの outputs セクションでは、デプロイが成功した後に返される値を指定できます。 Outputs セクションを構成する要素を次に示します。

"outputs": {
  "<output-name>": {
    "condition": "<boolean-value-whether-to-output-value>",
    "type": "<type-of-output-value>",
    "value": "<output-value-expression>",
    "copy": {
      "count": <number-of-iterations>,
      "input": <values-for-the-variable>
    }
  }
}
要素 説明
output-name 有効な JavaScript 識別子で指定する必要があります。
condition (省略可能) この出力値が返されるかどうかを示すブール値。 true の場合、デプロイの出力に値が含まれます。 false の場合、このデプロイでは出力値がスキップされます。 指定しない場合、既定値は true です。
type 出力値の型。
value (省略可能) 評価され、出力値として返されるテンプレート言語式。
copy (省略可能) copy は、出力に複数の値を返すために使用されます。

ARM テンプレートで出力を使用する

ストレージ アカウントのエンドポイントを出力する例を次に示します。

"outputs": {
  "storageEndpoint": {
    "type": "object",
    "value": "[reference('learntemplatestorage123').primaryEndpoints]"
  }
}

式の reference 部分に注目してください。 この関数は、ストレージ アカウントの実行時の状態を取得します。

ARM テンプレートを再度デプロイする

ARM テンプレートは "べき等" であることを思い出してください。つまり、このテンプレートは同じ環境に再度デプロイでき、テンプレートで何も変更されていない場合は、環境内で何も変更されません。 テンプレートに変更が加えられた場合 (パラメーター値を変更した場合など) は、その変更のみがデプロイされます。 テンプレートには、Azure ソリューションに必要なすべてのリソースを含めることができ、テンプレートを安全に再実行できます。 リソースは、既存のものがない場合にのみ作成され、変更がある場合にのみ更新されます。