字幕テキストを解析して記事を作成します。


【Bicep 入門 #3】スコープについて

この記事の内容

  • Azure Bicep における「スコープ(Scope)」の概念を解説します
  • targetScope の設定によってリソースの展開先レベルが変わることを説明します
  • サブスクリプションレベルのスコープとリソースグループレベルのスコープの違いを紹介します
  • 異なるスコープのリソースを一緒に扱うために「モジュール」を活用する方法を説明します
  • 実際にリソースグループとストレージアカウントを2つのファイルで作成するデモを紹介します

スコープとは何か

Azure Bicep では、リソースをどのレベルに展開するかを「スコープ」という概念で管理します。スコープには主に以下のレベルがあります。

  • サブスクリプション(subscription)
  • リソースグループ(resourceGroup)

Bicep ファイルの先頭で targetScope を指定することで、そのファイルが対象とするスコープを宣言できます。

targetScope = 'subscription'
targetScope = 'resourceGroup'

デフォルトでは resourceGroup スコープになっています。


スコープの違いによる制約

targetScopesubscription に設定したファイルでは、リソースグループそのものを作成できます。しかし、ストレージアカウントのようにリソースグループレベルでしか作成できないリソースを同じファイルに書こうとすると、Bicep がエラーを出力します。

このようなエラーが発生したとき、「スコープが合っていない」ことが原因です。サブスクリプションスコープのファイルにリソースグループレベルのリソースをそのまま書くことはできません。


モジュールを使って別スコープのリソースを展開する

この問題を解決するのが**モジュール(module)**です。モジュールを使うことで、別の Bicep ファイルを呼び出し、呼び出し先ファイルに異なるスコープを指定することができます。

ファイル構成例

msationr.abgiec.ebpicepttaarrggeettSSccooppee==''sruebssocurricpetGiroonu'p'

main.bicep(サブスクリプションスコープ)

targetScope = 'subscription'

// リソースグループを作成する
resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = {
  name: 'youtube-rg'
  location: 'japaneast'
}

// モジュールを呼び出してストレージを作成する
module storageDeploy 'storage.bicep' = {
  name: 'storageDeployment'
  scope: rg  // リソースグループのスコープを渡す
  params: {
    location: rg.location
  }
}

storage.bicep(リソースグループスコープ)

targetScope = 'resourceGroup'

param location string

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: 'youtubestorage123'
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

module ブロックの scope プロパティに、先ほど作成したリソースグループオブジェクト(rg)を渡すことで、そのリソースグループのスコープ内でストレージアカウントを展開できます。


デプロイを実行する

サブスクリプションレベルのデプロイは az deployment sub create コマンドで実行します。

az deployment sub create \
  --location japaneast \
  --template-file main.bicep

デプロイ結果の確認

デプロイが完了すると、以下のリソースが作成されます。

  1. リソースグループyoutube-rg
  2. ストレージアカウントyoutubestorage123)— リソースグループ内に展開

Azure ポータルで確認すると、youtube-rg というリソースグループが存在し、その中にストレージアカウントが作成されていることがわかります。

モジュールのデプロイには「展開名(deployment name)」が付きます。name: 'storageDeployment' と指定した場合、ポータルのデプロイ履歴にその名前で記録されます。


モジュールの考え方まとめ

モジュールは「別のファイルに処理を委任する」仕組みです。以下の点を押さえておきましょう。

概念説明
targetScopeそのファイル全体が対象とするスコープ
module別の Bicep ファイルを呼び出す仕組み
scope(moduleのプロパティ)呼び出し先を展開するスコープを指定する
name(moduleのプロパティ)デプロイ履歴に表示される展開名

サブスクリプションレベルでリソースグループを作り、そのリソースグループの中身は別ファイルに任せる、という構造が Bicep では一般的なパターンです。


まとめ

今回は Bicep のスコープとモジュールについて解説しました。

  • Bicep では targetScope でリソースの展開先レベルを指定します
  • サブスクリプションスコープのファイルには、リソースグループレベルのリソースを直接書けません
  • module を使って別ファイルを呼び出し、scope プロパティでリソースグループを渡すことで、異なるスコープのリソースを一緒に管理できます
  • リソースグループの作成とその中のリソース展開を別ファイルに分離することで、構造が整理された Bicep テンプレートを作成できます

モジュールはスコープの問題を解決するだけでなく、テンプレートの再利用性を高める重要な機能です。ぜひ活用してみてください。