📌

Terraformを本気で使う。Azureで【とりあえずIaaSを作ろう】

2024/12/13に公開

はじめに

前回までの記事では主に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

img

AzureポータルからClockOpsで作成する場合であれば、上記の第一階層のリソースをポチポチっとするだけで良しなに作成することができるのですが、Terraformに限らずIaCで作成する場合は全ての階層のリソースを一つ一つ丁寧に作成していきます。

以下のリポジトリに公開しています。

https://github.com/katakura/azure-terraform-iaas-sample

気づいたこと

ARM Template, Bicepを過去に使いまくっていた私が、Terraform(+azurerm module)を使ってみて、気づいたことや引っかかった事を記載します。

無論Terraformのマスターになるにはほど遠いレベルなので、誤解や機能を知らないだけな部分も多々あると思いますので、有識者の方はぜひコメントで教えてくださいね。

variableで設定値の制限がめんどい

いやっ、validationブロックにはとても詳細に条件が記述できて素晴らしいですね。

設定値がNGの時に独自エラーメッセージも出力できたりとパーフェクトなんですけど、条件の追加・変更がちょっと大変そう(私感)

https://github.com/katakura/azure-terraform-iaas-sample/blob/zenn/src/main.tf#L1-L9

BicepでいうところのuniqueStringが欲しいかも

これですね。

https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/bicep-functions-string#uniquestring

Azure Storage AccountやMySQL Flexible serverなど、リソース名がグローバルでユニークな値を設定する必要があったりしますが、BicepではこちらのuniqueString()を使ってパラメータとしてResource GroupのIDなどを渡しておけば環境毎に毎回同じ文字列が生成されました。

どうやらこれに準ずる機能が無さそうで、先人の知恵をいろいろ調べると、random_idモジュールを使ってリソース名が被らないようにしているようです。

https://github.com/katakura/azure-terraform-iaas-sample/blob/zenn/src/main.tf#L90-L104

この例ではmysql_nameのbyte_lengthを長くすれば、それだけ他(他者含む)と被らないリソース名が生成できそうですね。

terraform apply時には前回デプロイした情報を「tfstate」で状態管理しているので更新デプロイの度に別のリソース名が割り振られることはないそうです。

ただ、個人的にはリソース名が被らないようにワンチャン賭けている感はあります。

cidrsubnet超便利

AzureでもAWSでも、仮想ネットワーク全体のアドレススペースを定義して、その中からサブネットを切り出していくのですが、このcidrsubnet()は便利ですね。

以下の例ではvar.vnet_cidrに「10.0.0.0/24」が設定されている場合に「4ビットで切り出した2番目のCIDRを返す」といった指定になります。

https://github.com/katakura/azure-terraform-iaas-sample/blob/zenn/src/main.tf#L129-L131

つまり「10.0.0.16/28」が返されるということ。

azurermの「なんちゃら_association」モジュール

例えばAzure Network Security Groupのリソースは、ARM Template的にはVirtual Networkや、NICの中にあるプロパティで指定しますが、Terraformのazurermでは「azurerm_network_interface_security_group_association」などで別リソースとして定義を書きます。

https://github.com/katakura/azure-terraform-iaas-sample/blob/zenn/src/main.tf#L181-L184

感覚的にはこちらの方が、必要なNSG、NIC、VNET作成後にそれぞれの割付を行うので、スマートな感じを受けました。

おわりに

とりあえず数日使った感想でした。

また気づいたら、追記 or 別記事を書きたいと思います。

まだまだ、Terraformに関しては初級レベルだと思いますので、ぜひ有識者の方いろいろ教えてもらえると助かります。

その他記事

https://zenn.dev/yotan/articles/09ddfbf6db24d1

https://zenn.dev/yotan/articles/f67037e76526e3

https://zenn.dev/yotan/articles/4aaa62fd11abee

https://zenn.dev/yotan/articles/ef04dd11593818

Discussion