Terraformを本気で使う。Azureで【とりあえずIaaSを作ろう】
はじめに
前回までの記事では主にTerraform Cloudの使い方、既存コードのTF化について試用記を書きました。
今回はAzure仮想ネットワーク、仮想マシン、MySQLをゼロベースからVisual Studio Codeの拡張機能、GitHub Copilotの力を借りて作成したので、そこで気づいたことの投稿です。
Azure Terraformを分かっている人には物足りないかと思いますが、何卒なにとぞ。
Azure Terraform関連の記事一覧は最後の「その他記事」を参照ください。
今回作る構成
以下のリソースを作りました。
- 仮想ネットワーク
- Subnet
- 仮想マシン
- OSディスク
- NIC
- Public IP
- NSG
- MySQL Flexible Server
- Private DNS Zone
AzureポータルからClockOpsで作成する場合であれば、上記の第一階層のリソースをポチポチっとするだけで良しなに作成することができるのですが、Terraformに限らずIaCで作成する場合は全ての階層のリソースを一つ一つ丁寧に作成していきます。
以下のリポジトリに公開しています。
気づいたこと
ARM Template, Bicepを過去に使いまくっていた私が、Terraform(+azurerm module)を使ってみて、気づいたことや引っかかった事を記載します。
無論Terraformのマスターになるにはほど遠いレベルなので、誤解や機能を知らないだけな部分も多々あると思いますので、有識者の方はぜひコメントで教えてくださいね。
variableで設定値の制限がめんどい
いやっ、validationブロックにはとても詳細に条件が記述できて素晴らしいですね。
設定値がNGの時に独自エラーメッセージも出力できたりとパーフェクトなんですけど、条件の追加・変更がちょっと大変そう(私感)
BicepでいうところのuniqueStringが欲しいかも
これですね。
Azure Storage AccountやMySQL Flexible serverなど、リソース名がグローバルでユニークな値を設定する必要があったりしますが、BicepではこちらのuniqueString()を使ってパラメータとしてResource GroupのIDなどを渡しておけば環境毎に毎回同じ文字列が生成されました。
どうやらこれに準ずる機能が無さそうで、先人の知恵をいろいろ調べると、random_idモジュールを使ってリソース名が被らないようにしているようです。
この例ではmysql_nameのbyte_lengthを長くすれば、それだけ他(他者含む)と被らないリソース名が生成できそうですね。
terraform apply時には前回デプロイした情報を「tfstate」で状態管理しているので更新デプロイの度に別のリソース名が割り振られることはないそうです。
ただ、個人的にはリソース名が被らないようにワンチャン賭けている感はあります。
cidrsubnet超便利
AzureでもAWSでも、仮想ネットワーク全体のアドレススペースを定義して、その中からサブネットを切り出していくのですが、このcidrsubnet()は便利ですね。
以下の例ではvar.vnet_cidrに「10.0.0.0/24」が設定されている場合に「4ビットで切り出した2番目のCIDRを返す」といった指定になります。
つまり「10.0.0.16/28」が返されるということ。
azurermの「なんちゃら_association」モジュール
例えばAzure Network Security Groupのリソースは、ARM Template的にはVirtual Networkや、NICの中にあるプロパティで指定しますが、Terraformのazurermでは「azurerm_network_interface_security_group_association」などで別リソースとして定義を書きます。
感覚的にはこちらの方が、必要なNSG、NIC、VNET作成後にそれぞれの割付を行うので、スマートな感じを受けました。
おわりに
とりあえず数日使った感想でした。
また気づいたら、追記 or 別記事を書きたいと思います。
まだまだ、Terraformに関しては初級レベルだと思いますので、ぜひ有識者の方いろいろ教えてもらえると助かります。
その他記事
Discussion