Bicep の出力

この記事では、Bicep ファイルで出力値を定義する方法について説明します。 デプロイされたリソースから値を返す必要がある場合に出力を使用します。 Bicep ファイルの出力は 64 個に制限されています。 詳細については、「テンプレートの制限」を参照してください。

出力値の定義

出力値を定義するための構文は次のとおりです。

output <name> <data-type> = <value>

出力の名前を、パラメーター、変数、モジュール、またはリソースと同じにすることはできません。 各出力値は、いずれかのデータ型に解決される必要があります。

次の例は、デプロイされたリソースからプロパティを返す方法を示しています。 この例では、publicIP は Bicep ファイルにデプロイされているパブリック IP アドレスのシンボリック名です。 出力値には、パブリック IP アドレスの完全修飾ドメイン名が取得されます。

output hostname string = publicIP.properties.dnsSettings.fqdn

次の例は、さまざまな型の出力を返す方法を示しています。

output stringOutput string = deployment().name
output integerOutput int = length(environment().authentication.audiences)
output booleanOutput bool = contains(deployment().name, 'demo')
output arrayOutput array = environment().authentication.audiences
output objectOutput object = subscription()

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

var user = {
  'user-name': 'Test Person'
}

output stringOutput string = user['user-name']

条件付き出力

返す値がデプロイの状態によって異なる場合は、? 演算子を使用します。

output <name> <data-type> = <condition> ? <true-value> : <false-value>

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

Bicep で条件付き出力を指定するには、? 演算子を使用します。 次の例では、条件に応じて、エンドポイントの URL または空の文字列を返します。

param deployStorage bool = true
param storageName string
param location string = resourceGroup().location

resource myStorageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' = if (deployStorage) {
  name: storageName
  location: location
  kind: 'StorageV2'
  sku:{
    name:'Standard_LRS'
    tier: 'Standard'
  }
  properties: {
    accessTier: 'Hot'
  }
}

output endpoint string = deployStorage ? myStorageAccount.properties.primaryEndpoints.blob : ''

動的な出力の数

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

output <name> <data-type> = [for <item> in <collection>: {
  ...
}]

次の例では、配列を反復処理します。

param nsgLocation string = resourceGroup().location
param orgNames array = [
  'Contoso'
  'Fabrikam'
  'Coho'
]

resource nsg 'Microsoft.Network/networkSecurityGroups@2020-06-01' = [for name in orgNames: {
  name: 'nsg-${name}'
  location: nsgLocation
}]

output deployedNSGs array = [for (name, i) in orgNames: {
  orgName: name
  nsgName: nsg[i].name
  resourceId: nsg[i].id
}]

詳しくは、「Bicep の反復ループ」をご覧ください。

モジュールからの出力

モジュールから出力値を取得するには、次の構文を使用します。

<module-name>.outputs.<property-name>

次の例では、モジュールから値を取得して、ロード バランサーの IP アドレスを設定する方法を示します。

module publicIP 'modules/public-ip-address.bicep' = {
  name: 'public-ip-address-module'
}

resource loadBalancer 'Microsoft.Network/loadBalancers@2020-11-01' = {
  name: loadBalancerName
  location: location
  properties: {
    frontendIPConfigurations: [
      {
        name: 'name'
        properties: {
          publicIPAddress: {
            id: publicIP.outputs.resourceId
          }
        }
      }
    ]
    // ...
  }
}

出力値の取得

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

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

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

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

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

次のステップ