APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

IaCツール Bicep 共通関数機能が加わってさらに便利に

Bicepとは

BicepとはAzureのリソースをデプロイするDSLで、IaCツールのひとつです。

learn.microsoft.com

こうしたIaCを書いていると様々なところで何度も利用する関数が登場します。Bicepにもいくつもの組み込みの関数は用意されていますが、プログラミング経験のある方なら独自の関数に定義したいとも考えると思います。 しかし以前のBicepは独自の関数は定義することができず、何度も同じコードを書くか、別の手段を使って関数のような機能を実現していました。

カスタム関数機能とImport機能

こうした状況が変わってきています。まずBicep 0.20.xでカスタム関数の定義が可能となりました
さらに0.23.xでImport文で別ファイルにある関数などを取り込むことができるようになりました

実際の使い方

まずはカスタム関数定義のファイルです。ここではgenerateDeployIdという関数を定義しています。

deployId.bicp

@export()
func generateDeployId(name string) string => substring(guid(subscription().subscriptionId, resourceGroup().id, name), 0, 8)

プログラミングをされている方ならどこか見慣れた感じではないでしょうか。難しくはないと思います。

そして利用する側は以下のようになります。

blob.bicep

// param 省略

import { generateDeployId } from '../functions/deployId.bicep'

var deployId = generateDeployId('${blobStorageAccountName}-${blobContainerName}')

module blob 'blob-storage.bicep' = {
  name: 'blobs-${deployId}'
  params: {
    // 省略
  }
}

importして、あとはその関数を利用するだけ。簡単ですね。

注意事項

2023年12月現在、カスタム関数とImport機能はExperiimentalです。利用にあたっては以下の設定が必要です。

bicepconfig.json

{
  "experimentalFeaturesEnabled": {
  "compileTimeImports": true,
    "userDefinedFunctions": true
  }
}

また実行時以下のようなワーニングが表示されます。

WARNING: The following experimental Bicep features have been enabled: User-defined functions, Compile-time imports. Experimental features should be enabled for testing purposes only, as there are no guarantees about the quality or stability of these features. Do not enable these settings for any production usage, or your production environment may be subject to breaking.

Do not enable these settings for any production usage, or your production environment may be subject to breaking. とあるようにまだ実際の環境で使うのは早いかもしれません。ご利用はご自身の責任で行ってください。

この便利な機能が早く正式リリースされることを期待したいと思います。

2024年3月20日追記

2024年3月に Bicep v0.26がリリースされ、カスタム関数(User defined functions)がGAになり、importも利用できるようになりました。

これにより bicepconfig.json のこちらの記述は不要となりました。

{
  "experimentalFeaturesEnabled": {
  "compileTimeImports": true,
    "userDefinedFunctions": true
  }
}

これで気兼ねなく関数を活用できるようになりました。