🦐

【Bicep】昔AIに書いてもらったコードを改修する

に公開

はじめに

私が初めてBicepからストレージアカウントを作成したときにはmain.bicepにすべてのデプロイ情報を記述させていました。
https://zenn.dev/headwaters/articles/2720530c780c2b
今振り返ると、可読性や管理の問題からあまりよい形式ではないと思います。
今回は昔作成したmain.bicepを改修して、main.bicepstorageAccount.bicepに分けてデプロイをします。

昔のmain.bicep(AIに書いてもらったもの)

これを修正します。その前に、まずは内容を把握していきます(実はほとんど理解していませんでした)

昔のmain.bicep
@description('Storage Account名。空ならRGに基づく一意名を自動生成(英小文字/数字, 3〜24文字)。')
param storageAccountName string = ''
//↑ここで名前を決めている

@description('storageAccountName が空のときの接頭辞。')
@minLength(2)
@maxLength(10)
param namePrefix string = 'st'
//↑storageAccountNameに任意の名前を入れなかったらここで適当に名前を決める

@description('配置リージョン(既定: RGと同じ)。')
param location string = resourceGroup().location
//作成するリージョン。ここではRGと同じリージョンになるようにしていますね

@description('SKU(冗長化/性能)。')
@allowed([
  'Standard_LRS'
  'Standard_GRS'
  'Standard_RAGRS'
  'Standard_ZRS'
  'Standard_GZRS'
  'Standard_RAGZRS'
  'Premium_LRS'
])
param skuName string = 'Standard_LRS'
//ストレージアカウントのSKUとしてStandard_LRSを選んだみたいです
//@allowedの中に入っているものしか選べないように設定されているようです

@description('アカウント種別(通常 StorageV2)。')
@allowed([
  'StorageV2'
  'FileStorage'
  'BlockBlobStorage'
])
param kind string = 'StorageV2'
//アカウント種別を選べるようにしています。SKUと同様に@allowedで制限していますね

@description('パブリックネットワークアクセス(Enabled/Disabled)。')
@allowed([
  'Enabled'
  'Disabled'
])
param publicNetworkAccess string = 'Enabled'
//ストレージアカウントがパブリックアクセスできるか設定しています。Enableなので「有効」にしています

@description('共有キーアクセス許可(FalseにするとAAD中心運用)。')
param allowSharedKeyAccess bool = true
//共有アクセスキーの許可について色々書いてるようです。とりあえず許可したみたい

@description('Blobのパブリックアクセスを許可(アカウント側フラグ)。')
param allowBlobPublicAccess bool = false
//BlobStorageのパブリックアクセスは不許可のようです

// 空渡しなら一意名を自動生成
var finalName = (length(storageAccountName) == 0)
  ? toLower('${namePrefix}${uniqueString(resourceGroup().id)}')
  : toLower(storageAccountName)
//ここはstorageAccountNameをランダムで生成するための場所みたいですね

resource stg 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: finalName
  location: location
  sku: {
    name: skuName
  }
  kind: kind
  properties: {
    minimumTlsVersion: 'TLS1_2'
    supportsHttpsTrafficOnly: true
    allowBlobPublicAccess: allowBlobPublicAccess
    publicNetworkAccess: publicNetworkAccess
    allowSharedKeyAccess: allowSharedKeyAccess
    accessTier: 'Hot'
  }
}
//ここはstorageAccountのモジュール部分ですね。1行目に書いてある'Microsoft...'というAPIを呼び出している箇所だと思います

output storageAccountName string = stg.name
output storageAccountId string = stg.id
//ここで作成したstorageAccountの情報をoutputし、次に繋げる

改修①

どうでもいいデコレーターを消す

AIに作成してもらった当時は気にも留めなかったデコレーター(@description,@allowedなど)ですが、逆に見にくいのでとりあえず全部消しました。

作成するリソースの名前を決める

前のコードでは「リソース名の自動作成」モジュールがあったのですが、不要なので消します。
それからパラメータ名も要所要所変えました。

これだけでも結構すっきりした

param storageAccountName string = 'sontestst001'
param location string = resourceGroup().location
param skuName string = 'Standard_LRS'
param kind string = 'StorageV2'
param publicNetworkAccess string = 'Enabled'
param allowSharedKeyAccess bool = true
param allowBlobPublicAccess bool = false

resource stg 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: skuName
  }
  kind: kind
  properties: {
    minimumTlsVersion: 'TLS1_2'
    supportsHttpsTrafficOnly: true
    allowBlobPublicAccess: allowBlobPublicAccess
    publicNetworkAccess: publicNetworkAccess
    allowSharedKeyAccess: allowSharedKeyAccess
    accessTier: 'Hot'
  }
}

output storageAccountName string = stg.name
output storageAccountId string = stg.id

改修②

blobStorage.bicepでモジュール化する

モジュール化ついでに、デプロイリージョンをjapaneastに変更しました。
また、パラメータ部分を整理して記述しました。
基本的にはmain.bicepにパラメータを敷き詰めて、blobStorage.bicepは発行専用ファイルという風に使い分けようと思います。

  • main.bicep
//パラメータ設定
param location string = 'japaneast'
param storageAccountName string = 'sontestst001'
param stSkuName string = 'Standard_LRS'
param kind string = 'StorageV2'
param publicNetworkAccess string = 'Enabled'
param allowSharedKeyAccess bool = true
param allowBlobPublicAccess bool = false
param minimumTlsVersion string = 'TLS1_2'
param supportsHttpsTrafficOnly bool = true
param accessTier string = 'Hot'

//blobStorage.bicepというモジュールへパラメータを渡す
module blobStorageModule '../modules/blobstorage.bicep' = {
  name: 'blobStorage'
  scope: resourceGroup(rgName)
  params: {
    storageAccountName: storageAccountName
    location: location
    stSkuName: stSkuName
    kind: kind
    publicNetworkAccess: publicNetworkAccess
    allowSharedKeyAccess: allowSharedKeyAccess
    allowBlobPublicAccess: allowBlobPublicAccess
    minimumTlsVersion: minimumTlsVersion
    supportsHttpsTrafficOnly: supportsHttpsTrafficOnly
    accessTier: accessTier
  }
}
  • blobStorage.bicep
param storageAccountName string
param location string
param stSkuName string
param kind string
param publicNetworkAccess string
param allowSharedKeyAccess bool
param allowBlobPublicAccess bool
param minimumTlsVersion string
param supportsHttpsTrafficOnly bool
param accessTier string

resource stg 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: stSkuName
  }
  kind: kind
  properties: {
    allowBlobPublicAccess: allowBlobPublicAccess
    publicNetworkAccess: publicNetworkAccess
    allowSharedKeyAccess: allowSharedKeyAccess
    minimumTlsVersion: minimumTlsVersion
    supportsHttpsTrafficOnly: supportsHttpsTrafficOnly
    accessTier: accessTier
  }
}

output storageAccountName string = stg.name
output storageAccountId string = stg.id

改修③

このままだとデプロイができないので手を加える

この状態ではtargetScopeが決まっていないためデプロイができません。
リソースグループのモジュールとモジュール呼び出しを追加します。

  • main.bicep
targetScope = 'subscription'

param rgName string = 'son-test-rg0001'
param location string = 'japaneast'

module rgModule '../modules/resourceGroup.bicep' = {
  name: 'resourceGroup'
  params: {
    rgName: rgName
    location: location
  }
}

param storageAccountName string = 'sontestst001'
param stSkuName string = 'Standard_LRS'
param kind string = 'StorageV2'
param publicNetworkAccess string = 'Enabled'
param allowSharedKeyAccess bool = true
param allowBlobPublicAccess bool = false
param minimumTlsVersion string = 'TLS1_2'
param supportsHttpsTrafficOnly bool = true
param accessTier string = 'Hot'

module blobStorageModule '../modules/blobstorage.bicep' = {
  name: 'blobStorage'
  scope: resourceGroup(rgName)
  params: {
    storageAccountName: storageAccountName
    location: location
    stSkuName: stSkuName
    kind: kind
    publicNetworkAccess: publicNetworkAccess
    allowSharedKeyAccess: allowSharedKeyAccess
    allowBlobPublicAccess: allowBlobPublicAccess
    minimumTlsVersion: minimumTlsVersion
    supportsHttpsTrafficOnly: supportsHttpsTrafficOnly
    accessTier: accessTier
  }
//dependsOnでRG作成後にblobStorageModuleが起動します
  dependsOn: [
    rgModule
  ]
}
  • resourceGroup.bicep
targetScope = 'subscription'
param rgName string
param location string

resource RG 'Microsoft.Resources/resourceGroups@2022-09-01' = {
  name: rgName
  location: location
}

output rgName string = RG.name

デプロイもできました

まとめ

今回は昔(AIが)作成したbicepコードに向き合って、改修を試みてみました。
当時コードを作成したころは、デプロイにばかり注目してモジュール化やディレクトリ構成は二の次に考えていました。AIにコーディングをしてもらうこと自体に問題はありませんが、内容にしっかり向き合わないと後々困る気がするので、今後も定期的に振り返っていきたいと思います。

ヘッドウォータース

Discussion