Bicep ではじめる Azure Infrastracture as Code

## はじめに
6月に受講した Azure セミナーで、講師のマイクロソフト社員の方が Bicep いいよとおっしゃってました。使ってみたら、たしかにいい感じだったので、ご紹介します。
Microsoft Build 2021 でもちょこっと紹介されてました。

https://mybuild.microsoft.com/sessions/6967b6ae-4dad-417f-8a94-f3b53fed130e?source=sessions

## Bicep とは

[Bicep](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/overview) とは、ひとことで言えば、[ARMテンプレート](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/overview) の改良版言語です。

宣言型構文を使用してAzureリソースをデプロイすることができます。Terraform より Azure 新機能に対する対応が早く、ARM template よりはるかに書きやすく読みやすいという特徴を持っています。

詳しくは、公式ドキュメントや GitHub のリポジトリを見てみてください。

https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/overview

https://github.com/Azure/bicep


個人的には、Azure での Infrastracture as Code において、Bicep は現時点での最適解であると思います。ただし、AWS等とマルチプラットフォーム環境で運用したい場合は、Terraform の方が良いかもしれません。

| | Terraform | ARM Template | Bicep |
|--|--|--|--|
| __つよみ__ | AWS、GCPなどマルチプラットフォームに対応可能。書きやすく読みやすい構文。 | Azure のほぼすべての設定を操作できる。Microsoft サポートの対象。 | ARM Template と（ほぼ）同等にAzure を設定できる。その上、Terafform のように書きやすく読みやすい。また、Microoft サポートの対象でもある。 |
| __よわみ__ | 全ての Azure リソースの設定に対応しているわけではない。また、Azure 新機能への追随も即時ではない。 | Azure 以外には対応していない。<br>JSON なので、普通の人には書きづらく、読みづらい。 | Azure 以外には対応していない。 |


Bicep は、今年（2021年）の冬ごろから、ネットで見かけるようになってきたと思います。Bicep リポジトリの [README.md](https://github.com/Azure/bicep/commit/4313529e188f70932e0c7c3a4d5ca5266d0fafd5) のコミット履歴を見たところ、最初のコミットは 2020年7月17日 でした。それでも、今年(2021年)の MS Ignite や Build で紹介されるなど、最近勢いのある期待の新機能です。


## Infrastracture as Code とは

Infrastracture as Code (IaC) は、バージョン管理、テスト、継続的インテグレーション(CI)といったソフトウェア開発のプラクティスを、インフラのオートメーションに活かすアプローチです。  

ダイナミックインフラストラクチャ（プログラムによってサーバーを作成、破棄できる機能。クラウドなど）の普及により、手軽にインフラが構築できるようになりました。その結果、サーバー調達のリードタイムがビジネスのボトルネックではなくなりました（昔はサーバ調達に何か月もかかっていたそうです）。一方で、インフラの変更管理が追いつかなくなるという新たな問題が顕在化してきました。Infrastracture as Code では、変更管理が容易なインフラストラクチャにより、この問題への対応を目指します。

Kief Morrisは、著書 *『Infrastructure as Code ――クラウドにおけるサーバ管理の原則とプラクティス』* (2017年) 内でIaCに期待することとして、以下を挙げています。

> ### Infrastracture as Code の目標
> * ITインフラが変化の障害や制約になるのではなく、変化を支えて実現すること。
> * システム変更がユーザーやITスタッフのストレスや大事件ではなく、日常作業になること。
> * ITスタッフが、日常反復的なタスクではなく、彼らの能力を活かした価値のある仕事のために時間を使うこと。
> * ユーザーがITスタッフに頼るのではなく、自分で必要なリソースを定義、プロビジョニング、管理できるようになること。
> * 失敗を完全に予防できるという前提に立つのではなく、失敗が発生しても簡単かつスピーディに回復できるようになること。
> * コストがかかりリスキーな「ビッグバン」プロジェクトではなく、継続的な作業により改善、改良を実現すること。
> * 会議やドキュメントでソリューションを論ずることではなく、実装、テスト、計測を通じてソリューションの効果が証明されるようになること。

VUCAの時代、ITインフラに対しても、俊敏性と変化への対応性が求められてきています。
IaCを取り入れることで、競争に強いITインフラ環境を手に入れていきましょう、ということだと思います。

## Bicep の始め方

Bicep を始めるにあたり、ぼくが一番お勧めするのは公式のクイックスタートを眺めてみることです。

https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/quickstart-create-bicep-use-visual-studio-code?tabs=CLI

これをやることで、最も手軽に Bicep の使い方がわかると思います。
もっと体系的に使い方を学びたい場合は、Microsoft Learn もあります。ただ、個人的には、上のクイックスタートだけでも十分だと思います。それほど Bicep が直感的にわかりやすい言語であるということでもあります。

https://docs.microsoft.com/ja-jp/learn/paths/bicep-deploy/

## Bicep で使うと便利なツール
Bicep を扱う上で、あると便利な、というかほぼ必須と言ってもよいツールを紹介します。

### Visual Studio Code
Bicep のエクステンションをインストールすることで、 Bicep ファイルの作成を強力にサポートしてくれます。
具体的には、以下のような機能があります。

* プロパティや値のサジェスト機能
* 構文間違いの強調
* 使用されていない変数やパラメータの強調
* コードナビゲーション
* 作成リソースのグラフィック表示

以下のURLに Bicep エクステンションの機能のリストがありますが、どんどん機能が追加されているようで、これには載っていない機能もあります。

https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-bicep

また、Visual Studio Code では "Ctrl + @" で Terminal を実行することができ、Bicep テンプレートの編集とデプロイテストを1つのウィンドウで行うことができます。
使用端末がWindows 10 で WSL をインストールしている場合は、Terminal で WSL を選択することができ、Azure CLI 派の人に特におすすめです。Terminal 起動時のデフォルトディレクトリが、VSCode で開いているフォルダであることもポイントが高いです。


### Bicep Playground
https://bicepdemo.z22.web.core.windows.net/

有志による Bicep 作成支援のサイトだそうです。
サンプルの Bicep テンプレートがたくさん用意されています。作りたいリソース名で検索すると割とヒットします。作りたい環境ドンピシャのものはなかなかないかもしれませんが、どんなプロパティが必要なのか、など参考になります。

また、ローカルに持っている ARM テンプレートをもとに、Bicep 形式に変換することもできます。Azure Portal でリソースを作ってみて、ARMテンプレートをエクスポートし、Bicep Playground で Bicep 形式に変換する。これにより、作りたいものドンピシャの Bicep を手に入れることができます。

※ただし、この方法で作成された Bicep ファイルは、リソース名が長くてわかりづらかったり、パラメータがハードコーディングされたりしているので、そのまま使いまわすのはお勧めしません。

### Azure Portal

https://portal.azure.com

言わずと知れた Azure のマネジメントポータルです。Bicep を扱う上では2つの重要な役割があります。一つ目は、上で紹介したような、ARM テンプレートのエクスポート機能です。

もう一つは、 Bicep によるデプロイが失敗したときのエラー内容の確認です。 2021/7 現時点では、Bicep デプロイのエラー内容が、「エラー内容は __デプロイ__ の履歴から確認してね」であることが多いです。必ずしも Azure Portal から見る必要はないのですが、Azure Portal から見たほうが早いと思います。「<font color="red">(DeploymentFailed) At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.</font>」のエラー文が出たら、リソースグループの __デプロイ__ 履歴から、エラー内容を確認しましょう。

ただし、デプロイ前の構文チェックでこけている場合は、Azure までデプロイのリクエストが飛ばないため、Azure Portal からエラー内容を確認することができません。その場合は、ターミナルで表示されたエラー内容を確認してください。


### Bicep リファレンス
https://docs.microsoft.com/ja-jp/azure/templates/

もとは、ARM テンプレートのリファレンスのページでしたが、いつの間にか Bicep のリファレンスに切り替えるボタンがついていました。

このページで、リソース毎の必須プロパティや、プロパティの意味を確認することができます。 Bicep のテンプレートを作るときには、このサイトとコードを行ったり来たりして見比べることになります。

ただし、たまに記載が間違っているので、その時はシステムの動きを正として理解してください。具体的には、 __Required__ が yes と記載されていても実は不要だったり、その逆だったり、そもそもプロパティが間違っていることもまれにあります。間違いを見つけたら、Azure のサポートに連絡するか、GitHubから pull request を送ってあげるとよいでしょう。

[Microsoft Docs 共同作成者ガイド概要](https://docs.microsoft.com/ja-jp/contribute/)

## おわりに

今回は、Azure の IaC ツールである、 Bicep をご紹介しました。
ARM テンプレートで IaC をやろうと思って挫折した人なら、Bicep の使いやすさに感動することだと思います。
初めて IaC に取り組むという方は、最初から全部を IaC でやろうとせず、できるところから小さく初めてみるのがおすすめです。最初は少し難しいかもしれませんが、慣れるときっと楽しくなってくると思います。

## 参考文献

1. Microsoft Docs - Bicep
    https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/overview

1. Kief Morris, 『Infrastructure as Code ――クラウドにおけるサーバ管理の原則とプラクティス』, オライリー・ジャパン, 2017
    https://www.oreilly.co.jp/books/9784873117966/

1. Azure Infrastructure as Code 体験入隊
    https://www.slideshare.net/ToruMakabe/azure-infrastructure-as-code