Suntory Azure マネージドサービス標準ドキュメント

Azure Virtual Machine
構築手順書
ドキュメントIDAZ-VM-BUILD-001
バージョン1.0
ステータスRELEASED
作成日2026年5月18日
改訂日2026年5月18日
CompanySuntory Holdings Limited
DivisionDigital & AI Global ITG
作成者Tomoki Koyama
対象手順① Azure Portal 手動構築 ② Terraform 構築

本書は Azure Virtual Machine の構築手順を定めたドキュメントです。
構築開始前に AZ-VM-PARAM-001(パラメータシート) への記入と承認者の承認を取得してください。
各パラメータの設計根拠は AZ-VM-DESIGN-001(設計書) を参照してください。

改訂履歴

Ver.改訂日 改訂者改訂内容承認者
1.02026-05-18Tomoki Koyama 初版作成(Portal 手動構築手順・Terraform 構築手順)
📋 関連ドキュメント
ドキュメントIDドキュメント名 種別備考
AZ-VM-OVERVIEW-001Azure Virtual Machine サービス概要サービス概要
AZ-VM-DESIGN-001Azure Virtual Machine 設計書設計書設計根拠・標準値の詳細
AZ-VM-PARAM-001Azure Virtual Machine パラメータシートパラメータシート構築前に記入・承認必須
AZ-VM-BUILD-001Azure Virtual Machine 構築手順書(本書)構築手順書

前提条件・事前準備

⚠️ パラメータシート(AZ-VM-PARAM-001)の記入と承認者の承認取得が完了していない場合は、構築を開始しないこと。

共通の前提条件

No. 確認事項 内容
1パラメータシート記入・承認完了AZ-VM-PARAM-001 のすべての項目が記入済みで承認者の承認を取得済みであること
2ホスト名の重複確認nslookup <hostname> および ServiceNow CMDB で重複がないことを確認
3対象 Subscription へのアクセス権限VM 作成に必要な Contributor 以上のロールが付与されていること
4既存 VNets / Subnet の確認接続先の VNets および Subnet が存在することを確認。Suntory VNets / Network Security Zones を参照
5Common NSG の確認割り当てる Common NSG(例:si2-securitygroup-shd-cs-tokyo-cmn-01)が存在することを確認
6Recovery Services Vault の確認バックアップ用 Vault が存在し、バックアップポリシーが設定されていることを確認
7一時パスワードの準備構築時のみ利用する一時パスワードを別経路(Teams DM 等)で受領済みであること。本書・メールには記載しない

Terraform 固有の前提条件

No.確認事項内容
1Terraform CLI のインストールバージョン 1.7.0 以上がインストールされていること(terraform version で確認)
2Azure CLI のインストール・ログインaz login で対象 Subscription にログイン済みであること(az account show で確認)
3Terraform State 用 Storage Accounttfstate 保存先の Storage Account・コンテナが作成済みであること
4admin_password の安全な渡し方パスワードは TF_VAR_admin_password 環境変数または Azure Key Vault Data Source で渡すこと。terraform.tfvars への直接記載は禁止

手順 1:Azure Portal 手動構築

Azure Portal(portal.azure.com)で「Virtual machines」→「+ Create」→「Azure virtual machine」を選択してください。

☐ 列はチェックボックスです。作業完了後に各行にチェックを入れながら進めてください。
1Basics タブ
No. パラメータ項目 Suntory 標準設定値 参照・備考
1Subscription パラメータシートに記載の Subscription を選択 Suntory Subscriptions mapping 参照
2Resource group 既存の RG を選択、または新規作成
rgp-<region>-<sub>-<env>-<app>-<seq>
設計書 No.2 参照
3Virtual machine name 命名規則に従ったホスト名を入力
例:JZJP1WAPSP001
nslookup / CMDB で重複確認済みであること
4Region Japan East(SJP の場合)
5Availability options 本番機:Availability zone → Self-selected zone
検証機:No infrastructure redundancy required
Zone番号(1 / 2 / 3)を記入。複数台は異なるゾーン
6Security type Trusted launch virtual machines 一般顧客情報を扱うサイトのみ Confidential
7Image(OS) システム要件のOSを選択(最新 SKU)
例 Win:Windows Server 2025 Datacenter Azure Edition
設計書 No.7 の Publisher/Offer/SKU 参照
8VM architecture x64
9Run with Azure Spot discount チェックなし(OFF) 強制停止リスクあり。原則 OFF
10VM Size(SKU) パラメータシートに記載の SKU を入力・選択
例:Standard_D2s_v5
設計書 No.10 のワークロード別推奨表参照
11Enable Hibernation チェックなし(OFF) Stateless 設計方針
12Authentication type Password
Username:AzureVmAdmin
Password:別経路で受領した一時パスワードを入力
CyberArk 登録後に変更。パスワードを本書に記載しない
13Public inbound ports None Public IP はLB 側で保持
14Licensing(Azure Hybrid Benefit) チェックなし(OFF)
2Disks タブ
No. パラメータ項目Suntory 標準設定値参照・備考
15VM disk encryption OFF(チェックなし) SSE はデフォルト有効
16OS disk size Image default(127 GiB) C ドライブ / root で 128 GiB 以上必要な場合は上位サイズを選択
17OS disk type Standard SSD(LRS) OS 領域は Standard SSD 一択
18Delete with VM(OSディスク) ON(チェックあり)
19Key management Platform-managed key
20Enable Ultra Disk compatibility OFF(Ultra Disk アタッチ予定がある場合のみ ON)
21〜26データディスク(必要時のみ) 「+ Create and attach a new disk」をクリック
Name:<hostname>_data01
Source type:None(empty disk)
Size:要件に合わせて指定
Storage type:Premium SSD(DB)/ Standard SSD(その他)
Key management:Platform-managed key
Shared disk:No
Delete with VM:ON
Windows は Dドライブ、1ドライブにつき1ディスク
3Networking タブ
No. パラメータ項目Suntory 標準設定値参照・備考
27Virtual network 既存の VNets を選択
例:vnt-jp1-sjp-bp-infra-01
Suntory VNets / Network Security Zones 参照
28Subnet 既存サブネットを選択
例(内部):snt-jp1-sjp-bn-infra-tst-01
DMZ か内部かを要件で判断
29Public IP None(プルダウンで None を選択) セキュリティ方針により VM に Public IP は付与しない
30NIC network security group Advanced を選択 →「Configure network security group」で既存の Common NSG を選択
例:si2-securitygroup-shd-cs-tokyo-cmn-01
新規 NSG 作成は不可
31Delete NIC when VM is deleted ON(チェックあり)
32Enable accelerated networking ON(チェックあり) SR-IOV による性能向上
33Load balancing None LB は別申請
4Management タブ
No. パラメータ項目Suntory 標準設定値参照・備考
34Microsoft Defender for Cloud "Foundational CSPM Free Plan" のメッセージを確認(自動有効化) 設定変更不要
35Metadata Security Protocol – IMDS ON(有効化する)
36Metadata Security Protocol – WireServer OFF(有効化しない) エージェント通信への影響回避
37System assigned managed identity OFF(チェックなし)
38Login with Microsoft Entra ID OFF(チェックなし) CyberArk PAM 管理のため
39Enable auto-shutdown OFF(チェックなし)
40Enable backup ON(チェックあり) Suntory バックアップポリシー準拠
41Recovery Services vault バックアップ運用担当と協議して確定した Vault を選択 未確定の場合は Default を選択し後で変更
42Backup policy subtype Enhanced(Trusted launch 選択時は強制)
43Enable Disaster Recovery OFF(チェックなし) DR は別途検討
44Enable periodic assessment ON(チェックあり) パッチ状況の定期チェック
45Enable hotpatch 検証機:ON 本番機:OFF
46Patch orchestration options Azure-orchestrated(No.45 ON 時のみ)
47Reboot setting Reboot if required(No.45 ON 時のみ)
5Monitoring タブ
No. パラメータ項目Suntory 標準設定値参照・備考
48Enable recommended alert rules ON(チェックあり) 詳細監視は NewRelic で別途検討
50Boot diagnostics Disable
51Enable OS guest diagnostics 本番機:ON 検証機:OFF 追加コスト発生
52Enable application health monitoring OFF
6Advanced タブ
No. パラメータ項目Suntory 標準設定値参照・備考
53〜55Extensions / VM applications / Custom dataすべて不要(設定しない)IaC で対応
56Performance(NVMe)Premium SSD / Ultra Disk 使用時のみ有効化
57〜59Host / Capacity reservations / Proximity placement groupすべて原則不要
7Tags タブ
タグキー・値は Suntory Azure Foundation Tag Standards.xlsx に完全に準拠すること。
No. タグキー(Tag name)設定値区分
60Subsidiary法人略称(例:SJP)必須
61BusinessUnit例:SPS(SJP は必須)任意(SJP 必須)
62ServiceName例:Beer Production Planning System(SJP は必須)必須
63SystemID例:aaa(SJP は必須)任意(SJP 必須)
64Environmentprod または nonprod必須
65BCPRank例:3必須
66Responsibility例:TransformationG(SJP は必須)任意(SJP 必須)
8Review + Create → 構築後作業
作業内容 確認内容・備考
「Review + create」タブで Validation passed を確認 エラーがある場合は該当タブに戻り修正する
「Create」ボタンをクリックしてデプロイ開始 デプロイ完了まで約 3〜10 分
デプロイ完了を確認 「Deployment complete」メッセージを確認。「Go to resource」で VM リソースを開く
VM のプライベート IP を確認・記録 VM 画面「Overview」→ Private IP address を記録
Defender for Cloud の有効化を確認 VM 画面 → Defender for Cloud で "Foundational CSPM Free Plan" を確認
タグの正確性を確認 VM 画面「Tags」で全タグが正しく設定されているか確認
CyberArk への登録 CyberArk に VM を登録し、管理者パスワード(AzureVmAdmin)を強制変更する
ServiceNow CMDB への登録 CMDB にホスト名・IP・構成情報を登録する

手順 2:Terraform 構築

📦 Terraform による構築の特徴

ディレクトリ構成

azure-vm/ ├── providers.tf # Azure プロバイダー・バックエンド設定 ├── variables.tf # 入力変数定義 ├── main.tf # メインリソース定義(NIC・VM・ディスク・バックアップ) ├── outputs.tf # 出力値定義 └── terraform.tfvars # 変数値(環境ごとに1ファイル)

providers.tf

📄 providers.tf Terraform
terraform { required_version = ">= 1.7.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 4.0" } } # Terraform State を Azure Blob Storage で管理 backend "azurerm" { resource_group_name = "rgp-jp1-shd-bn-tfstate-001" storage_account_name = "stsjptfstate001" container_name = "tfstate" key = "vm/<vm_name>.tfstate" # VM ごとにファイルを分ける } } provider "azurerm" { features { virtual_machine { # VM 削除時に OS ディスクを自動削除(設計書 No.18) delete_os_disk_on_deletion = true graceful_shutdown = false skip_shutdown_and_force_delete = false } } }

variables.tf

📄 variables.tf Terraform
# ─── Basics ──────────────────────────────────────────────────────────────── variable "resource_group_name" { description = "リソースグループ名(例:rgp-jp1-sjp-bn-aaa-001)" type = string } variable "location" { description = "Azure リージョン" type = string default = "japaneast" } variable "vm_name" { description = "VM 名(命名規則:<Co><Z><Region><OS><Role><Env><Seq> 例:JZJP1WAPSP001)" type = string } variable "vm_size" { description = "VM SKU(例:Standard_D2s_v5)" type = string default = "Standard_D2s_v5" } variable "os_type" { description = "OS 種別:windows または linux" type = string default = "windows" validation { condition = contains(["windows", "linux"], var.os_type) error_message = "os_type は 'windows' または 'linux' を指定してください。" } } variable "availability_zone" { description = "可用性ゾーン(1 / 2 / 3)" type = string default = "1" validation { condition = contains(["1", "2", "3"], var.availability_zone) error_message = "availability_zone は 1, 2, 3 のいずれかを指定してください。" } } variable "hotpatch_enabled" { description = "Hotpatch 有効化(検証機:true / 本番機:false)" type = bool default = false } # ─── Disks ───────────────────────────────────────────────────────────────── variable "os_disk_size_gb" { description = "OS ディスクサイズ(0 = Image default / 127 GiB)" type = number default = 0 } variable "data_disks" { description = "追加データディスクのリスト" type = list(object({ name = string # 例:JZJP1WAPSP001_data01 size_gb = number storage_type = string # StandardSSD_LRS / Premium_LRS / UltraSSD_LRS lun = number # 0, 1, 2, ...(一意の番号) })) default = [] } # ─── Networking ──────────────────────────────────────────────────────────── variable "subnet_id" { description = "既存サブネットのリソース ID" type = string } variable "nsg_id" { description = "Common NSG のリソース ID" type = string } # ─── Management ──────────────────────────────────────────────────────────── variable "recovery_vault_name" { description = "Recovery Services Vault 名" type = string } variable "backup_policy_id" { description = "バックアップポリシーのリソース ID" type = string } variable "admin_password" { description = "管理者パスワード(一時パスワード。CyberArk 登録後に変更)" type = string sensitive = true # ⚠️ terraform.tfvars への直接記載は禁止。 # 環境変数 TF_VAR_admin_password で渡すこと。 } # ─── Tags ────────────────────────────────────────────────────────────────── variable "tags" { description = "リソースタグ(Tag Standards 準拠)" type = map(string) default = {} }

main.tf

📄 main.tf Terraform
locals { admin_username = "AzureVmAdmin" # 設計書 No.12 - 固定値 is_windows = var.os_type == "windows" # VM リソース ID(Windows / Linux の三項演算) vm_id = local.is_windows ? azurerm_windows_virtual_machine.this[0].id : azurerm_linux_virtual_machine.this[0].id } # ─────────────────────────────────────────────────────────────── # NIC(設計書 No.31 Delete NIC with VM / No.32 Accelerated Networking) # ─────────────────────────────────────────────────────────────── resource "azurerm_network_interface" "this" { name = "${var.vm_name}-nic-01" location = var.location resource_group_name = var.resource_group_name accelerated_networking_enabled = true # No.32 原則 ON ip_configuration { name = "ipconfig1" subnet_id = var.subnet_id private_ip_address_allocation = "Dynamic" # public_ip_address_id は設定しない(No.29 原則 None) } tags = var.tags } # NIC に Common NSG を割り当て(設計書 No.30) resource "azurerm_network_interface_security_group_association" "this" { network_interface_id = azurerm_network_interface.this.id network_security_group_id = var.nsg_id } # ─────────────────────────────────────────────────────────────── # Windows VM # ─────────────────────────────────────────────────────────────── resource "azurerm_windows_virtual_machine" "this" { count = local.is_windows ? 1 : 0 name = var.vm_name resource_group_name = var.resource_group_name location = var.location size = var.vm_size zone = var.availability_zone # No.5 Availability zone admin_username = local.admin_username admin_password = var.admin_password network_interface_ids = [azurerm_network_interface.this.id] # OS ディスク(No.16〜19) os_disk { name = "${var.vm_name}-osdisk" caching = "ReadWrite" storage_account_type = "StandardSSD_LRS" # No.17 Standard SSD disk_size_gb = var.os_disk_size_gb == 0 ? null : var.os_disk_size_gb # OS ディスク削除は providers.tf の features.virtual_machine で制御 } # OS イメージ(No.7 - Windows Server 2025 最新) source_image_reference { publisher = "MicrosoftWindowsServer" offer = "WindowsServer" sku = "2025-datacenter-azure-edition" version = "latest" } # Trusted Launch(No.6 Security type = Trusted launch) vtpm_enabled = true secure_boot_enabled = true # ゲスト OS 更新設定(No.44〜47) patch_assessment_mode = "AutomaticByPlatform" # No.44 periodic assessment ON patch_mode = "AutomaticByPlatform" # No.46 Azure-orchestrated hotpatching_enabled = var.hotpatch_enabled # No.45 検証機 true / 本番機 false # Azure Hybrid Benefit 無効(No.14) license_type = "None" # Managed Identity 無効(No.37) # identity ブロックを記述しないことで無効化 tags = var.tags } # ─────────────────────────────────────────────────────────────── # Linux VM(os_type = "linux" の場合) # ─────────────────────────────────────────────────────────────── resource "azurerm_linux_virtual_machine" "this" { count = local.is_windows ? 0 : 1 name = var.vm_name resource_group_name = var.resource_group_name location = var.location size = var.vm_size zone = var.availability_zone admin_username = local.admin_username admin_password = var.admin_password disable_password_authentication = false network_interface_ids = [azurerm_network_interface.this.id] os_disk { name = "${var.vm_name}-osdisk" caching = "ReadWrite" storage_account_type = "StandardSSD_LRS" disk_size_gb = var.os_disk_size_gb == 0 ? null : var.os_disk_size_gb } # OS イメージ(RHEL 9 最新 - 変更する場合は variables.tf に image 変数を追加) source_image_reference { publisher = "RedHat" offer = "RHEL" sku = "9-lvm-gen2" version = "latest" } vtpm_enabled = true secure_boot_enabled = true patch_assessment_mode = "AutomaticByPlatform" patch_mode = "AutomaticByPlatform" tags = var.tags } # ─────────────────────────────────────────────────────────────── # データディスク(No.21〜26) # ─────────────────────────────────────────────────────────────── resource "azurerm_managed_disk" "data" { for_each = { for d in var.data_disks : d.name => d } name = each.value.name resource_group_name = var.resource_group_name location = var.location zone = var.availability_zone storage_account_type = each.value.storage_type create_option = "Empty" # No.22 Source type = None (empty disk) disk_size_gb = each.value.size_gb tags = var.tags } resource "azurerm_virtual_machine_data_disk_attachment" "data" { for_each = { for d in var.data_disks : d.name => d } managed_disk_id = azurerm_managed_disk.data[each.key].id virtual_machine_id = local.vm_id lun = each.value.lun caching = "ReadWrite" } # ─────────────────────────────────────────────────────────────── # Azure Backup(設計書 No.40〜42) # ─────────────────────────────────────────────────────────────── resource "azurerm_backup_protected_vm" "this" { resource_group_name = var.resource_group_name recovery_vault_name = var.recovery_vault_name source_vm_id = local.vm_id backup_policy_id = var.backup_policy_id }

outputs.tf

📄 outputs.tf Terraform
output "vm_id" { description = "Virtual Machine リソース ID" value = local.vm_id } output "vm_private_ip" { description = "VM のプライベート IP アドレス" value = azurerm_network_interface.this.private_ip_address } output "nic_id" { description = "NIC リソース ID" value = azurerm_network_interface.this.id } output "os_disk_id" { description = "OS ディスク リソース ID" value = local.is_windows ? azurerm_windows_virtual_machine.this[0].os_disk[0].name : azurerm_linux_virtual_machine.this[0].os_disk[0].name }

terraform.tfvars(記入例)

⚠️ admin_password はこのファイルに記載しないこと。環境変数 TF_VAR_admin_password で渡すか、Azure Key Vault から取得すること。
📄 terraform.tfvars(例) Terraform
# ─── Basics ─────────────────────────────────────────────────── resource_group_name = "rgp-jp1-sjp-bn-aaa-001" location = "japaneast" vm_name = "JZJP1WAPSP001" vm_size = "Standard_D2s_v5" os_type = "windows" availability_zone = "1" hotpatch_enabled = false # 本番機は false / 検証機は true # ─── Disks ──────────────────────────────────────────────────── os_disk_size_gb = 0 # 0 = Image default (127 GiB) data_disks = [ { name = "JZJP1WAPSP001_data01" size_gb = 100 storage_type = "StandardSSD_LRS" lun = 0 } ] # ─── Networking ─────────────────────────────────────────────── subnet_id = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rgp-jp1-sjp-bn-infra-001/providers/Microsoft.Network/virtualNetworks/vnt-jp1-sjp-bp-infra-01/subnets/snt-jp1-sjp-bn-infra-tst-01" nsg_id = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rgp-jp1-shd-cs-nsg-001/providers/Microsoft.Network/networkSecurityGroups/si2-securitygroup-shd-cs-tokyo-cmn-01" # ─── Management ─────────────────────────────────────────────── recovery_vault_name = "rsv-jp1-sjp-bn-001" backup_policy_id = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rgp-jp1-sjp-bn-backup-001/providers/Microsoft.RecoveryServices/vaults/rsv-jp1-sjp-bn-001/backupPolicies/EnhancedPolicy" # ─── Tags(Tag Standards 準拠)──────────────────────────────── tags = { Subsidiary = "SJP" ServiceName = "Beer Production Planning System" Environment = "nonprod" BCPRank = "3" BusinessUnit = "SPS" SystemID = "aaa" Responsibility = "TransformationG" }

Terraform 実行手順

1認証・初期化
Terminal
# Azure にログイン(対象 Subscription を確認) az login az account show # 対象 Subscription に切り替え az account set --subscription "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # Terraform 初期化(バックエンド設定を読み込み) terraform init
2パスワードの設定(環境変数)
⚠️ パスワードは tfvars に記載せず、必ず環境変数で渡すこと。
Terminal(Windows PowerShell)
# PowerShell での環境変数設定(セッション限定) $env:TF_VAR_admin_password = "<一時パスワード>"
Terminal(bash / macOS / Linux)
# bash での環境変数設定 export TF_VAR_admin_password="<一時パスワード>"
3プランの確認
Terminal
# 変更内容をプレビュー(実際には何も作成しない) terraform plan -var-file="terraform.tfvars" # 出力例(追加されるリソースを確認) # Plan: 6 to add, 0 to change, 0 to destroy. # + azurerm_network_interface.this # + azurerm_network_interface_security_group_association.this # + azurerm_windows_virtual_machine.this[0] # + azurerm_managed_disk.data["JZJP1WAPSP001_data01"] # + azurerm_virtual_machine_data_disk_attachment.data["JZJP1WAPSP001_data01"] # + azurerm_backup_protected_vm.this
4適用(デプロイ)
Terminal
# リソースを作成(-auto-approve は確認なしで適用。初回は省略推奨) terraform apply -var-file="terraform.tfvars" # 確認プロンプトに "yes" と入力してデプロイ開始 # 完了後に出力値(outputs)が表示される # 出力例 # Apply complete! Resources: 6 added, 0 changed, 0 destroyed. # Outputs: # vm_id = "/subscriptions/.../virtualMachines/JZJP1WAPSP001" # vm_private_ip = "10.0.1.10" # nic_id = "/subscriptions/.../networkInterfaces/JZJP1WAPSP001-nic-01"
5Terraform 構築後作業
作業内容 確認内容
プライベート IP の確認・記録 terraform output vm_private_ip で取得した IP を記録する
Azure Portal でデプロイ内容を確認 VM・NIC・ディスク・NSG 割り当て・バックアップが正しく設定されているか確認
Defender for Cloud の有効化確認 Portal の VM 画面で "Foundational CSPM Free Plan" を確認
タグの正確性確認 Portal の VM 「Tags」タブで全タグを確認
CyberArk への登録 CyberArk に VM を登録し、管理者パスワードを強制変更する
ServiceNow CMDB への登録 CMDB にホスト名・IP・構成情報を登録する
State ファイルのバックアップ確認 Azure Blob Storage 上の tfstate ファイルが更新されていることを確認

参考:リソース削除手順

⚠️ 削除は不可逆的な操作です。承認者の許可を得てから実施すること。

Azure Portal での削除

  1. 「Virtual machines」で対象 VM を開く
  2. 「Delete」をクリック
  3. 「Apply force delete」のチェックボックスを確認
  4. 削除対象のリソース(VM・NIC・OS ディスク)にチェックが入っていることを確認
  5. VM 名を入力して「Delete」を実行
  6. CyberArk から該当 VM を削除する
  7. ServiceNow CMDB から該当レコードを削除・更新する

Terraform での削除

Terminal
# デプロイ済みのすべてのリソースを削除(State に記録されたリソースが対象) terraform destroy -var-file="terraform.tfvars" # 確認プロンプトに "yes" と入力 # VM・NIC・ディスク・バックアップ保護・NSG 割り当てが削除される