この記事では、Bicep ファイルで出力値を定義する方法について説明します。 デプロイされたリソースから値を返す必要がある場合は、出力を使用します。 Bicep ファイルでは出力が 64 個に制限されます。 詳細については、「テンプレートの制限」を参照してください。
出力を定義する
出力値を定義するための構文は次のとおりです。
output <name> <data-type or type-expression> = <value>
出力の名前を、パラメーター、変数、モジュール、またはリソースと同じにすることはできません。 各出力値は、Bicep の データ型 または ユーザー定義データ型 のいずれかに解決する必要があります。
次の例は、デプロイされたリソースからプロパティを返す方法を示しています。 この例では、 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
の形式で記述され、出力宣言の上に配置されます。 次の表に、出力に使用できるデコレーターを示します。
デコレーター | [適用対象] | 引数 | 説明 |
---|---|---|---|
説明 | 全て | ひも | これにより、出力の説明が提供されます。 |
ディスクリミネーター | オブジェクト | ひも | このデコレーターを使用して、正しいサブクラスが識別され管理されていることを確認します。 詳細については、「カスタム タグ付き共用体データ型」を参照してください。 |
maxLength | array、string | 整数 (int) | これにより、文字列と配列の出力の最大長が提供され、値は包括的です。 |
maxValue | 整数 (int) | 整数 (int) | これにより、整数出力の最大値が提供され、値は包括的です。 |
metadata | 全て | オブジェクト | これにより、出力に対してカスタムプロパティを適用できるようになり、その中には description デコレーターと同等の説明プロパティを含めることができます。 |
minLength | array、string | 整数 (int) | これにより、文字列と配列の出力の最小長が提供され、値は包括的です。 |
minValue | 整数 (int) | 整数 (int) | これにより、整数出力の最小値が提供され、値は包括的です。 |
密封 | オブジェクト | なし | ユーザー定義データ型のプロパティ名が入力ミスである可能性が高い場合に、BCP089 を警告からエラーに昇格させます。 詳細については、「エラー レベルの昇格」を参照してください。 |
安全 | string、object | なし | 出力をセキュリティで保護されたものとしてマークします。 セキュリティで保護された出力の値はデプロイ履歴に保存されず、ログに記録されません。 詳細については、「セキュリティで保護された文字列とオブジェクト」を参照してください。 |
デコレーターは、sys
名前空間にあります。 このデコレーターを同じ名前の別の項目と区別する必要がある場合は、デコレータの前に「sys
」を付けます。 たとえば、Bicep ファイルに 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('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
メタデータ
出力に適用するカスタム プロパティがある場合は、メタデータ デコレーターを追加します。 メタデータ内で、カスタムの名前と値を持つオブジェクトを定義します。 メタデータに対して定義するオブジェクトには、任意の名前と型のプロパティを含めることができます。
このデコレーターを使用して、説明に追加しても意味のない出力に関する情報を追跡できます。
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()
値内の競合するプロパティは冗長であり、置き換えられます。 詳細については、「 リンター ルール - 競合するメタデータなし」を参照してください。
密封
「エラー レベルを昇格させる」を参照してください。
セキュリティで保護された出力
Bicep バージョン 0.35.1 以降では、文字列またはオブジェクトの出力を安全としてマークできます。 出力が @secure()
で修飾されている場合、Azure Resource Manager は出力値を機密として扱い、デプロイ履歴、Azure portal、またはコマンド ライン出力に出力がログに記録または表示されないようにします。
@secure()
output demoPassword string
@secure()
output demoSecretObject object
@secure()
デコレーターは、ARM テンプレートの secureString 型と secureObject 型と一致するため、文字列型またはオブジェクト型の出力に対してのみ有効です。 配列または数値を安全に渡すには、それらを secureObject でラップするか、secureString としてシリアル化します。
条件付き出力
返す値がデプロイの状態によって異なる場合は、?
演算子を使用します。
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() 関数は、オブジェクトをアルファベット順に並べ替えます。 他の場所では、元の順序を保持できます。 この非決定的な理由から、デプロイ パラメーターと出力と対話するコードを記述するときに、オブジェクト キーの順序に関する前提を立てないでください。
次のステップ
出力に使用できるプロパティについては、 Bicep ファイルの構造と構文に関するページを参照してください。