Bicepについて自分のためにまとめる

こんにちは。Bicepについて調べた内容をまとめます。
私はインフラ周辺の勉強から始めてまだ歴が浅いので、こういう言語の話はとても苦手です。開発寄りの人はBicepも大丈夫かもしれませんが、そうでなければ公式ドキュメントを部分的に読んでつまみ食いするよりも、[ラーニングモジュール](https://learn.microsoft.com/ja-jp/training/modules/build-first-bicep-template/)をまとめてやった方がいいと思いました。

## Bicep 以前の話
そもそもAzure 上にできるリソースはどのように定義されるのか？
たとえば仮想マシンを作成するにはWindows やLinux の別、ディスクサイズとか可用性ゾーンを指定する必要があります。これらの設定値＝パラメーターは、いかにしてAzure に伝わりリソースがデプロイされるのか？
結論から言うと「Azure Resource ManagerというAPI（アプリケーション・プログラミング・インターフェイス）に、仮想マシンなどのリソースの情報（＝リソースの種類やパラメーター）をJSONファイルに書いて渡すと、リソースがデプロイされる」となります。
ポータルではマウスとキーボードでリソースの情報を入力しますが、ポータルは裏でJSONファイルを作成しています。
適当に仮想マシンをデプロイしてみたので確認しましょう。ポータルの仮想マシンの概要画面で、右上に「JSON ビュー」というのがあるのでクリックします。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/a724621e-9e03-f81a-65dc-eb4729a05794.png)


  仰々しいテキストが見えます。  
  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/9b008a60-97ef-f911-288b-da7605c2b059.png)
このファイルがリソースを定義しています。
作成方法がポータルであれテキストエディタであれ、これをAzure Resource Manager (ARM)に渡せばリソースを作成してくれます。
したがって、JSON で全部書いてARM 渡せばポータルで毎回ポチポチしなくてよくなるわけです。IaC (Infrastructure as Code)というやつです。
## そこでBicep
しかし、JSON は書くのが大変だそうです。そこで、Bicep が役立つとのことです。
上に貼ったラーニングモジュールに、JSON とBicep の比較がありますが、JSON と比べるとBicep のコードは単純でかなり書きやすそうです。
### 使い方（ざっくりと説明）
Bicep ファイルにデプロイしたいリソースの種類を書き、JSON ファイルに詳細なパラメーター情報を書きテンプレートファイルとします。この2 種類のファイルをAzure Powershell やAzure CLI の引数として渡して実行するとデプロイされます。
私はAzure Powershellで勉強しています。重要構文をいくつか書いておきます。
#### Bicep を使ったデプロイコマンド
```
New-AzResourceGroupDeployment -TemplateFile main.bicep -TemplateParameterFile main.parameters.dev.json
```
上記はラーニングモジュールに出てくるコマンドそのままです。
| ファイル名 | 説明 |
|:-:|:-:|
| main.bicep  | デプロイしたいリソースを定義したBicep ファイル名  |
| main.parameters.dev.json  |   リソースのパラメーターを定義したテンプレートファイル名|

（なんかイケてない表やな）

例えばリージョンという設定値（＝パラメーター）に対しては、Bicep ファイルの方では"location" という文字列でとりあえず書いておいて、テンプレートファイルの方で"location" の具体的な項目を定義する、といった具合に書きます。
こうすることで、このコマンドを打つごとに（デプロイごとに）テンプレートファイルを変えるだけで、同じBicep ファイルからパラメーター違いの構成をポンポン作ることができます。
テンプレートファイルを分けない場合だと、先の例だとリージョンを変えたいだけでも1 つのファイル全体を書き直す必要があります。
#### リソースの宣言
```
resource resourcename '{resource-provider}/{resource-type@API version}' =
```
| 項目 | 説明 |
|:-:|:-:|
|  resourcename |  リソースに付ける名前。任意に決めていいが、誰にでもわかるようほぼ決まっている。 |
|  {resource-provider}/{resource-type} |  リソースの種類を表す言葉 |
| API version  |  リソースごとにあるAPIのバージョン。VS Codeの拡張機能だと可能な選択肢を出してくれる |

API バージョンについては、デプロイしたいものは[ここ](https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/management/azure-services-resource-providers?source=recommendations)で探すんだと思います。
[このページ](https://learn.microsoft.com/en-us/azure/templates/microsoft.compute/virtualmachines?pivots=deployment-language-bicep)で各リソースの定義の仕方がわかります。
（でもこのページの情報だけだと情報足りなくて、作りたいリソースのjson ファイルを自分で見て書く必要があると思います）

= のあとにリソースのパラメーターを入れられます。

### ターミナルにサブスクリプションを設定
```
$context = Get-AzSubscription -SubscriptionId {Your subscription ID}
Set-AzContext $context
```
Azure Powershell のターミナルに上記コマンドを打つと、そのターミナルの既定サブスクリプションを設定できます。つまり、リソースをデプロイするサブスクリプションをあらかじめ決めておくことができます。
#### サブスクリプションID 
```
Get-AzSubscription
```
サブスクリプションが複数ある場合は全部見られるので、狙いのサブスクリプションのIDをコピーして使いいます。
#### テンプレートファイルの書き方
テンプレートファイルの書き方はJSON そのものだと思うので省略（まだ理解してない）

## 終わり
勉強したことをまとめただけですがこれまで。
いつも検証で使っている、1 つのVM とVPN gateway の構成は、近いうちにIaC したいと思っています。またそのときに加筆するつもりです。