この記事では、Azureの基本的なネットワークコンポーネントである仮想ネットワーク(VNet)、サブネット、そしてネットワークセキュリティグループ(NSG)をTerraformで構築する具体的な手順を解説します。
本記事を進めるにあたり、TerraformがAzureと正しく連携するための認証設定が完了していることが前提となります。
もし、まだ認証設定がお済みでない場合は、先に 【terraform入門】Azureのリソースグループをterraformで作成する手順を解説をご覧いただき、backend.tf
を用いた認証情報のセットアップを済ませてから、こちらの記事の手順を実施してください。
Azure仮想ネットワークとは?
Azure仮想ネットワーク(VNet)は、Azureクラウド内に構築されるお客様専用のプライベートネットワークです。オンプレミスのネットワークと同様に、IPアドレス空間の定義、サブネットの作成、ルーティングテーブルやネットワークゲートウェイの設定などを通じて、ネットワーク環境を完全に制御できます。
Azure仮想ネットワークを利用することで、Azure上の仮想マシン(VM)やその他のリソースが相互に、あるいはインターネットやオンプレミスネットワークと安全に通信できるようになります。例えば、Webサーバーとデータベースサーバーを異なるサブネットに配置し、ネットワークセキュリティグループ(NSG)を使ってそれぞれの通信を細かく制御するといった構成が可能です。
仮想ネットワークは、Azureにおけるネットワーク接続の基本的な構成要素であり、アプリケーションの分離、セキュリティの強化、ハイブリッド接続の実現など、様々なシナリオで活用されます。Terraformを使用することで、これらの仮想ネットワークの構成をコードとして定義し、再現性の高いインフラ構築を実現できます。
サブネットとは?
サブネットは、仮想ネットワーク(VNet)のIPアドレス空間をさらに小さく分割したものです。仮想ネットワークを複数のサブネットに分割することにより、ネットワークをより効率的に管理し、セキュリティを強化することができます。
例えば、Webアプリケーションを運用する場合、フロントエンドのWebサーバー群を配置するサブネット、バックエンドのデータベースサーバー群を配置するサブネット、管理用の踏み台サーバーを配置するサブネット、といったように役割ごとにサブネットを分けることが一般的です。
各サブネットには、それぞれ異なるネットワークセキュリティグループ(NSG)を関連付けて、サブネット内外の通信を細かく制御したり、ルートテーブルを適用してトラフィックの経路を制御したりすることができます。また、Azureのサービスによっては、専用のサブネットを必要とするものもあります(Azure BastionやAzure Firewallなど)。
Terraformを用いることで、仮想ネットワーク内にこれらのサブネットを定義し、各サブネットのIPアドレス範囲や関連付けるリソースをコードで管理することが可能になります。
NSG(ネットワークセキュリティグループ)とは?
NSG(ネットワークセキュリティグループ)は、Azure仮想ネットワーク内のリソースに対するネットワークトラフィックを制御するためのファイアウォール機能を提供します。NSGを使用することで、仮想マシンやサブネットレベルで、送受信されるトラフィックを許可または拒否するセキュリティルールを定義できます。
NSGは、以下の要素から構成されるセキュリティルールのリストを含んでいます。
項目名 | 説明 | 例・補足 |
---|---|---|
名前(name) | ルールを識別する一意の名前 | AllowSSH , DenyHTTP など |
優先度(priority) | 100~4096の整数。小さいほど優先的に適用される | 100 , 200 , 1001 など |
方向(direction) | 通信の方向を指定(インバウンド or アウトバウンド) | Inbound , Outbound |
アクション(access) | トラフィックを許可するか拒否するか | Allow , Deny |
プロトコル(protocol) | 対象の通信プロトコル | Tcp , Udp , Icmp , * (すべて) |
ポート範囲(ports) | 対象のポート番号または範囲(送信元/宛先) | 22 , 80 , 443 , 1000-2000 , "*" など |
送信元 IP(source) | トラフィックの送信元 IP アドレスまたは CIDR、サービスタグ | "*" , 10.0.0.0/24 , Internet , VirtualNetwork |
宛先 IP(destination) | トラフィックの宛先 IP アドレスまたは CIDR、サービスタグ | "*" , 10.0.1.4 , AzureLoadBalancer |
NSGは、仮想マシンのネットワークインターフェース(NIC)またはサブネットのいずれか(あるいは両方)に関連付けることができます。NICとサブネットの両方にNSGが関連付けられている場合、トラフィックはまずサブネットのNSGによって評価され、次にNICのNSGによって評価されます。
Terraformを利用することで、これらのNSGおよびそのセキュリティルールをコードとして定義し、一貫性のあるセキュリティポリシーを適用・管理することができます。
Terraformで実際にリソースを作成する
ここからは、実際にTerraformのコードを記述して、Azure上に仮想ネットワーク、サブネット、そしてネットワークセキュリティグループを作成していきます。Terraformを利用することで、これらのネットワークリソースの構成をコードとして管理でき、再現性のあるインフラ構築や変更管理が容易になります。
作成するリソースの確認
今回のハンズオンで作成するAzureリソースは以下の通りです。これらのリソースは、あらかじめ用意されたリソースグループ ait-terraform-rg01
の中に作成されます。
- 仮想ネットワーク(VNet):
ait-vnet01
- サブネット:
ait-snet01
- ネットワークセキュリティグループ(NSG):
ait-nsg01
- サブネットとNSGの関連付け
【事前準備】
もし、リソースグループ ait-terraform-rg01
がまだ作成されていない場合は、Terraformを実行する前にAzureポータルなどから作成しておいてください。Terraformから既存のリソースグループを参照し、その中に新しいリソースをデプロイします。
.tfファイルの作成
まず、Terraformのコードを記述するためのファイルを作成します。backend.tf
を作成したフォルダと同じ階層に、vnet.tf
という名前で新しいファイルを作成してください。
ファイル名は任意ですが、管理しやすいように内容を表す名前(ここでは仮想ネットワーク関連なので vnet.tf
)を付けるのが一般的です。
Terraformコードを記述
Visual Studio Codeなどのテキストエディタで vnet.tf
ファイルを開き、以下のコードを記述していきます。
# 既存のリソースグループを参照
data "azurerm_resource_group" "existing" {
name = "ait-terraform-rg01"
}
# 仮想ネットワーク(ait-vnet01)
resource "azurerm_virtual_network" "ait_vnet01" {
name = "ait-vnet01"
address_space = ["10.0.0.0/16"]
location = data.azurerm_resource_group.existing.location
resource_group_name = data.azurerm_resource_group.existing.name
}
# サブネット(ait-snet01)
resource "azurerm_subnet" "snet01" {
name = "ait-snet01"
resource_group_name = data.azurerm_resource_group.existing.name
virtual_network_name = azurerm_virtual_network.ait_vnet01.name
address_prefixes = ["10.0.1.0/24"]
}
# ネットワークセキュリティグループ(ait-nsg01)
resource "azurerm_network_security_group" "nsg01" {
name = "ait-nsg01"
location = data.azurerm_resource_group.existing.location
resource_group_name = data.azurerm_resource_group.existing.name
security_rule {
name = "AllowSSH"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = "*"
destination_address_prefix = "*"
}
}
# サブネットとNSGを関連付け
resource "azurerm_subnet_network_security_group_association" "snet01_nsg" {
subnet_id = azurerm_subnet.snet01.id
network_security_group_id = azurerm_network_security_group.nsg01.id
}
Azureポータル上にリソースを作成
Terraformのコード(.tf
ファイル)が完成したら、コマンドラインインターフェース(CLI)を使って実際にAzure上にリソースをデプロイします。vnet.tf
ファイルが保存されているディレクトリで、以下のコマンドを順番に実行してください。
① 初期化
terraform init
このコマンドで、Terraformの作業ディレクトリを初期化します。
具体的には、コード内で使用されているプロバイダ(この場合は azurerm
)をダウンロードし、設定ファイル(.tfstate
ファイルなど)を管理するための準備を行います。プロジェクトの初回実行時や、プロバイダのバージョンを変更した場合などに実行が必要です。
② プランの確認
terraform plan
このコマンドは、現在のTerraformコードが実際にインフラにどのような変更を加えるかをプレビュー表示します。リソースが新規作成されるのか、変更されるのか、あるいは削除されるのかといった情報が詳細に示されます。実際にリソースを操作する前に、意図した通りの変更内容になっているかを確認するための非常に重要なステップです。
実行後、以下のような4つのリソースを作成するメッセージが表示されていることを確認します。
Plan: 4 to add, 0 to change, 0 to destroy.
③ デプロイ(適用)
terraform apply
terraform plan
で表示された実行計画に問題がなければ、このコマンドで実際にAzure上にリソースを作成(デプロイ)します。コマンドを実行すると、再度実行計画が表示され、適用してよいかの確認を求められます。
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
ここで yes
と入力してEnterキーを押すと、TerraformがAzure APIを呼び出し、定義したリソースの作成を開始します。処理には数分かかる場合があります。
Azureポータルで確認
Terraformの apply
コマンドが正常に完了したら、Azureポータルにログインして、リソースが正しく作成されているかを確認しましょう。

- Azureポータルで、リソースグループ
ait-terraform-rg01
を開きます。 - リソースグループの「概要」ページのリソース一覧に、以下のリソースが作成されていることを確認します。
ait-vnet01
(種類:仮想ネットワーク)ait-nsg01
(種類:ネットワーク セキュリティ グループ)
- 仮想ネットワーク
ait-vnet01
をクリックし、「サブネット」メニューを選択すると、ait-snet01
が10.0.1.0/24
のアドレス範囲で作成されていること、そしてネットワークセキュリティグループとしてait-nsg01
が関連付けられていることを確認できます。 - ネットワークセキュリティグループ
ait-nsg01
をクリックし、「受信セキュリティ規則」メニューを選択すると、AllowSSH
ルールが定義されていることを確認できます。
このように、Terraformを使用することで、インフラの構成をコードで明確に定義し、コマンド一つで確実にデプロイできることがわかります。また、Azureポータルで視覚的に確認することで、コードと実際のインフラが一致していることを確かめることができます。
④ 作成したリソースを削除する
Terraformで作成したリソースは、以下のコマンドで削除できます。
terraform destroy
このコマンドは、現在のTerraformコードと .tfstate
ファイルをもとに、作成された全てのリソースを削除するための計画を表示します。
その後、terraform apply
と同様に確認を求められ、yes
と入力することでAzure上のリソースが削除されます。
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only ‘yes’ will be accepted to confirm.Enter a value:
まとめ
今回は、Terraform を使って Azure の仮想ネットワーク(VNet)、サブネット、そして NSG を作成する手順を解説しました。実際に手を動かして、コードでインフラを管理する Infrastructure as Code (IaC) の便利さや、設定作業の効率化、ミスの削減といったメリットを感じていただけたのではないでしょうか。
この記事で学んだ基本を土台にして、ぜひ他の Azure リソースの自動化にも挑戦し、Terraform の活用範囲を広げていってくださいね!
コメント