Bicepでリソース管理しよう!~モジュール・パラメータファイル編~ – KENTEM TechBlog


こんにちは、エンジニアTです。
最近部内の一部で静かに広がりつつあるもの・・そう、それがBicepです。
私の所属するプロジェクトにもついに導入したので、今回は

という機能に焦点を当ててご紹介したいと思います。

以前、当ブログで以下の記事が投稿されました↓
tech.kentem.jp

ほうほう、Bicepでリソース管理すれば環境作成も容易になると・・。
自プロジェクトは他プロジェクトで作成しているアプリとの関連が強く、様々な環境でリソースが作成されています。
環境作成の手順について質問されることもしばしば。
こんな状況にBicep、うってつけでは?
ということでBicep導入してみました!

BicepはMicrosoftが開発したドメイン特化言語(DSL)で、Azure Resource Manager(ARM)テンプレートを簡潔に記述するためのものです。
詳しい内容は前述の記事で説明されておりますので、未履修の方はぜひそちらをご覧ください!

一通りのリソースを定義したところで、同じような定義があることに気づきました。

param environment string = 'dev'
param location string = 'japaneast'


resource frontendAppServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: '${environment}-frontend-plan'
  location: location
  sku: {
    name: environment == 'prod' ? 'P1V2' : 'B1'
    tier: environment == 'prod' ? 'PremiumV2' : 'Basic'
  }
  properties: {
    reserved: false
  }
}


resource frontendApp1 'Microsoft.Web/sites@2022-03-01' = {
  name: '${environment}-frontend-app1'
  location: location
  properties: {
    serverFarmId: frontendAppServicePlan.id
    httpsOnly: true
  }
}


resource frontendApp2 'Microsoft.Web/sites@2022-03-01' = {
  name: '${environment}-frontend-app2'
  location: location
  properties: {
    serverFarmId: frontendAppServicePlan.id
    httpsOnly: true
  }
}


resource backendAppServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: '${environment}-backend-plan'
  location: location
  sku: {
    name: environment == 'prod' ? 'P1V2' : 'B1'
    tier: environment == 'prod' ? 'PremiumV2' : 'Basic'
  }
  properties: {
    reserved: false
  }
}


resource backendApi1 'Microsoft.Web/sites@2022-03-01' = {
  name: '${environment}-backend-api1'
  location: location
  properties: {
    serverFarmId: backendAppServicePlan.id
    httpsOnly: true
  }
}


resource backendApi2 'Microsoft.Web/sites@2022-03-01' = {
  name: '${environment}-backend-api2'
  location: location
  properties: {
    serverFarmId: backendAppServicePlan.id
    httpsOnly: true
  }
}


output frontendAppServiceUrls array = [
  'https:
  'https:
]

output backendAppServiceUrls array = [
  'https:
  'https:
]

App Service Plan と App Service のリソース定義、何回もやってます。
ここで便利なのがモジュールという機能です。
モジュールとは、複数の関連リソースを1つのファイルにまとめて再利用可能にする仕組みのことです。
個人的には冗長なpublicメソッドをprivateメソッドに分ける作業に近いなと感じています。

param location string = 'japaneast'
param appServicePlanName string
param appServiceNames array = []
param sku object = {
  name: 'B1'
  tier: 'Basic'
}

resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: appServicePlanName
  location: location
  sku: sku
  properties: {
    reserved: false 
  }
}

resource appServices 'Microsoft.Web/sites@2022-03-01' = [for name in appServiceNames: {
  name: name
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
  }
}]

output appServicePlanId string = appServicePlan.id
output appServiceUrls array = [for (name, i) in appServiceNames: 'https:

このモジュールを使用するメインのBicepファイルは次のようになります。

param environment string = 'dev'
param location string = 'japaneast'


module frontendAppService 'appservice.bicep' = {
  name: 'frontend-appservice-deployment'
  params: {
    appServicePlanName: '${environment}-frontend-plan'
    location: location
    appServiceNames: [
      '${environment}-frontend-app1'
      '${environment}-frontend-app2'
    ]
    sku: {
      name: environment == 'prod' ? 'P1V2' : 'B1'
      tier: environment == 'prod' ? 'PremiumV2' : 'Basic'
    }
  }
}


module backendAppService 'appservice.bicep' = {
  name: 'backend-appservice-deployment'
  params: {
    appServicePlanName: '${environment}-backend-plan'
    location: location
    appServiceNames: [
      '${environment}-backend-api1'
      '${environment}-backend-api2'
    ]
    sku: {
      name: environment == 'prod' ? 'P1V2' : 'B1'
      tier: environment == 'prod' ? 'PremiumV2' : 'Basic'
    }
  }
}

output frontendAppServiceUrls array = frontendAppService.outputs.appServiceUrls
output backendAppServiceUrls array = backendAppService.outputs.appServiceUrls

かなり読みやすくなりました!
「module」と書くことで、他のBicepファイルをモジュールとして呼び出すことが可能です。

パラメータファイルは、Bicepファイルで定義したパラメータに値を指定するためのJSONファイルです。
Bicepファイルの拡張子は.bicepで、関連するパラメータファイルは.bicepparamという拡張子で作成します。

using 'main.bicep'

param environment string = 'dev'
param location string = 'japaneast'

using で「どのBicepファイルのパラメータか?」という宣言をします。
Bicepファイルとパラメータファイルは1:Nの関係で、1つのBicepファイルに対して、複数のパラメータファイルを作成することが可能です。

モジュールにはパラメータファイルを紐づけられない?

Bicepファイルを分割しモジュールとして読み込むことができたので、モジュール化したBicepファイルに対してパラメータファイルを設定したいと思い、いろいろ試してみました。
しかし、執筆当時の2025年9月時点では以下のような制約がありました。

  • モジュール化したファイルに対してパラメータファイルを直接適用することはできない
  • パラメータファイルにパラメータファイルを紐づけることはできない

モジュールをインポートしているメインのBicepファイルのパラメータファイルからしか、モジュールのパラメータを設定できませんでした・・・。
そのため、ひとつのパラメータファイルに各モジュールで利用するパラメータ定義をまとめるという方法で乗り切りました。

最初は少し理解に時間がかかりましたが、慣れてしまえばとても効率の良い管理方法だと感じました。
パラメータファイルも制約があってひとつにまとまってしまいましたが、「実行時に変更が必要になるのがそのファイルだけ」という扱いにできてかえってよかったのかもしれません。
これからいろんな方に環境構築していただいて、ブラッシュアップしていきたいです。

KENTEMでは、様々な拠点でエンジニアを大募集しています!
建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。
recruit.kentem.jp
career.kentem.jp


元の記事を確認する

関連記事