Bicep を触ってみた

# やりたいこと
仕事で Azure を使っており、Iac には Terraform を利用している。ただ、何やら Azure 向けに [Bicep](https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/overview?tabs=bicep) なるものがあるとのことで、興味が湧いたので少し触ってみる。
インストールからリソースグループの作成およびストレージアカウントの作成まで行っています。

# [Bicep](https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/overview?tabs=bicep) とは
以下、公式ドキュメントより引用。
> Bicep は、宣言型の構文を使用して Azure リソースをデプロイするドメイン固有言語 (DSL) です。 Bicep ファイル内で、Azure にデプロイするインフラストラクチャを定義し、そのファイルを開発ライフサイクル全体にわたって使用して、インフラストラクチャを繰り返しデプロイします。 リソースは一貫した方法でデプロイされます。
Bicep では、簡潔な構文、信頼性の高いタイプ セーフ、およびコードの再利用のサポートが提供されます。 Bicep により、Azure のコードとしてのインフラストラクチャ ソリューションに最適な作成エクスペリエンスをオファーします。

特徴としては以下。
* 宣言型
* 使えるのは Azure のみ

Azure 向けには、[ARM (Azure Resource Manager)](https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/management/overview) もあるが、書き方が複雑で使いづらい (らしい) が、Bicep は割とシンプルな書き方で IaC を実現できる。

# インストール
CLI で行っていく。Bash などの Terminal を起動して以下コマンドを実行する。

リソースのデプロイ時に、Azure CLI も使うのでインストールする。
OS に合わせてリンクが分かれているので、環境に合わせる。

https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli

Bicep をインストールする。

https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/install

インストール
``` 
az bicep install
```

インストールできたか確認する。
```
az bicep version
```
`Bicep CLI version *.*.*` みたいな表示がされれば OK。

# 実装
## 前準備
まずは以下コマンドを実行して、Azure　にログインする。
```
az login
```
実行するとブラウザが起動して、Azure へのログイン画面が表示される。任意のアカウントでログインする。
Terminal に戻るとログインした旨の表示がなされる。
このとき、業務で複数のサブスクリプションを使っている場合には、どのサブスクリプションに対してデプロイするかを意識する必要がある。コマンド実行時に指定しない場合はデフォルトサブスクリプションにデプロイされるので、毎回指定するかデフォルトを該当のサブスクリプションへ変更しておく。

コマンドでのサブスクリプションの指定
```
コマンド実行時のグローバルパラメータとして、「--subscription {サブスクリプションの名前または ID}」 を付与する
```

デフォルトサブスクリプションの変更方法
```
az account set --subscription {目的のサブスクリプション名または ID}
```

今どのサブスクリプションがデフォルトになっているかは以下で確認 (サブスクリプションの名前や ID も分かる)。
```
az account list --query "[?isDefault]"
```

## コード
まずはリソースグループを作成する。
リソースグループ名は任意のもので可。ただし、世界で一意である必要がある。

``` create_resourcegroup.bicep
param region string = 'japaneast'
param rg_name string = '{your_resourcegroup_name}'

targetScope = 'subscription'

resource resourceGroup 'Microsoft.Resources/resourceGroups@2022-09-01' = {
    name: rg_name
    location: region
}

```
リソースグループは、サブスクリプションに対して実行することになるので、`targetScope = 'subscription'` で指定する (デフォルトは、'resourceGroup' が指定されている)。

ストレージアカウントは、リソースグループに対してデプロイするため、`targetScope = 'subscription` だとデプロイできない。そのため他のファイルに分ける。デフォルトで指定されるが、ここでは明示的に `targetScope` を指定している。ストレージアカウント名も世界で一意になるように指定する。

``` create_storageaccount.bicep
param region string = 'japaneast'
param st_name string = '{your_storageaccount_name}'

targetScope = 'resourceGroup'

resource storageaccount 'Microsoft.Storage/storageAccounts@2021-02-01' = {
  name: st_name
  location: region
  kind: 'StorageV2'
  sku: {
    name: 'Premium_LRS'
  }
}

```

ちなみに、VSCode でコーディングする場合は、Bicep 用の拡張をインストールすると補完が効いて楽になる。
https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/install#vs-code-and-bicep-extension

## デプロイ
Terminal で作成したファイルが存在するディレクトリに移動して以下コマンドを実行して、まずはリソースグループを作成する (サブスクリプションはデフォルトとして指定)。
``` 
az deployment sub create --location japaneast \
                         --template-file create_resourcegroup.bicep
```
実行すると、デフォルトサブスクリプションにリソースグループが作成される。

次に以下コマンドでストレージアカウントを作成する。
```
az deployment group create --resource-group {your_resourcegroup_name} \
                           --template-file create_storageaccount.bicep
```
実行すると、さっき作成したリソースグループ内にストレージアカウントが作成される。

## 削除
ストレージアカウントの削除
`create_storageaccoutn.bicep` のストレージアカウントのリソース定義を削除 (もしくはコメントアウト) して、以下コマンドを実行する。
`terraform destroy` みたいなことはできなさそう。存在しないストレージアカウントを作成するというイメージ？`
--mode Complete` はデプロイモードの指定で、`Complete` にすることで削除可能になる。デフォルト (`Incremental`) だと、変更が無視された。
```
az deployment group create --resource-group rg-bicep-test-oitate \
                           --template-file create_storageaccount.bicep \
                           --mode Complete
```

リソースグループの削除
Bicep からは削除できない？ようなので、Azure CLI を使って以下コマンドで削除する。
```
az group delete --resource-group {your_resourcegroup_name}
```

# 使ってみて
割と便利ではある。ただ、リソースの削除がやや直感的でなかったり、一部コマンドオプションで指定する必要があるなどすべてをコードの実行だけで管理できなかったりというのが、個人的には微妙だった (もし他の方法をご存知の方がいれば教えて下さい:bow:)。
ドキュメントを見るといろんな[関数](https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/bicep-functions)も使えるようなので、そういうところはメリットなのかもしれない。Azure のみを使う場合は利用しても良いかも。


以上です。