LinuxユーザーがイジるはじめてのAzure

LinuxユーザーがAzureを使いこなせるように応援するブログです

Bicep で IaC を実現する

久しぶりの更新です。

 

みなさん、IaC ( Infrastracture as Code ) 好きですか?

TerraformやARM templates、Cloud Formation、Chef、Ansible などなど様々なクラウド環境のインフラ構築を自動化するOSS技術や、クラウドベンダーから提供されているサービスもいくつかありますよね。

 

今回の記事は Azure が提供する IaC を実現するための Bicep (ばいせっぷ) について記載しましょう。既に Azure Resource Manager Templates を利用されている方や過去に触ってみたことがある方、はとっつきやすいと思います。

 

でははじめましょ。

 

■ Bicep って何?

 ばいせっぷ、と呼びますが、英語で上腕二頭筋、つまり「力こぶ」を表す英単語になります。Azure Resource Manager Templates は ARM Templatesと訳されることが多く、ARM、つまり腕、、その腕をさらにパワーアップさせる力こぶ!というニュアンスから来たネーミングのようです。※こういうセンス嫌いじゃないw

 

ではそもそもBicepとは何か、という話ですが、単純に言えばJSONを生成するためのラッパー言語です。ARM templatesはJSON形式でゴリゴリ記載することになるため、かなりしんどいです。構造定義を読み解く、書き込むにはかなり職人芸的な位置づけでした。そんな職人しか扱えないようなARM templatesを、Bicep という言語をかぶせることで楽に書けるようにした、という位置づけとなっています。ですのでBicepファイルをコマンドラインVisual Studio Codeなどから実行すると、内部的には一旦ARM templatesにジェネレートされてAzure APIへ通信にいく、という構図になっています。また、ファイル変換もできるようになっており、JSON to Bicep、Bicep to JSONといったファイルフォーマットを変換させることもできます。

 

当然、ARM templateではできないことはBicepでもできません。新しすぎるサービスのAPIがtemplate referenceにもまだ対応できていなければ当然bicepでもできません。(ほぼそういうことは起きないような設計になっていますが念のため)

 

■ どうやって使うの?

ARM templatesと同じように、Azure CLI、Azure PowerShellからBicepファイルを指定してデプロイさせる、ということもできますが、1番のお薦めはVisual Studio Code(無償エディタ) です。Visual Studio って聞くと、なんだか難しそうでC#使いが利用する開発ツールじゃね?ってイメージはあるかもしれませんが、なんてことはない、VS Codeは単なるエディタとして使うだけです。

 

ダウンロードは以下。

Visual Studio Code – コード エディター | Microsoft Azure

 

なぜ Visual Studio Code がよいのか、というと拡張機能が豊富になっているからですね。例えばARM templatesであれば Azure Resource Manager Toolsという拡張機能VS Codeからインストールすると、jsonの各項目が色分けされて表示し見やすくなりますが、同じようにBicep拡張機能(Bicepという名前であります)をインストールすると、色分けはもちろん、VS CodeからBicepファイルを実行したり、アカウント設定がされていればサブスクリプションの選択やResource GroupをBicepファイル実行と共に作成してくれたりします。また、IntelliSenseと呼ばれる次に記載する内容をプルダウン形式で選択できるようになる機能もついているため、毎回オフィシャルサイトを見ながらコピペして、、みたいなこともせずにゴリゴリ書けます。

 

■ どんなことができるの?

Azureリソースを全てBicep で記載し自動構築することができます。ARM templatesもそうですが、Bicepも直接APIをコールする形になるため、Azure API Referenceで記載されているものはなんだって実装できちゃいます。例えば、こんなポンチ絵を見た時に、みなさんはどうやって構築していくことをイメージするでしょうか?

 

 

Azure 構築に慣れている人であれば、あーよくあるvNET hub&Spoke構成だね、ネットワークルーティング経路はなんとなくイメージできるけど、細部まではちょっとわからないなぁ、っと感じることもあるでしょうし、えっと、これをSIとして受けて構築するとしたら0.7人月x2ぐらいは必要かなーっとイメージされる人もいるでしょうね。

 

こんな環境が、Bicepだと、bicepファイルを1つ実行するだけで「わずか7分」で全部できちゃうんです!

 

って、いやね、別に速度をアピールしたいわけではないんです。この環境の各リソースにはRBAC権限設定も入れ、診断設定もLog Analytics Workspaceに飛ばしてますし、ネットワークウォッチャーのNSG Flow Logsも連携してて、keyvaultにはVMへログインするAdminパスワード(linuxはrootパスワード)もちゃんと保管して、セキュアに取り出すようにし、Azure Firewallのアプリケーションルールやネットワークルール、NSGの受信規則なども最低限必要なルールセットを全て入れており、AppGWはWAFでOWASP3.1のWAF Policyとも関連付けさせてIDSとして機能させ、特定のIP address レンジからのアクセスのみをブロックさせるような個別ルールも入れてるんですね。そしてCloud Adption Frameworkに記載されているような命名規則もちゃんと守ってリソース名を付けてタグもちゃんと全てのリソースに付与してます。

 

これらをARM templatesでやろうとしたら依存性の問題やら書き方やらでクッソしんどいことになるんですが、なんとこの環境を作るbicep開発にかかった時間はたったの2週間です。0.5人月x1で7分で構築できちゃうIaCが実現できちゃうわけです。

 

もちろん同じリソースグループに何度もデプロイし変更要素だけを反映させることもできますし、別のリソースグループや別のサブスクリプション、別のテナントだってtargetScopeを変更すれば同じものを7分で構築できちゃうわけです。

 

ドキュメント見ながらAzure Portalでポチポチやったり、個別個別でpowershellやAzure CLIスクリプト作って個別最適された自動化ツールを作るのもよいですが、今の時代はこういう環境を丸ごと構築できちゃうような開発がインフラエンジニアでもできちゃうんだよ、ということを知ってほしいなと。

 

■ サンプルちょーだい

localtemplate/bicep/BICEP at master · akkoike/localtemplate (github.com)

 

getStart.bicepをVS Codeから実行すればできちゃうサンプルコードです。VS CodeでAzureへログインできるアカウント設定をしておき、githubアカウントと連携させてgit cloneでもやってローカル環境のVS Codeに落とし込んでやってみてください。最初に自分の設定を入れる必要があるので、そこだけgetStart.bicepの最初のコメント行を読んでおいてください。

 

ちなみにここで作られる環境は1日放置しても1500円ぐらいです。(Azure FirewallとApplication Gatewayだけ、立てるだけでそこそこ金かかるけど、もっと安くするなら最近出たAzure Firewall BasicにSkuを変更してもよいでしょう)

 

■ ハマりどころと勘所

いくつかあるので、ここでは長くなったのでこの辺にし、次回の記事にでも記載しますね。まずはbicep触ってからじゃないと伝わらないことが多すぎるのでw

 

今回はここまで。