次の方法で共有


Bicep モジュール

Bicep を使用すると、デプロイをモジュールにまとめることができます。 モジュールは、別の Bicep ファイルがデプロイする Bicep ファイルです。 モジュールには、JSON 用の Azure Resource Manager テンプレート (ARM テンプレート) を指定することもできます。 モジュールを使用して、デプロイの複雑な詳細をカプセル化することで、Bicep ファイルの読みやすさが向上します。 また、モジュールを異なるデプロイに簡単に再利用することもできます。

組織内の他のユーザーとモジュールを共有するには、 テンプレート スペック または プライベート レジストリを作成します。 レジストリ内のテンプレート スペックとモジュールは、適切なアクセス許可を持つユーザーのみが使用できます。

ヒント

モジュール レジストリとテンプレート スペックの選択は、ほとんど好みの問題です。 2 つから選択するときに考慮すべき点がいくつかあります。

  • モジュール レジストリは、Bicep でのみサポートされています。 Bicep を使用していない場合は、テンプレート スペックを使用します。
  • Bicep モジュール レジストリ内のコンテンツは、別の Bicep ファイルからのみデプロイできます。 テンプレート スペックは、API、Azure PowerShell、Azure CLI、Azure portal から直接デプロイできます。 UiFormDefinition を使用して、ポータルのデプロイ エクスペリエンスをカスタマイズすることさえできます。
  • Bicep には、 loadTextContent 関数と loadFileAsBase64 関数を使用して、他のプロジェクト成果物 (Bicep 以外のファイルや PowerShell スクリプト、CLI スクリプトなどの ARM 以外のテンプレート ファイルなど) を埋め込むためのいくつかの制限付き機能があります。 テンプレート スペックでは、これらのアーティファクトをパッケージ化することはできません。

Bicep モジュールは、入れ子になったテンプレートを持つ単一の ARM テンプレートに変換されます。 Bicep が構成ファイルを解決する方法と、Bicep がユーザー定義の構成ファイルを既定の構成ファイルとマージする方法の詳細については、「 構成ファイル解決プロセス構成ファイルのマージ プロセス」を参照してください。

トレーニング リソース

ステップ バイ ステップ ガイダンスを使用してモジュールについて学習する場合は、「モジュールを 使用して構成可能な Bicep ファイルを作成する」を参照してください。

モジュールを定義する

モジュールを定義するための基本的な構文は次のとおりです。

@<decorator>(<argument>)
module <symbolic-name> '<path-to-file>' = {
  name: '<linked-deployment-name>'
  params: {
    <parameter-names-and-values>
  }
}

単純で実際の例は次のようになります。

module stgModule '../storageAccount.bicep' = {
  name: 'storageDeploy'
  params: {
    storagePrefix: 'examplestg1'
  }
}

JSON 用の ARM テンプレートをモジュールとして使用することもできます。

module stgModule '../storageAccount.json' = {
  name: 'storageDeploy'
  params: {
    storagePrefix: 'examplestg1'
  }
}

Bicep ファイルの別の部分にあるモジュールを参照するには、シンボリック名を使用します。 たとえば、シンボリック名を使用して、モジュールからの出力を取得できます。 シンボリック名には、a - z、A - Z、0 - 9、アンダースコア (_) を含めることができます。 名前の先頭を数字にすることはできません。 モジュールの名前を、パラメーター、変数、またはリソースと同じにすることはできません。

パスは、ローカル ファイルでもレジストリ内のファイルでもかまいません。 ローカル ファイルには、Bicep ファイルまたは JSON 用の ARM テンプレートを指定できます。 詳細については、「モジュールへのパス」を参照してください。

name プロパティは省略可能です。 生成されるテンプレートでは、それは入れ子になったデプロイ リソースの名前になります。 名前が指定されていない場合は、入れ子になったデプロイ リソースの名前として GUID が生成されます。

静的な名前のモジュールが同じスコープに同時にデプロイされる場合、一方のデプロイがもう一方のデプロイからの出力に干渉する可能性があります。 たとえば、2 つの Bicep ファイルが同じ静的名 (examplemodule) を持つ同じモジュールを使用し、同じリソース グループを対象としている場合、1 つのデプロイで間違った出力が表示される可能性があります。 同じスコープへの同時デプロイが心配な場合は、モジュールに一意の名前を付けてください。 一意のモジュール名を確保するもう 1 つの方法は、 name プロパティを省略することです。一意のモジュール名が自動的に生成されます。

次の例では、デプロイ名をモジュール名に連結します。 デプロイに一意の名前を指定すると、モジュール名も一意です。

module stgModule 'storageAccount.bicep' = {
  name: '${deployment().name}-storageDeploy'
  scope: resourceGroup('demoRG')
}

モジュール名を指定しないのも有効です。 GUID がモジュール名として生成されます。

module stgModule 'storageAccount.bicep' = {
  scope: resourceGroup('demoRG')
}

メイン ファイルのスコープとは異なる スコープを指定 する必要がある場合は、スコープ プロパティを追加します。 詳細については、「モジュールのスコープを設定する」を参照してください。

// deploy to different scope
module <symbolic-name> '<path-to-file>' = {
  name: '<linked-deployment-name>'
  scope: <scope-object>
  params: {
    <parameter-names-and-values>
  }
}

モジュールを条件付きでデプロイするには、if 式を追加します。 これは、 リソースを条件付きでデプロイするのと似ています。

// conditional deployment
module <symbolic-name> '<path-to-file>' = if (<condition-to-deploy>) {
  name: '<linked-deployment-name>'
  params: {
    <parameter-names-and-values>
  }
}

モジュールの複数のインスタンスをデプロイするには、for 式を追加します。 batchSizeデコレーターを使用して、インスタンスを順次デプロイするか並列にデプロイするかを指定します。 詳細については 、「Bicep の反復ループ」を参照してください

// iterative deployment
@batchSize(int) // optional decorator for serial deployment
module <symbolic-name> '<path-to-file>' = [for <item> in <collection>: {
  name: '<linked-deployment-name>'
  params: {
    <parameter-names-and-values>
  }
}]

リソースと同様に、モジュールは、他のモジュールやリソースに依存しない限り、並列でデプロイされます。 通常、依存関係は暗黙的に決定されるため、設定する必要はありません。 明示的な依存関係を設定する必要がある場合は、モジュール定義に dependsOn を追加します。 依存関係の詳細については、「 Bicep のリソースの依存関係」を参照してください。

module <symbolic-name> '<path-to-file>' = {
  name: '<linked-deployment-name>'
  params: {
    <parameter-names-and-values>
  }
  dependsOn: [
    <symbolic-names-to-deploy-before-this-item>
  ]
}

モジュールへのパス

モジュールのファイルには、ローカル ファイルまたは外部ファイルのいずれかを指定できます。 外部ファイルは、テンプレート スペックまたは Bicep モジュール レジストリに含めることができます。

ローカル ファイル

モジュールがローカル ファイルの場合は、そのファイルへの相対パスを指定します。 Bicep 内のすべてのパスは、プラットフォーム間で一貫したコンパイルを行うために、スラッシュ (/) ディレクトリ区切り記号で指定する必要があります。 Windows の円記号 (\) 文字はサポートされていません。 パスにはスペースを含めることができます。

たとえば、メイン ファイルからディレクトリ内の 1 レベル上にあるファイルをデプロイするには、次のコマンドを使用します。

module stgModule '../storageAccount.bicep' = {
  name: 'storageDeploy'
  params: {
    storagePrefix: 'examplestg1'
  }
}

レジストリ内のファイル

パブリック およびプライベート モジュール レジストリがあります。

パブリック モジュール レジストリ

Azure 以外の検証済みモジュールは、パブリック モジュール レジストリから廃止されます。

Azure 検証済みモジュール は、事前構築済み、事前テスト済み、および事前検証済みのモジュールであり、Azure にリソースをデプロイするために使用できます。 Microsoft の従業員は、これらのモジュールを作成して所有しています。 これらは、一般的な Azure リソースと構成のデプロイ プロセスを簡略化し、高速化するように設計されています。 モジュールは、Azure Well-Architected Framework などのベスト プラクティスにも合わせて調整されます。

Bicep モジュールを参照して、使用可能なモジュールの一覧を表示します。 次のスクリーンショットで強調表示されている番号を選択して、フィルター処理されたビューに直接移動します。

Azure 検証済みモジュールを示すスクリーンショット。

モジュールの一覧に最新バージョンが表示されます。 使用可能なバージョンの一覧を表示するには、バージョン番号を選択します。

Azure 検証済みモジュールのバージョンを示すスクリーンショット。

パブリック モジュールにリンクするには、次の構文でモジュール パスを指定します。

module <symbolic-name> 'br/public:<file-path>:<tag>' = {}
  • br/public: これはパブリック モジュールのエイリアスです。 このエイリアスは、Bicep 構成ファイルでカスタマイズできます。
  • ファイル パス: / 文字で区切ることができるセグメントを含めることができます。
  • タグ: これは、モジュールのバージョンを指定するために使用されます。

次に例を示します。

module storage 'br/public:avm/res/storage/storage-account:0.18.0' = {
  name: 'myStorage'
  params: {
    name: 'store${resourceGroup().name}'
  }
}

パブリック モジュールのエイリアスは br/public。 次のように記述することもできます。

module <symbolic-name> 'br:mcr.microsoft.com/bicep/<file-path>:<tag>' = {}

プライベート モジュール レジストリ

モジュールをレジストリに発行した場合は、そのモジュールにリンクできます。 Azure コンテナー レジストリの名前とモジュールへのパスを指定します。 モジュールのパスは次の構文で指定します。

module <symbolic-name> 'br:<registry-name>.azurecr.io/<file-path>:<tag>' = {
  • br: これは、Bicep レジストリのスキーム名です。
  • ファイル パス: これは Azure Container Registry の repository と呼ばれます。 ファイル パスには、 / 文字で区切られたセグメントを含めることができます。
  • tag: モジュールのバージョンを指定するために使用されます。

次に例を示します。

module stgModule 'br:exampleregistry.azurecr.io/bicep/modules/storage:v1' = {
  name: 'storageDeploy'
  params: {
    storagePrefix: 'examplestg1'
  }
}

レジストリ内のモジュールを参照すると、Visual Studio Code の Bicep 拡張機能は自動的に bicep restore を呼び出して、外部モジュールをローカル キャッシュにコピーします。 外部モジュールが復元されるまで、しばらく時間がかかります。 モジュールの IntelliSense がすぐに機能しない場合は、復元が完了するまで待ちます。

レジストリ内のモジュールの完全なパスは長くなる場合があります。 モジュールを使用するたびに完全なパスを指定する代わりに、 bicepconfig.json ファイルでエイリアスを構成します。 エイリアスを使用すると、モジュールの参照が簡単になります。 たとえば、エイリアスを使用すると、パスを次のように短縮できます。

module stgModule 'br/ContosoModules:storage:v1' = {
  name: 'storageDeploy'
  params: {
    storagePrefix: 'examplestg1'
  }
}

パブリック モジュール レジストリには、定義済みのエイリアスがあります。

module storage 'br/public:avm/res/storage/storage-account:0.18.0' = {
  name: 'myStorage'
  params: {
    name: 'store${resourceGroup().name}'
  }
}

bicepconfig.json ファイル内のパブリック エイリアスをオーバーライドできます。

テンプレート スペックのファイル

テンプレート スペックを作成したら、モジュールでそのテンプレート スペックにリンクします。 テンプレート スペックを次の形式で指定します。

module <symbolic-name> 'ts:<sub-id>/<rg-name>/<template-spec-name>:<version>' = {

Bicep ファイルを簡略化するには、テンプレート スペックを含むリソース グループの エイリアスを作成 します。 エイリアスを使用すると、構文は次のようになります。

module <symbolic-name> 'ts/<alias>:<template-spec-name>:<version>' = {

次のモジュールでは、ストレージ アカウントを作成するテンプレート スペックをデプロイします。 テンプレート スペックのサブスクリプションとリソース グループは、 ContosoSpecs という名前のエイリアスで定義されます。

module stgModule 'ts/ContosoSpecs:storageSpec:2.0' = {
  name: 'storageDeploy'
  params: {
    storagePrefix: 'examplestg1'
  }
}

デコレーターを使用する

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

デコレーター 引数 説明
batchSize なし 順番にデプロイするようにインスタンスを設定します。
説明 ひも モジュールの説明を指定します。

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

バッチサイズ

@batchSize()は、forを使用するリソースまたはモジュール定義にのみ適用できます。

既定では、モジュールは並列でデプロイされます。 @batchSize(int) デコレーターを追加する場合、インスタンスを順次にデプロイします。

@batchSize(3)
module storage 'br/public:avm/res/storage/storage-account:0.11.1' = [for storageName in storageAccounts: {
  name: 'myStorage'
  params: {
    name: 'store${resourceGroup().name}'
  }
}]

詳細については、「バッチでのデプロイ」を参照してください。

説明

説明を追加するには、モジュールの宣言に description を追加します。 次に例を示します。

@description('Create storage accounts referencing an AVM.')
module storage 'br/public:avm/res/storage/storage-account:0.18.0' = {
  name: 'myStorage'
  params: {
    name: 'store${resourceGroup().name}'
  }
}

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

パラメーター

モジュールの定義で指定するパラメーターは、Bicep ファイル内のパラメーターと一致します。

次の Bicep の例には、 storagePrefixstorageSKUlocationの 3 つのパラメーターがあります。 storageSKU パラメーターには既定値があるため、デプロイ時にそのパラメーターの値を指定する必要はありません。

@minLength(3)
@maxLength(11)
param storagePrefix string

@allowed([
  'Standard_LRS'
  'Standard_GRS'
  'Standard_RAGRS'
  'Standard_ZRS'
  'Premium_LRS'
  'Premium_ZRS'
  'Standard_GZRS'
  'Standard_RAGZRS'
])
param storageSKU string = 'Standard_LRS'

param location string

var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'

resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: uniqueStorageName
  location: location
  sku: {
    name: storageSKU
  }
  kind: 'StorageV2'
  properties: {
    supportsHttpsTrafficOnly: true
  }
}

output storageEndpoint object = stg.properties.primaryEndpoints

前の例をモジュールとして使用するには、それらのパラメーターの値を指定します。

targetScope = 'subscription'

@minLength(3)
@maxLength(11)
param namePrefix string

resource demoRG 'Microsoft.Resources/resourceGroups@2024-03-01' existing = {
  name: 'demogroup1'
}

module stgModule '../create-storage-account/main.bicep' = {
  name: 'storageDeploy'
  scope: demoRG
  params: {
    storagePrefix: namePrefix
    location: demoRG.location
  }
}

output storageEndpoint object = stgModule.outputs.storageEndpoint

モジュールのスコープを設定する

モジュールを宣言するときは、モジュールを含む Bicep ファイルのスコープとは異なるモジュールのスコープを設定します。 モジュールのスコープを設定するには、scope プロパティを使用します。 scope プロパティが指定されていない場合、モジュールは親のターゲット スコープにデプロイされます。

次の Bicep ファイルでは、リソース グループと、そのリソース グループ内のストレージ アカウントが作成されます。 ファイルはサブスクリプションにデプロイされますが、モジュールのスコープは新しいリソース グループになります。

// set the target scope for this file
targetScope = 'subscription'

@minLength(3)
@maxLength(11)
param namePrefix string

param location string = deployment().location

var resourceGroupName = '${namePrefix}rg'

resource newRG 'Microsoft.Resources/resourceGroups@2024-03-01' = {
  name: resourceGroupName
  location: location
}

module stgModule '../create-storage-account/main.bicep' = {
  name: 'storageDeploy'
  scope: newRG
  params: {
    storagePrefix: namePrefix
    location: location
  }
}

output storageEndpoint object = stgModule.outputs.storageEndpoint

次の例では、2 つの異なるリソース グループにストレージ アカウントがデプロイされます。 どちらのリソース グループも既に存在している必要があります。

targetScope = 'subscription'

resource firstRG 'Microsoft.Resources/resourceGroups@2024-03-01' existing = {
  name: 'demogroup1'
}

resource secondRG 'Microsoft.Resources/resourceGroups@2024-03-01' existing = {
  name: 'demogroup2'
}

module storage1 '../create-storage-account/main.bicep' = {
  name: 'westusdeploy'
  scope: firstRG
  params: {
    storagePrefix: 'stg1'
    location: 'westus'
  }
}

module storage2 '../create-storage-account/main.bicep' = {
  name: 'eastusdeploy'
  scope: secondRG
  params: {
    storagePrefix: 'stg2'
    location: 'eastus'
  }
}

scope プロパティを有効なスコープ オブジェクトに設定します。 Bicep ファイルを使用してリソース グループ、サブスクリプション、または管理グループをデプロイする場合、モジュールのスコープをそのリソースのシンボリック名に設定することができます。 また、スコープ関数を使用して有効なスコープを取得することもできます。

以下がその関数です。

次の例では、managementGroup 関数を使用してスコープを設定します。

param managementGroupName string

module mgDeploy 'main.bicep' = {
  name: 'deployToMG'
  scope: managementGroup(managementGroupName)
}

出力

モジュールから値を取得し、メインの Bicep ファイルでそれを使用できます。 モジュールから出力値を取得するには、モジュール オブジェクトで outputs プロパティを使用します。

最初の例では、ストレージ アカウントを作成し、プライマリ エンドポイントを返します。

@minLength(3)
@maxLength(11)
param storagePrefix string

@allowed([
  'Standard_LRS'
  'Standard_GRS'
  'Standard_RAGRS'
  'Standard_ZRS'
  'Premium_LRS'
  'Premium_ZRS'
  'Standard_GZRS'
  'Standard_RAGZRS'
])
param storageSKU string = 'Standard_LRS'

param location string

var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'

resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: uniqueStorageName
  location: location
  sku: {
    name: storageSKU
  }
  kind: 'StorageV2'
  properties: {
    supportsHttpsTrafficOnly: true
  }
}

output storageEndpoint object = stg.properties.primaryEndpoints

プロパティをモジュールとして使用すると、その出力値を取得できます。

targetScope = 'subscription'

@minLength(3)
@maxLength(11)
param namePrefix string

resource demoRG 'Microsoft.Resources/resourceGroups@2024-03-01' existing = {
  name: 'demogroup1'
}

module stgModule '../create-storage-account/main.bicep' = {
  name: 'storageDeploy'
  scope: demoRG
  params: {
    storagePrefix: namePrefix
    location: demoRG.location
  }
}

output storageEndpoint object = stgModule.outputs.storageEndpoint

Bicep バージョン 0.35.1 以降では、 @secure() デコレーターをモジュール出力に適用して機密としてマークし、それらの値がログやデプロイ履歴で公開されないようにすることができます。 これは、モジュールが、生成されたキーや接続文字列などの機密データを、公開を危険にさらさずに親 Bicep ファイルに返す必要がある場合に便利です。 詳細については、「 セキュリティで保護された出力」を参照してください。