TerraformでAzureにVMをデプロイするチュートリアルを覗いてみる
これは何...?
最近はBicepが個人的ブームなところがあり、いくつかのサンプルを作ったり解説記事を書いたりしてきました。
- https://zenn.dev/microsoft/articles/3121cdcbdace45
- https://zenn.dev/microsoft/articles/fb64aa52b1dec6
一方で、IaCをやっているのにTerraformを扱ったことがないという状況にWhy Bicep?を答えられない不安を覚え、Terraformも触ってみようと一念発起しております。今回の趣旨としてはBicep経験者としてTerraformゼロから触ってみよう、ということでチュートリアルを見ていくというものです。
Microsoftのドキュメント
Terraformは管理がHashicorpということもあり、Microsoftの直接のサポートを受けづらい製品です。おそらくベストエフォートでの対応という形になると思います。ただ、ドキュメントはゼロではないので、簡単なチュートリアルなんかは用意されています。
触ってみよう
先述のチュートリアルの資材をもとに、自分なりのコメントを残しながら書き直したものをこちらに格納しています。適宜見てみてください。
シンプルに以下のようなリソース群がデプロイされます。
上記サンプルにおける個人的ポイント
random_petって何ぞ?
providers.tf
でインポートしたrandom
のリソースとしてrandom_pet
というものが随所で用いられており、これは何だと迷った。結局、ランダムにペットの名前をつけるっていうちょっと変わったリソースだった。
Parent的な概念の違い
サブネットの作成にもVNETとリソースグループ名を渡すだけで、シンプルにかける。明示的な親子関係はazurermプロバイダーによってかなり抽象化されている。
# サブネットの作成
# TerraformにはBicepでいうParent/Childの概念はないっぽい
resource "azurerm_subnet" "vnet_main_subnet" {
name = "subnet-${azurerm_virtual_network.vnet_main.name}"
resource_group_name = azurerm_resource_group.rg_main.name
virtual_network_name = azurerm_virtual_network.vnet_main.name
address_prefixes = [ "10.0.1.0/24" ]
}
NSGのアタッチがリソース定義として書ける
これは分かり易くてよい。Bicepの場合はSubnetのプロパティに含める形になる。
# NSGとSubnetの紐づけ
# これが宣言できるのはかなり便利かも
# Bicepでは後付けでNSGをアタッチすると構文が冗長になる
resource "azurerm_subnet_network_security_group_association" "nsg_subnet_main" {
network_security_group_id = azurerm_network_security_group.nsg_deafault.id
subnet_id = azurerm_subnet.vnet_main_subnet.id
}
なんというか、全体的にAzure Portalを捜査しているかのような手順で記述できている気がしますね。
Terraformはポータルのデプロイ履歴に載らない?
以下のようにリソースグループにそれっぽいデプロイ履歴は残るのですが、実際に見てみるとVMのみが作成されているように見えます。それ以外のリソースの扱いが謎です(要確認)。
サブスクリプションのレベルのデプロイ履歴にはVM作成の痕跡があるものの、それ以外は見当たらない。
おわりに
BicepとTerraformの違いについてはこちらの記事を読むとイメージが付きやすいかもです。他にもあるかもですが、自分の知識もそこまでないので、一旦腑に落ちました。今後もちょくちょくTerraform x Azureの個人検証記録は上げていこうかと思っております。
Discussion