次の方法で共有


Bicep の出力

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

出力を定義する

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

output <name> <data-type or type-expression> = <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']

次の例は、型式の使い方を示したものです。

param foo 'a' | 'b' = 'a'

output out 'a' | 'b' = foo

詳しくは、ユーザー定義関数 をご覧ください。

デコレーターを使用する

デコレーターは、@expression の形式で記述され、出力宣言の上に配置されます。 次の表に、出力で使用できるデコレーターを示します。

デコレーター [適用対象] 引数 説明
説明 all string 出力の説明を指定します。
discriminator オブジェクト string このデコレーターを使用して、正しいサブクラスが識別され管理されていることを確認します。 詳細については、「カスタム タグ付き共用体データ型」を参照してください。
maxLength array、string int 文字列および配列の出力の最大長。 この値は包含値です。
maxValue INT int 整数出力の最大値。 この値は包含値です。
metadata all オブジェクト 出力に適用するカスタム プロパティ。 description デコレーターに相当する description プロパティを含めることができます。
minLength array、string int 文字列および配列の出力の最小長。 この値は包含値です。
minValue INT int 整数出力の最小値。 この値は包含値です。
sealed オブジェクト なし ユーザー定義データ型のプロパティ名が入力ミスである可能性が高い場合に、BCP089 を警告からエラーに昇格させます。 詳細については、「エラー レベルの昇格」を参照してください。

デコレーターは、sys 名前空間にあります。 このデコレーターを同じ名前の別の項目と区別する必要がある場合は、デコレータの前に「sys」を付けます。 たとえば、Bicep ファイルに description という名前のパラメーターが含まれている場合、description デコレーターを使用するときに、sys 名前空間を追加する必要があります。

@sys.description('The name of the instance.')
param name string
@sys.description('The description of the instance to display.')
param description string

説明

説明を追加するには、出力の宣言に description を追加します。 次に例を示します。

@description('Conditionally output the endpoint.')
output endpoint string = deployStorage ? myStorageAccount.properties.primaryEndpoints.blob : ''

説明のテキストとして Markdown 形式のテキストを使用できます。

識別子

カスタム タグ付き共用体データ型」を参照してください。

整数の制約

整数出力の最小値と最大値を設定できます。 一方または両方の制約を設定できます。

var thisMonth = 3

@minValue(1)
@maxValue(12)
output month int = thisMonth

長さの制限

文字列と配列の出力の最小長と最大長を指定できます。 一方または両方の制約を設定できます。 文字列の場合、長さは文字数を示します。 配列の場合、長さは配列内の項目数を示します。

次の例では、2 つの出力を宣言します。 1 つ目の出力は、文字数が 3 - 24 である必要があるストレージ アカウント名用です。 もう 1 つの出力は、項目数が 1 - 5 個である必要がある配列です。

var accountName = uniqueString(resourceGroup().id)
var appNames = [
  'SyncSphere'
  'DataWhiz'
  'FlowMatrix'
]

@minLength(3)
@maxLength(24)
output storageAccountName string = accountName

@minLength(1)
@maxLength(5)
output applicationNames array = appNames

Metadata

出力に適用するカスタム プロパティがある場合は、メタデータ デコレーターを追加します。 メタデータ内で、カスタムの名前と値を持つオブジェクトを定義します。 メタデータに対して定義するオブジェクトには、任意の名前と型のプロパティを含めることができます。

このデコレーターを使用して、説明に追加しても意味のない出力に関する情報を追跡できます。

var obj = {}
@description('Configuration values that are applied when the application starts.')
@metadata({
  source: 'database'
  contact: 'Web team'
})
output settings object = obj

別のデコレーターと競合するプロパティを持つ @metadata() デコレーターを指定すると、その別のデコレーターが @metadata() デコレーター内のいずれよりも常に優先されます。 そのため、@metadata() 値内の競合するプロパティは冗長であり、置き換えられます。 詳細については、「競合するメタデータがない」を参照してください。

Sealed

エラー レベルを昇格させる」を参照してください。

条件付き出力

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

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@2023-04-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@2023-11-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@2023-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() 関数では、アルファベット順でオブジェクトを並べ替えます。 他の場所では、元の順序を保持できます。 この非決定性のため、デプロイのパラメーターと出力と対話するコードを記述するときは、オブジェクト キーの順序について想定することは避けてください。

次のステップ