【ITニュース解説】Automating Hub & Spoke Secure Azure Networks with Terraform (IaC) & Azure Firewalls
2025年09月13日に「Dev.to」が公開したITニュース「Automating Hub & Spoke Secure Azure Networks with Terraform (IaC) & Azure Firewalls」について初心者にもわかりやすく解説しています。
ITニュース概要
Azure上でセキュアなHub & SpokeネットワークをTerraform(IaC)で自動構築する。中央のハブ(Azure Firewall)で全ての通信を監視し、アプリ用ネットワーク(スポーク)の安全を確保。コードでインフラを管理し、ミスなく効率的にクラウド環境をデプロイする手法を学ぶ。
ITニュース解説
クラウドネットワークのセキュリティは、ビジネスのデジタル資産を守る上で非常に重要である。顧客データや会社の機密情報、アプリケーションといった大切な情報を安全に保管するため、適切なセキュリティ対策が不可欠である。仮想ネットワーク(VNet)、セキュリティグループ、ファイアウォール、暗号化といった仕組みが、増え続けるサイバー攻撃からデジタル資産を保護する。しかし、広大で常に変化するクラウド環境でセキュリティを手動で管理することはほぼ不可能に近い。そこで、自動化が非常に重要なツールとなる。スマートな自動化システムを導入すれば、常にすべてのセキュリティ対策が有効であることを確実にし、デジタル資産をリアルタイムで安全かつ回復力のある状態に保てる。
このセキュリティを実現する効果的なネットワーク管理方法の一つが、ハブ&スポークモデルである。このモデルでは、ハブがセキュリティと接続の中心点となり、そこに設置されたAzure Firewallがすべてのトラフィックを検査する。一方、スポークはアプリケーションをホストする隔離されたVNetとして機能する。この設計は、セキュリティを一元管理し、ルーティングを簡素化し、ネットワークを容易に拡張可能にする。
このネットワークは主要なコンポーネントで構成される。ハブVNetは、Azure Firewallが配置される場所であり、すべてのトラフィックの中央チェックポイントとなる。アプリケーションVNet(App (Spoke) VNet)は、アプリケーションが展開される場所である。ここでは、フロントエンドはアプリケーションセキュリティグループ(ASG)により保護され、バックエンドはネットワークセキュリティグループ(NSG)により詳細に制御される。DNSについては、プライベートDNSゾーンが内部名の解決に使用され、アプリケーションが安全に通信できるようプライベートレコードを保証する。ルートテーブルは、ユーザー定義ルート(UDR)で設定され、スポークからのすべてのトラフィックがハブのファイアウォールを通過するよう強制する。
トラフィックの流れは次のようになる。インターネットからのインバウンドトラフィックは直接ハブファイアウォールに向かい、そこからスポークVNet内の適切なアプリケーションに転送される。フロントエンドのASGは、許可されたトラフィックのみがWebサーバーに到達することを保証する。スポークVNet内のアプリケーションからのアウトバウンドトラフィックは、インターネットに到達する前にハブファイアウォールで検査される。DNSクエリはプライベートDNSゾーンを介して内部的に処理され、ハブファイアウォールがそのリクエストを転送する。
このような複雑なインフラストラクチャを効率的かつ確実に構築するためには、Infrastructure as Code(IaC)という考え方が不可欠である。IaCとは、インフラ全体をコードとして定義するアプローチであり、Terraformはそのための強力なツールである。Terraformを使うことで、インフラのデプロイが繰り返し可能で一貫性があり、変更不可能なものとなる。また、アプリケーションコードと同様にインフラをバージョン管理できるため、変更履歴を追跡しやすくなり、デプロイメントを完全に自動化できるという大きな利点がある。
Terraformでこのアーキテクチャをデプロイするには、いくつかの準備が必要となる。具体的には、AzureアカウントとAzureサブスクリプション、Azure CLI、Terraformデプロイメントを許可する適切な権限を持つアプリケーションロール、Terraformのインストール、Azure Terraform Visual Studio Code拡張機能が求められる。さらに、Terraformの状態ファイル(state file)を安全に保存し、チームでの共同作業を可能にするため、リモートバックエンド(HashiCorp Terraform CloudやAzure Storage Accountなど)を設定することが重要である。IPレンジ、ロケーション、リソースグループ名といった主要な設定に変数を使用することで、コードの柔軟性が高まり、開発、ステージング、本番といった異なる環境に同じアーキテクチャを容易にデプロイできるようになる。
Terraformプロジェクトのディレクトリは、通常いくつかのファイルに構造化される。main.tfは、AzureリソースプロバイダとTerraformのリモートバックエンド設定を宣言するコアファイルであり、状態ファイルの安全な保存とチームコラボレーションを保証する。deployments.tfは、リソースグループ、VNet、サブネット、ファイアウォール、セキュリティグループ、仮想マシンなど、デプロイするすべてのAzureリソースの定義を含む主要なファイルである。variables.tfは、設定のためのすべての入力変数を格納し、メインコードを変更せずに簡単にカスタマイズできるようにする。outputs.tfは、デプロイが成功した後に、ファイアウォールのパブリック/プライベートIPや作成されたサブネットのIDなど、出力される値を指定する。最後に、terraform.tfvarsは、variables.tfで宣言された変数に実際の値を設定するファイルである。
Terraformによるデプロイメントは、一連のコマンドによって実行される。まず、terraform initコマンドで作業ディレクトリを初期化し、必要なプロバイダプラグインをダウンロードし、リモートバックエンドを設定する。次に、terraform fmtで設定ファイルのフォーマットを整え、terraform validateで構文エラーがないか確認する。terraform planは、デプロイされるリソースの作成、変更、破棄の内容を示す実行計画を作成し、デプロイ前に変更内容を確認するための重要なステップである。そして、terraform applyコマンドで計画された変更をクラウドプロバイダに適用し、インフラを構築する。
具体的なリソースの構築は次のように進める。まず、Azureリソースグループを作成する。これは関連するリソースをまとめる論理的なコンテナである。次に、アプリケーションのためのApp (Spoke) VNetとそのサブネットとして、フロントエンド用とバックエンド用のサブネットを作成する。同時に、Azure Firewallを配置するためのハブVNetとそのサブネットも作成する。これらのVNet間での通信を可能にするため、ハブとスポークVNet間でVNetピアリングを設定する。これにより、両VNetが直接通信できるようになる。
さらに、仮想マシンをデプロイする。この例では、2台のLinux Ubuntuサーバー仮想マシンを作成し、それぞれにパブリックIPアドレスとネットワークインターフェースを割り当てる。VM-1をフロントエンドサブネットに、VM-2をバックエンドサブネットに接続する。セキュリティ対策として、ASGを作成し、VM-1のネットワークインターフェースに関連付ける。これにより、特定のアプリケーションポートへのアクセスを細かく制御可能となる。また、NSGを作成し、バックエンドサブネットに関連付けることで、バックエンドリソースへのアクセスを制御する。さらに、ASGに属するVM-1へのSSH(ポート22)アクセスを許可するインバウンドNSGルールを設定する。
Azure Firewallの構築も重要なステップである。まず、スポークVNet内にAzure Firewall用のサブネットを作成する。次に、このサブネットにAzure Firewall自体をデプロイし、これにファイアウォールポリシーとパブリックIPアドレスを関連付ける。ファイアウォールポリシーには、アプリケーションルールコレクションとネットワークルールコレクションを含めることで、許可するアプリケーションプロトコルやネットワークポート、送信先を具体的に定義し、トラフィックを詳細に制御する。
ネットワークルーティングの構成では、スポークVNetのファイアウォールへのトラフィックを誘導するルートテーブルを作成する。このルートテーブルは、フロントエンドおよびバックエンドサブネットに関連付けられ、これらのサブネットからのすべての送信トラフィックが、作成したAzure FirewallのプライベートIPアドレスをネクストホップとして経由するよう設定される。これにより、すべての送出トラフィックがファイアウォールによって検査されることが保証される。
最後に、DNSゾーンの構成を行う。内部名の解決のために、プライベートDNSゾーンを作成し、このDNSゾーンをスポークVNetにリンクさせる。これにより、スポークVNet内のリソースがプライベートDNSゾーンに登録された名前を解決できるようになる。さらに、バックエンド仮想マシン(VM-2)のプライベートIPアドレスをマップするDNS AレコードをプライベートDNSゾーンに作成し、アプリケーション間の名前解決を可能にする。
テストと検証が完了したら、不必要なコストを避け、Azureサブスクリプションを整理するために、作成したすべてのインフラストラクチャを削除することが推奨される。Terraformでは、terraform destroy --auto-approveコマンドを実行するだけで、Terraformが管理するすべてのリソースを自動的に破棄できる。
TerraformとIaCを用いることで、自動化され、一貫性があり、拡張が容易なセキュアなハブ&スポークネットワークをAzure上に構築することが可能となる。この設定は、手動によるエラーを減らし、環境の管理を簡素化する。重要な教訓として、ファイアウォールの配置(集中型か各スポークか)を慎重に選択し、ルーティングの問題を避けるためDNSを正しく設定することが挙げられる。賢明な設計選択は、安全で柔軟なクラウドネットワークを構築し、将来のニーズに合わせて成長させることを可能にする。