この記事のポイント
Azure VMの構築はTerraformによるIaC化を第一選択にすべき。init→plan→applyの3ステップで再現性のあるデプロイが完了する
開発・検証にはBシリーズ(月額約1,500円〜)、本番ワークロードにはDシリーズ(月額約8,000円〜)を選ぶべき
MFA義務化に未対応の環境は即座にサービスプリンシパル認証へ移行すべき。セキュリティリスクを放置してはならない
tfstateファイルはAzure Blob Storageでリモート管理すべき。ローカル保存はチーム開発で状態不整合の原因になる
NSGのSSHルールはsource_address_prefixを自社IPに限定し、不要時はterraform destroyでリソースを一括削除してコストを抑えるべき

Microsoft MVP・AIパートナー。LinkX Japan株式会社 代表取締役。東京工業大学大学院にて自然言語処理・金融工学を研究。NHK放送技術研究所でAI・ブロックチェーンの研究開発に従事し、国際学会・ジャーナルでの発表多数。経営情報学会 優秀賞受賞。シンガポールでWeb3企業を創業後、現在は企業向けAI導入・DX推進を支援。
「Azure VMを手動で構築しているが、環境の再現性がない」「Terraformを使いたいが、azurerm v4.xの書き方がわからない」——TerraformによるIaC化は、VM構築の再現性とスピードを確保する標準的な手法です。
2024年10月以降、AzureではMFA(多要素認証)が義務化され、セキュリティ要件も変化しています。
本記事では、Terraformのインストールからデプロイ実行まで全ステップを画像付きで解説し、VMサイズ別の料金比較やコスト最適化の方法も紹介します。
目次
Azure仮想マシンの構築方法とは
Azureの仮想マシン(VM)は、クラウド上に仮想的なコンピュータ環境を構築できるサービスです。物理サーバーを購入することなく、必要なスペックのマシンを数分で立ち上げられるため、開発環境の構築やWebアプリケーションのホスティングなど幅広い用途で活用されています。
Azure Virtual Machinesを構築する方法は大きく3つあります。Azure Portalを使ったGUI操作、Azure CLIやPowerShellによるコマンド実行、そしてTerraformやBicepといったIaC(Infrastructure as Code)ツールの活用です。
以下の表で、それぞれの構築方法の特徴を整理しました。
| 構築方法 | 特徴 | メリット | 適したケース |
|---|---|---|---|
| Azure Portal(GUI) | ブラウザ上で画面操作 | 直感的で初心者向き | 少数のVMを手動で構築する場合 |
| Azure CLI / PowerShell | コマンドラインで操作 | スクリプト化による自動化が可能 | 定型的な構築作業の効率化 |
| Terraform / Bicep(IaC) | コードでインフラを定義 | バージョン管理・再現性・チーム共有が容易 | 複数環境の一括管理や本番運用 |
ポータル操作は学習コストが低い一方、同じ構成を繰り返し作る場合は手作業が増えてしまいます。Terraformを使えば、インフラの構成をコードとして管理できるため、環境の再現性が高く、チームでの共有やCI/CDパイプラインとの連携も容易です。
本記事では、Terraformを使ってAzure上にLinux仮想マシンをデプロイする手順を、画像付きでステップごとに解説します。
構築に必要な前提条件
Azure仮想マシンをTerraformで構築するために、以下のツールとアカウントを事前に準備する必要があります。
以下の表に、必要なツールの一覧と用途をまとめました。
| ツール | 用途 | 入手先 |
|---|---|---|
| Terraform | インフラをコードで定義・デプロイ | HashiCorp公式サイト |
| Azure CLI | Azureへの認証・リソース操作 | Microsoft公式ドキュメント |
| SSHクライアント | 仮想マシンへの安全な接続 | OS標準搭載(Windows 10以降) |
| テキストエディタ | Terraformコードの編集 | VS Code等 |
これらのツールに加えて、Azureのアカウントとサブスクリプションが必要です。まだアカウントをお持ちでない方は、Azureの始め方ガイドを参考に無料アカウントを作成してください。Azureの無料アカウントでは、初回30日間で200ドル分のクレジットが付与されます。
MFA(多要素認証)義務化への対応
2024年10月以降、Microsoft Entra IDによる多要素認証(MFA)がAzure Portalへのサインインで義務化されています。さらに2025年10月からは、Azure CLIやPowerShellなどプログラム的なアクセスにもMFAが段階的に適用されています(Microsoft Learn — MFA必須化の詳細)。
Terraformからのデプロイにもaz loginによるAzure認証が必要なため、事前にMFAを設定しておきましょう。Microsoft Authenticatorアプリの登録がまだの方は、Azure Portalのセキュリティ設定から追加できます。
リソースグループの事前準備
本記事では、デプロイ先のリソースグループが既に作成済みであることを前提として進めます。まだリソースグループを用意していない方は、リソースグループの作成方法に関する記事をご覧になり、先に準備を済ませてください。
今回は、仮想マシンでStable Diffusionを立ち上げる目的で「Stable_diffusion」という名前のリソースグループを用意しています。
リソースグループの用意
Terraformのインストールと環境設定
Terraformのインストール
まずは、Terraformをインストールします。HashiCorp公式サイトのインストールページにアクセスしてください。
Terraformインストール画面その1
ご自身の環境(Windows / Mac / Linux)に合ったバイナリを選択してダウンロードします。筆者はWindows環境で以下を選択しました。
Terraformインストール画面その2
ダウンロードされたzipファイルを解凍し、任意のフォルダに保存します。今回はCドライブ内に「Terraform」というフォルダを作成し、解凍済みのファイルを配置しました。
解凍済みフォルダの確認
環境変数の設定
環境変数を設定することで、ターミナル上でterraformコマンドをどのディレクトリからでも実行できるようになります。Windowsの場合は、設定 > システム > バージョン情報 > システムの詳細設定 の順でクリックしてください。
PC設定画面
プロパティが表示されたら「環境変数」をクリックします。
システムの詳細設定
システム環境変数内の「Path」を選択して「編集」をクリックし、「新規」から先ほどTerraformを配置したフォルダのパスを追加してください。
動作確認
環境変数の設定が完了したら、ターミナルを開いて以下のコマンドでTerraformの動作を確認します。
terraform
以下のようにヘルプが表示されれば、正しくインストールされています。
terraformの動作確認
バージョンも確認しておきましょう。
terraform -v
terraformのバージョン確認
2026年3月時点ではTerraform 1.x系が主流です。バージョンが古い場合は公式サイトから最新版をダウンロードしてください。
プロジェクトファイルとSSHキーの作成
Terraformプロジェクトの作成
任意の場所に新しいディレクトリを作成し、Terraformの構成ファイルを保存します。今回は「Project_VM」というディレクトリを用意しました。
プロジェクトディレクトリの作成画面
以下のTerraformコードを「main.tf」という名前で保存します。本記事ではazurerm プロバイダー v4.x系に対応した最新のコードを使用しています(Microsoft Learn — Terraform Linux VM クイックスタートも参考にしています)。
# Azure プロバイダーの設定
terraform {
required_version = ">=1.0"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 4.0"
}
}
}
provider "azurerm" {
features {}
subscription_id = "ご自身のサブスクリプションIDを入力"
}
# 既存のリソースグループの名前を指定
variable "existing_resource_group_name" {
type = string
default = "Stable_diffusion" # ここに既存のリソースグループの名前を指定
}
variable "location" {
type = string
default = "Japan East" # 既存のリソースグループと同じリージョンを指定
}
# 仮想ネットワークの作成
resource "azurerm_virtual_network" "vnet" {
name = "stable-diffusion-vnet"
address_space = ["10.0.0.0/16"]
location = var.location
resource_group_name = var.existing_resource_group_name
}
# サブネットの作成
resource "azurerm_subnet" "subnet" {
name = "stable-diffusion-subnet"
resource_group_name = var.existing_resource_group_name
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefixes = ["10.0.1.0/24"]
}
# パブリックIPアドレスの作成
resource "azurerm_public_ip" "public_ip" {
name = "stable-diffusion-public-ip"
location = var.location
resource_group_name = var.existing_resource_group_name
allocation_method = "Static"
sku = "Standard"
}
# ネットワークセキュリティグループの作成
resource "azurerm_network_security_group" "nsg" {
name = "stable-diffusion-nsg"
location = var.location
resource_group_name = var.existing_resource_group_name
security_rule {
name = "SSH"
priority = 1001
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = "*"
destination_address_prefix = "*"
}
security_rule {
name = "HTTP"
priority = 1002
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "80"
source_address_prefix = "*"
destination_address_prefix = "*"
}
}
# ネットワークインターフェースの作成
resource "azurerm_network_interface" "nic" {
name = "stable-diffusion-nic"
location = var.location
resource_group_name = var.existing_resource_group_name
ip_configuration {
name = "internal"
subnet_id = azurerm_subnet.subnet.id
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.public_ip.id
}
}
# 仮想マシンの作成
resource "azurerm_linux_virtual_machine" "vm" {
name = "small-vm"
resource_group_name = var.existing_resource_group_name
location = var.location
size = "Standard_B1s"
admin_username = "azureuser"
network_interface_ids = [
azurerm_network_interface.nic.id,
]
admin_ssh_key {
username = "azureuser"
public_key = file("../.ssh/id_rsa.pub")
}
os_disk {
caching = "ReadWrite"
storage_account_type = "Standard_LRS"
}
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy"
sku = "22_04-lts-gen2"
version = "latest"
}
}
このコードでは、以下のリソースを作成しています。
-
仮想ネットワーク(VNet)
アドレス空間10.0.0.0/16のネットワークとサブネットを定義します
-
パブリックIPアドレス
外部からVMにアクセスするための固定IPを割り当てます。azurerm v4.xではStandard SKUがデフォルトのため、Static割り当てを使用しています
-
ネットワークセキュリティグループ(NSG)
SSH(ポート22)とHTTP(ポート80)の受信トラフィックを許可するルールを設定します
-
Linux仮想マシン
Standard_B1sサイズのUbuntu 22.04 LTS仮想マシンを作成します。Ubuntu 18.04はサポートが終了しているため、22.04 LTSを使用しています
以下の値はご自身の環境に合わせて変更してください。
- subscription_idには、Azure Portalで確認できるサブスクリプションIDを入力する
- リソースグループ名は、ご自身で用意したリソースグループ名に変更する
- 仮想マシンのサイズやOSイメージは、用途に合わせて選択する
SSHキーの準備
SSHキーは、仮想マシンへの安全なリモートアクセスに使用する暗号化された認証情報です。先ほど作成したTerraformフォルダ内に、「.ssh」というフォルダを作成してください。
SSHキー用フォルダの作成
次に、ターミナルで以下のコマンドを実行してSSHキーペアを生成します。
ssh-keygen
鍵の保存先を聞かれるので、先ほど作成した「.ssh」フォルダのパスに「\id_rsa」を付け加えて入力します。
SSHキーの作成
パスをコピーして貼り付ける際、両端にダブルクォーテーションが付く場合があります。その部分は削除してから実行してください。
パスフレーズの設定を求められますが、テスト環境であればEnterを押してスキップしても構いません。本番環境ではパスフレーズの設定を推奨します。
SSHキーの作成完了画面
秘密鍵と公開鍵の取り扱い
「.ssh」フォルダの中には、2つのファイルが生成されています。
キーの種類
-
秘密鍵(id_rsa)
このファイルは絶対に外部に公開してはいけません。GitHubなどのリポジトリにも含めないよう注意してください
-
公開鍵(id_rsa.pub)
Terraformのコード内で参照する鍵ファイルです。サーバーに登録することで、秘密鍵を持つユーザーだけがアクセスできる仕組みです
Azure認証とデプロイの実行
Azureへの認証
Azure CLIを使用してAzureに認証します。ターミナルで以下のコマンドを実行してください。
az login
ブラウザが起動し、Azureのログイン画面が表示されます。使用するアカウントを選択してサインインしてください。MFAが有効な場合は、認証アプリでの承認も必要です。
Azureログイン画面
Azure CLIの詳しいインストール方法や使い方については、Azure CLIの解説記事をご覧ください。
デプロイの実行
認証が完了したら、Terraformのコマンドを順番に実行してリソースをデプロイします。以下の表に、主要なTerraformコマンドの役割をまとめました。
| コマンド | 用途 | 実行タイミング |
|---|---|---|
| terraform init | プロバイダーのダウンロードと初期化 | プロジェクト作成時・プロバイダー変更時 |
| terraform plan | 変更内容のプレビュー | デプロイ前の確認 |
| terraform apply | リソースの作成・変更を実行 | plan確認後 |
| terraform destroy | リソースの一括削除 | 不要になった場合 |
| terraform validate | 構成ファイルの構文チェック | コード変更後 |
実際のワークフローは「init → plan → apply」の3ステップです。まず、ターミナルでプロジェクトディレクトリ(Project_VM)に移動し、初期化を実行します。
terraform init
以下のように初期化完了のメッセージが表示されます。
Terraform初期化完了
次に、以下のコマンドでデプロイ内容を事前に確認します。
terraform plan
planの実行時に注意すべき点は以下のとおりです。
- 改行コードがCRLF(Windows標準)の場合、エラーになることがあるためLFに変更する
- az loginでAzureに認証できていないと失敗する
- ログインしたアカウントに必要な権限がないとエラーが発生する
問題がなければ、以下のコマンドでリソースをデプロイします。
terraform apply
確認を求められた場合は「yes」と入力してEnterを押してください。
デプロイの確認とリソース管理
デプロイ結果の確認
Azure Portalでリソースグループを確認すると、Terraformで定義したリソースが作成されていることが分かります。
リソースの確認
「Stable_diffusion」リソースグループ内に「small-vm」という仮想マシンが作成されていれば、デプロイは成功です。
VMサイズと料金の目安
Azure仮想マシンの料金はVMサイズ(vCPU数・メモリ容量)とリージョンによって異なります。以下の表は、Japan Eastリージョンにおける代表的なVMサイズの料金目安です(2026年3月時点、Linux、従量課金制)。
| VMサイズ | vCPU | メモリ | 月額目安(従量課金) | 適した用途 |
|---|---|---|---|---|
| Standard_B1s | 1 | 1 GB | 約1,300円 | テスト・学習環境 |
| Standard_B2s | 2 | 4 GB | 約5,200円 | 小規模Webアプリ |
| Standard_D2s_v5 | 2 | 8 GB | 約10,500円 | 一般的なワークロード |
| Standard_D4s_v5 | 4 | 16 GB | 約21,000円 | 中規模アプリケーション |
本記事で使用したStandard_B1sは最もコストを抑えられるサイズです。学習目的であれば十分ですが、本番環境ではワークロードに応じたサイズを選択してください。Azure VMのコスト削減方法や料金体系の詳細も合わせて確認することをおすすめします。
リソースの停止と削除
不要なコストを避けるため、仮想マシンを使わない場合は停止または削除してください。Azure Portalの仮想マシン画面から「停止」または「削除」を選択できます。
仮想マシンの停止・削除
停止した場合、VMの割り当ては解除されますが、ディスクやIPアドレスなど一部のリソースには引き続き課金が発生します。完全にコストを削減したい場合は、Terraformからの一括削除も有効です。
terraform destroy
このコマンドを実行すると、Terraformで作成したすべてのリソースが削除されます。ディスクの管理については、Azure VMのディスク拡張方法の記事も参考にしてください。
Terraform運用のベストプラクティス
Azure仮想マシンをTerraformで運用する際は、セキュリティとコストの両面で適切な管理が欠かせません。リスク管理やセキュリティの設計なしに本番環境を運用すると、意図しないリソースの変更や課金、セキュリティインシデントにつながる可能性があります。
以下の表に、主要な注意点と対策をまとめました。
| 項目 | リスク | 対策 |
|---|---|---|
| MFA・認証管理 | 不正アクセスによるリソース操作 | MFAの設定、サービスプリンシパルの活用 |
| tfstateファイルの管理 | 機密情報の漏洩、状態の不整合 | Azure Blob Storageでリモートバックエンド化 |
| コスト管理 | 不要リソースの放置による課金 | 予算アラートの設定、定期的なリソース棚卸し |
| NSGルールの最適化 | SSH全開放による攻撃リスク | source_address_prefixを自社IPに限定 |
この表で特に重要なのは、NSGのSSHルールです。本記事のサンプルコードでは学習目的としてsource_address_prefixを全開放にしていますが、本番環境では必ず接続元のIPアドレスを限定してください。Azureのセキュリティ対策の記事で詳しく解説しています。
tfstateファイルのリモート管理
Terraformはデプロイ済みリソースの状態をtfstateファイルで管理しています。デフォルトではローカルに保存されますが、チーム開発ではAzure Blob Storageに保存するリモートバックエンドの利用が推奨されます。
リモートバックエンドを使うことで、以下のメリットが得られます。
-
チームメンバー間での状態の共有
複数のエンジニアが同じインフラを操作する場合、常に最新の状態を参照できます
-
tfstateファイルの暗号化と安全な保管
Azure Blob Storageの暗号化機能により、機密情報を含むstateファイルを安全に管理できます
-
状態のロック機能
同時に複数の変更が行われることを防ぎ、インフラの不整合を回避します
サービスプリンシパルによる自動化
CI/CDパイプラインなど自動化環境からTerraformを実行する場合は、az loginではなくサービスプリンシパルを使った認証が適しています。サービスプリンシパルには必要最小限の権限のみを付与し、定期的にクレデンシャルをローテーションすることがMicrosoft Entra IDのベストプラクティスです。
まずはテスト環境で十分に検証してから、本番環境に適用するようにしましょう。
VM構築力をAI業務自動化にも活かすなら
Azure上でのVM構築やTerraformによるインフラ自動化の経験は、AI業務自動化環境のインフラ構築にも直結します。AI業務自動化ガイドでは、IaCの知見を活かしたAI導入の進め方を220ページにわたって解説しています。
VM構築力をAI業務自動化にも
仮想マシンの構築力をAI環境に展開
Azure上でのVM構築やTerraformによるIaC管理の経験は、AI業務自動化環境のインフラ構築にも直結します。220ページの実践ガイドで、Microsoft環境でのAI導入を計画してみませんか。
まとめ
本記事では、Terraformを使ってAzure上にLinux仮想マシンを構築する手順を、画像付きで解説しました。Terraformのインストールから環境設定、プロジェクトファイルの作成、SSHキーの準備、Azure認証、デプロイの実行、コスト管理のベストプラクティスまで、一連の流れを網羅しています。
2026年現在、azurerm プロバイダーはv4.x系が主流となり、AzureのMFA義務化によりセキュリティ要件も変化しています。本記事ではこれらの最新の変更を反映したコードと手順を提供しました。
Azure仮想マシンの構築を始めるには、以下のステップから取り組んでみてください。
- まずAzureの無料アカウントを作成し、200ドル分のクレジットでVMを試す
- 本記事のTerraformコードをベースに、VMサイズやOSイメージをカスタマイズする
- 運用に慣れたらリモートバックエンドやCI/CDパイプラインとの連携に進む
Terraformによるインフラ管理は、一度習得すれば複数環境の構築や運用を大幅に効率化できます。ぜひ本記事を参考に、IaCの第一歩を踏み出してください。













