1. ホーム
  2. azure

[解決済み] ARMのテンプレートです。パラメータで名前を設定したリソースを参照する方法

2022-03-14 16:26:44

質問

Azure Resource Manager のテンプレートで、ストレージアカウントをスピンアップしているのですが、その名前が以下のようにパラメータで設定されています。

"resources": [
    {
        "name": "[parameters('storageAccountName')]",
        "type": "Microsoft.Storage/storageAccounts",

リソースの詳細を出力したいのですが、私が見つけたほとんどの例がリソースを名前で参照しているため、ストレージアカウントを参照する方法が見当たりません。

こんなことをやってみました。

    "outputs": {
    "storageKey": {
        "type": "string",
        "value": "[reference([parameters('storageAccountName')])]"
    }
}

しかし、エラーメッセージが表示されます。

行 '49' と列 '23' のテンプレート出力 'storageKey' は有効ではありません。 Unable to parse language expression 'reference([parameters('storageAccountName')])': expected token 'Identifier' and actual 'LeftSquareBracket'.

では、parameters.json ファイルを使ってリソースの名前を設定した場合、どのように参照すればよいのでしょうか。

どのように解決するのですか?

既存の答えに追加するだけです(それはそれでいいのですが、不完全です)。 resourceId() 関数を使用します。

reference(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), 'api-version-goes-here')

その理由はいくつかあります。

  1. これはリソースを参照する普遍的な方法です。この方法を使って、別のリソースグループや別のサブスクリプションのリソースを参照できます(同じデプロイメント内のリソースだけではありません)。
  2. 異なるタイプで同じ名前のリソースが2つ以上ある場合(例えばストレージアカウントと仮想マシン)、どのリソースをターゲットにしているのか判断できないため、既存の回答は失敗します。

ps. dependsOn を使用する方がより信頼性が高いと思います。 resourceId() 特に複雑なテンプレートではね。