Fusic Tech Blog

Fusion of Society, IT and Culture

AzureでIaCするならBicepがオススメ
2021/05/12

AzureでIaCするならBicepがオススメ

ここ1年ほどAzureを使ったインフラの構築をしています。

私が関わっているプロジェクトではIaCを求められ、当初はTerraformを使っていました。その後ARM(Azure Resource Manager)に乗り換えて実装を進めていたところに、Bicep Projectというものを知り、今回試しに使ってみました。

感想としては「とても書きやすい&デプロイしやすい」です。AzureのIaCに関してはベストな選択だと思いましたので、本記事にて紹介いたします。

Bicepとは

BicepとはAzureリソースを宣言的に記述・デプロイするためのDSLです。 以下のリポジトリにて、開発・公開がされています。

以下はBicepで記述されたテンプレートの一例です。

param appName string
param environment string

var storageAccountName = toLower('${appName}Storage${environment}')

resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' = {
  name: storageAccountName
  sku: {
    name: 'Standard_LRS'
    tier: 'Standard'
  }
  kind: 'StorageV2'
  location: resourceGroup().location
  identity: {
    type: 'SystemAssigned'
  }
}

resource storageAccountName_default_image 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-06-01' = {
  name: '${storageAccount.name}/default/image'
  properties: {
    publicAccess: 'None'
  }
}

output storageAccountID string = storageAccount.name

Terraformの問題点

弊社ではこれまでAWSを多く使ってきており、一部のプロジェクトではTerraformを使った実績もあります。このため、Azureにおいても最初はTerraformを使ってIaCしてきたのですが、我々のプロジェクトで使用する一部のリソースや機能はTerraformでは未対応でした。新機能がすぐに対応するとは限らない点はTerraformのデメリットです。

ARMの問題点

AWSでいうところのCloudFormationのような、IaCを実現するサービスとして、ARM(Azure Resource Manager)というサービスがあります。こちらは、Azure自身が提供しているので新機能も比較的対応しているようです。一方、こちらはJSONで記述する必要があり冗長な記述となりがちですし、モジュール分割をするためにはテンプレート スペックと呼ばれる機能を使う必要があり、デプロイに一手間を要します。

Bicepの良さ

Bicepは Terraformの簡潔な文法を維持しつつ、ARM同等に使えるという 両者の良いとこ取りをした言語という印象です。

Bicepを学ぶには

Azure Learnがわかりやすいです。言語仕様がシンプルなので、このチュートリアルを実施すれば一通り網羅できるはずです。

BicepでWebサーバのよくある構成を書いてみた

ここでは、Webシステムで良く見かける構成として、Application Gateway + Virtual Machine + Database for PostgreSQL + Storage AccountのIaCをBicepで書いてみました。

Tech Blogに貼り付けるにはソースコードが長いので、以下リポジトリを参照ください。

以下のように1コマンドでデプロイできます。

$ az deployment group create --template-file main.bicep

BicepでARMテンプレートをDecompileしてみた

BicepはARMテンプレートのDecompileに対応しています。「Bicep良さそうだけど作成済みのARMテンプレートがたくさんある...」という人も簡単にBicepを導入できます。

以下のようにコマンドを実行するだけで、関連するテンプレートが全てBicepファイルとして出力されます。

$ az bicep decompile --file arm/main.json

ちなみに、以下のコマンドでBicep→ARMテンプレートの変換も可能です。

$ az bicep build  --file bicep/main.bicep

まとめ

最初に述べた通り、Azureリソースの記述・デプロイに関してはBicepがベストな選択肢になり得ると感じました。みなさんもぜひお試しください。

yuuu

yuuu

2018年の年明けに組込み畑からやってきた、2児の父 兼 Webエンジニアです。 mockmockの開発・運用を担当しており、組込みエンジニア時代の経験を活かしてデバイスをプログラミングしたり、簡易的なIoTシステムを作ったりしています。主な開発言語はRuby、時々Go。