Contents
- 1 1. はじめに – コスト最適化の全体像
- 2 2. Azure Advisor で「すぐできる」削減策を実装する
- 3 3. Well‑Architected Review による長期的な最適化戦略
- 4 4. 予約インスタンスと Savings Plans の正しい選び方
- 5 5. Spot VM と自動入れ替えでオンデマンド削減を実現
- 6 6. ライセンス活用 – Azure Hybrid Benefit & Dev/Test サブスクリプション
- 7 7. Cost Management ダッシュボードと予測・アラート設定
- 8 8. AI ワークロードのトークン削減&リージョン最適化
- 9 9. SRE 観点での自動化・IaC による継続的コスト最適化
- 10 10. まとめと次のアクション
1. はじめに – コスト最適化の全体像
| フェーズ | 目的 | 主なツール |
|---|---|---|
| 可視化 | 現在の支出構造とリソース使用率を把握 | Azure Cost Management、Azure Advisor |
| 短期改善 | 無駄リソースの即時削減 | Advisor 推奨・自動スケジューリング |
| 長期戦略 | 予測可能な費用構造へ移行 | Well‑Architected Review、予約インスタンス/Savings Plans |
| 運用最適化 | 継続的にコストとパフォーマンスをバランス | Spot VM、Hybrid Benefit、IaC・Automation |
ポイント
コスト削減は「1 回限りの作業」ではなく、「可視化 → 短期改善 → 長期戦略 → 運用最適化」のサイクルで継続的に行うことが成功の鍵です。
2. Azure Advisor で「すぐできる」削減策を実装する
2‑1. Advisor の提案タイプと対象シナリオ
| カテゴリ | 主な検出項目 | 削減効果の例 |
|---|---|---|
| 未使用/低利用 VM | CPU 使用率 < 5 %(連続 7 日) | 停止スケジュールで月額 20‑30 % 削減 |
| 過剰プロビジョニング | サイズが推奨サイズより大きい | サイズダウングレードで最大 40 % 削減 |
| 非推奨 SKU | 古い世代の VM 系列 | 最新世代へ置換でコストと性能同時に改善 |
2‑2. 実装手順(CLI / PowerShell)
※ Azure Portal の UI 操作だけでも実装可能ですが、スクリプト化して自動化すると管理負荷が大幅に低減します。
(1) 未使用 VM を検出し停止スケジュールを設定する例(Azure CLI)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# ① Azure Advisor の推奨取得(JSON 出力) az advisor recommendation list \ --category Cost \ --query "[?contains(shortName, 'LowCPU')].{id:id,resourceId:resourceMetadata.resourceId}" \ -o json > lowcpu.json # ② 推奨対象 VM に対してデアロケート(停止)スケジュールを作成 cat lowcpu.json | jq -r '.[] .resourceId' | while read vm_id; do rg=$(az resource show --ids $vm_id --query resourceGroup -o tsv) name=$(az resource show --ids $vm_id --query name -o tsv) # Azure Automation のスケジュールを作成(例:毎日 22:00 にデアロケート) az automation schedule create \ --resource-group $rg \ --automation-account MyAutomationAcct \ --name "deallocate-$name-$(date +%s)" \ --frequency Daily \ --start-time "$(date -u +"%Y-%m-%dT22:00:00Z")" # Runbook(PowerShell)呼び出し例 az automation runbook start \ --resource-group $rg \ --automation-account-name MyAutomationAcct \ --name DeallocateVMRunbook \ --parameters "vmName=$name resourceGroupName=$rg" done |
(2) PowerShell でサイズダウングレードを自動化
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Import-Module Az.Compute # 推奨サイズが取得できる API は現時点でプレビュー版です。ここでは例として手動指定。 $targetSize = "Standard_D2s_v3" Get-AzVM -ResourceGroupName "RG1" | ForEach-Object { $vm = $_ if ($vm.HardwareProfile.VmSize -ne $targetSize) { Write-Host "Updating $($vm.Name) from $($vm.HardwareProfile.VmSize) to $targetSize" Update-AzVM ` -ResourceGroupName $vm.ResourceGroupName ` -Name $vm.Name ` -VmSize $targetSize } } |
ベストプラクティス
Advisor の推奨は 7 日以上の継続的データに基づくため、変更前に必ずテスト環境で検証してください。
スケジュールや Runbook は最小権限(Contributor+Automation Operator)のサービスプリンシパルで実行し、RBAC を徹底します。
3. Well‑Architected Review による長期的な最適化戦略
3‑1. コスト最適化柱の構成要素(Microsoft Learn)
| Pillar | 主な評価項目 | 推奨アクション |
|---|---|---|
| コスト | 予測可能性、リザーブド容量活用率、無駄リソース検出 | Advisor と Cost Management の統合レポート作成 |
| パフォーマンス | スループット・レイテンシー | Autoscale 設定と Azure Front Door の最適化 |
| 信頼性 | SLA 達成率、障害復旧手順 | 可用性セット/ゾーン冗長構成の評価 |
| セキュリティ | Defender for Cloud スコア、ポリシー遵守率 | Azure Policy の自動適用 |
| 運用性 | デプロイ頻度、失敗率 | IaC(Terraform/ARM)+ CI/CD パイプラインの導入 |
3‑2. Review 実施フロー
- 事前準備
- Azure Policy による必須タグ付与(
Env,Owner)を有効化。 -
Cost Management の「予測」機能をオンにし、過去 12 ヶ月の実績データを取得。
-
レビュー実施
- Azure Portal → 「Well‑Architected Review」から対象サブスクリプションを選択。
-
各 Pillar ごとに自動評価結果と手動チェックリスト(Excel テンプレート)でギャップを記録。
-
改善計画策定
- ギャップ点を「短期」「中長期」に分類し、担当者・期限を設定。
-
例: 「未使用 VM の自動停止」→ 短期(1 か月以内)、「予約インスタンス導入計画」→ 中長期(3‑6 か月)。
-
継続的モニタリング
- Azure Monitor のカスタムダッシュボードで「コスト最適化 KPI」(例:RI 利用率、Savings Plan カバレッジ)を可視化。
4. 予約インスタンスと Savings Plans の正しい選び方
4‑1. 現行(2024 年)料金モデルの概要
| プラン | 割引方式 | 主な特徴 |
|---|---|---|
| Reserved Instance (RI) | 前払いまたは分割払いで 最大 72 % の固定割引。対象は VM サイズ・リージョンが決定的に固定。 | 長期稼働ワークロード(本番 DB、Web フロント)に最適。 |
| Savings Plans for Compute | 使用量ベースのディスカウント。ファミリ単位で柔軟に適用でき、最大 66 % の割引が得られる。 | 複数サイズ・リージョンを横断するワークロード(開発/テスト、バッチ)に向く。 |
公式情報: Azure Reserved VM Instances – Microsoft Docs
公式情報: Savings Plans for Compute – Microsoft Docs
4‑2. 利用率に基づく選定ガイドライン
| 想定利用率 | 推奨プラン | 理由 |
|---|---|---|
| 70 % 以上(本番系、24/7) | RI (1 年または 3 年) | 高い稼働率で固定割引が最大化される。 |
| 30‑70 %(バッチ・スケジュール実行) | Savings Plans | ファミリ単位の柔軟性と、利用率変動に対応できる点がメリット。 |
| 30 % 未満(スポット併用や断続的テスト) | Spot + Savings Plans のハイブリッド | Spot で最大 90 % 割引を活かしつつ、残りの稼働は Savings Plan でカバー。 |
4‑3. プラン導入手順(CLI)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 1️⃣ RI の購入例(1 年、前払い) az reservation order purchase \ --reserved-resource-type "VirtualMachines" \ --sku "standard_D2s_v3" \ --billing-scope "/subscriptions/<sub-id>" \ --quantity 5 \ --term "P1Y" \ --applied-scope-type "Shared" # 2️⃣ Savings Plan の作成例(Compute ファミリ Dv3 系列、年間割引) az savings-plan order create \ --plan-name "MySavingsPlan" \ --billing-scope "/subscriptions/<sub-id>" \ --sku "Standard_Dv3_Family" \ --term "P1Y" \ --commitment-amount 1200 |
ポイント
az reservation系コマンドはプレビュー版が多いため、実行前にaz extension add -n reservationで拡張機能をインストールしてください。
購入後は Cost Management → Reserved Instances で適用率(Utilization)を毎月確認し、未使用分は次年度へロールオーバーできるか検討します。
5. Spot VM と自動入れ替えでオンデマンド削減を実現
5‑1. Spot VM の特徴と利用シナリオ
| 特徴 | 説明 |
|---|---|
| 価格変動 | 市場の余剰キャパシティに応じて秒単位で課金。割引率は 70‑90 % が一般的。 |
| 中断(Preempt)リスク | Azure が容量回復時に最大 30 秒前に通知し、VM は自動的に停止または削除される。 |
| 適用対象 | バッチ処理、CI/CD ビルドエージェント、データ変換ジョブ、Dev/Test の非ミッションクリティカル環境。 |
5‑2. 中断ハンドリングの実装例(Azure Event Grid + Azure Functions)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# function_app/__init__.py import logging, json, os import azure.functions as func from azure.identity import DefaultAzureCredential from azure.mgmt.compute import ComputeManagementClient credential = DefaultAzureCredential() compute_client = ComputeManagementClient(credential, os.getenv('AZURE_SUBSCRIPTION_ID')) def main(event: func.EventGridEvent): data = event.get_json() vm_id = data["resourceId"] event_type = event["eventType"] if event_type == "Microsoft.Compute/virtualMachines/preempted": logging.info(f"Spot VM preempted: {vm_id}") # 例: Azure Storage にチェックポイントを書き込む # (実際の処理はジョブに合わせて実装) |
Event Grid のサブスクリプションを作成し、Microsoft.Compute/virtualMachines/preempted イベントを上記 Function に送信します。
5‑3. スケジュールベースで Spot ↔ 標準 VM を自動切り替えるフロー
- Azure Automation アカウント作成(最小権限の Run As アカウント)。
- Runbook (PowerShell) – 時間帯に応じて Azure CLI/PowerShell で VM をデプロイ/削除。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
param( [Parameter(Mandatory=$true)][string]$Action # "StartSpot" / "StopSpot" ) $rg = "RG-Compute" $spotName = "batch-spot-01" if ($Action -eq "StartSpot") { Write-Output "Creating Spot VM..." New-AzVm ` -ResourceGroupName $rg ` -Name $spotName ` -Location japaneast ` -VirtualMachineSize "Standard_D2s_v3" ` -Priority Spot ` -MaxPrice -1 # 市場価格上限なし } elseif ($Action -eq "StopSpot") { Write-Output "Deleting Spot VM..." Remove-AzVm -ResourceGroupName $rg -Name $spotName -Force } |
- スケジュール設定(Automation → Schedules)
- 22:00 に
StartSpot、06:00 にStopSpotを実行。
ベストプラクティス
Spot VM の起動は 容量が確保できるか確認 した上で行う(az vm list-skus --zone)。
中断時にジョブを安全に再開できるよう、ステートレス設計または チェックポイント保存先 (Azure Blob, Azure Files) を必ず用意します。
6. ライセンス活用 – Azure Hybrid Benefit & Dev/Test サブスクリプション
6‑1. Azure Hybrid Benefit(AHB)
| 対象 | 割引率 (2024 年) |
|---|---|
| Windows Server VM | 最大 40 % 削減 |
| SQL Server on Azure VM | 最大 55 % 削減 |
適用手順(Portal & PowerShell)
- Portal
-
VM の「設定」→「ライセンス」タブ → 「Azure Hybrid Benefit を使用する」にチェック。
-
PowerShell
|
1 2 3 4 |
$vm = Get-AzVM -ResourceGroupName "RG-Prod" -Name "Web01" $vm.LicenseType = "Windows_Server" Update-AzVM -ResourceGroupName $vm.ResourceGroupName -VM $vm |
注意点
* AHB は「既存ライセンスが有効であること」が前提です。監査に備えて、オンプレミスの Software Assurance(SA)またはサブスクリプション証明書を保管してください。
6‑2. Dev/Test サブスクリプション
| 機能 | 割引率 |
|---|---|
| Windows Server VM (Dev/Test) | 最大 55 % |
| SQL Database (Dev/Test) | 最大 55 % |
自動クリーンアップ例(Automation Runbook)
|
1 2 3 4 5 6 7 8 9 10 |
# 停止対象は「Env」タグが "DevTest" かつ最終使用日が30日以上前のVM $threshold = (Get-Date).AddDays(-30) $vms = Get-AzResource -Tag @{ Env="DevTest" } | Where-Object { $_.Kind -eq 'virtualmachine' -and ($_ | Get-AzMetric -MetricName "Percentage CPU").TimeStamp[-1] -lt $threshold } foreach ($vm in $vms) { Stop-AzVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name -Force } |
ポイント
タグポリシーでEnv=DevTestを必須化し、未使用リソースの自動検出を容易にします。
実稼働前に「停止」だけでなく、「削除」も選択できるよう、承認フロー(Azure Logic Apps)と連携すると安全です。
7. Cost Management ダッシュボードと予測・アラート設定
7‑1. 標準ダッシュボードの構成要素
| タブ | 主な表示内容 |
|---|---|
| 概要 | 総支出、月次推移、コストセンター別内訳 |
| 予測 | AI ベースの次月・次四半期予測(過去 12 ヶ月データ) |
| 予約最適化 | RI / Savings Plans の利用率と未使用分のレポート |
| アラート | コスト上限超過時に Teams/メールで通知 |
7‑2. アラート作成例(CLI)
|
1 2 3 4 5 6 7 8 9 |
az consumption budget create \ --resource-group "RG-Finance" \ --budget-name "MonthlyCap80Pct" \ --amount 50000 \ --time-grain Monthly \ --start-date "$(date +%Y-%m-01)" \ --end-date "2025-12-31" \ --notifications operator=GreaterThanOrEqualTo;threshold=80;contactEmails=user@example.com |
7‑3. 月次レビューの実践フロー
- データ抽出:Cost Management → 「エクスポート」→ CSV → Azure Data Lake Storage Gen2 に保存。
- BI 可視化:Power BI のテンプレートレポート(Microsoft が提供)をインポートし、
実績 vs 予測グラフを作成。 - KPI 評価:
RI 利用率 ≥ 85 %Savings Plan カバレッジ ≥ 70 %予算超過回数 ≤ 1 回/四半期- アクションプラン:超過が検出された場合は、次回の RI 見直しや Spot VM の導入を議題に上げる。
8. AI ワークロードのトークン削減&リージョン最適化
8‑1. トークン削減テクニック(OpenAI Service)
| 手法 | 削減効果 (目安) |
|---|---|
| システムプロンプトでコンテキスト固定 | 10‑20 % |
| テンプレート化 + パラメータ埋め込み | 15‑30 % |
出力文字数制限 (max_tokens) の設定 |
5‑15 % |
実装例(Python SDK)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import openai def chat(user_msg): response = openai.ChatCompletion.create( model="gpt-4o-mini", messages=[ {"role":"system","content":"You are a concise assistant. Use at most 2 sentences."}, {"role":"user","content":user_msg} ], max_tokens=150, # 必要最低限に抑える temperature=0.3 ) return response.choices[0].message.content.strip() print(chat("Azure Cost Management の月次レポート作成手順を 2 行で教えて")) |
ポイント
max_tokensは必ず設定し、予測コスト上限 を明示的に制御します。
同一質問が頻繁に来る場合は キャッシュ(Redis) に結果を保存して再利用するとトークン消費自体も削減できます。
8‑2. リージョン別コスト比較と移行戦略
| リージョン (日本) | D4s_v3 月額 (約) |
|---|---|
| Japan East | ¥22,000 |
| Japan West | ¥19,300 |
料金は 2024 年 2 月時点の公表価格です。最新情報は Azure 料金ページ を参照してください。
移行手順(Azure Migrate + PowerShell)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 1. Azure Migrate のプロジェクト作成と評価実行(GUI 推奨) # 2. 評価結果から対象 VM のリストを取得 $vmList = Get-Content ".\east-vms.txt" foreach ($vmId in $vmList) { $vm = Get-AzVM -ResourceGroupName "RG-East" -Name $vmId # West リージョンへ移行(同一サブスクリプション内) Move-AzResource ` -DestinationResourceGroupName "RG-West" ` -DestinationSubscriptionId (Get-AzContext).Subscription.Id ` -ResourceId $vm.Id ` -Force } |
注意点
移行前に ネットワーク帯域・レイテンシ要件 を検証し、必要なら ExpressRoute も併用してください。
移行後は Cost Management の「リージョン比較」ビューで実績をモニタリングし、期待通りの削減が得られたか確認します。
9. SRE 観点での自動化・IaC による継続的コスト最適化
9‑1. 基本方針(Google SRE の「Reduce Waste」原則)
| 原則 | 実装例 |
|---|---|
| 可観測性 | Azure Monitor + Log Analytics に全リソースの利用率メトリクスを集約。 |
| 自動化 | Azure Automation Runbooks と GitOps(Flux)で Autoscale 設定をコード管理。 |
| 安全な失敗 | Spot VM の中断は Graceful Shutdown スクリプトでハンドリングし、データロス防止。 |
| 容量計画 | Cost Management の「予約最適化」レポートを毎月 CI パイプラインで取得し、必要な RI を自動提案。 |
9‑2. IaC で Autoscale 設定管理(Flux + Azure Resource Manager)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# infrastructure/autoscale.yaml apiVersion: "2021-04-01" type: Microsoft.Insights/autoscalesettings location: japaneast name: vmss-autoscale properties: targetResourceUri: /subscriptions/<sub-id>/resourceGroups/RG-App/providers/Microsoft.Compute/virtualMachineScaleSets/vmss-prod enabled: true profiles: - name: "WorkHours" capacity: minimum: "2" maximum: "10" default: "4" rules: - metricTrigger: metricName: "Percentage CPU" metricNamespace: "Microsoft.Compute/virtualMachineScaleSets" timeGrain: "PT1M" statistic: "Average" timeWindow: "PT5M" timeAggregation: "Average" operator: "GreaterThan" threshold: 70 scaleAction: direction: "Increase" type: "ChangeCount" value: "2" cooldown: "PT5M" - name: "OffHours" capacity: minimum: "0" maximum: "4" default: "1" rules: - metricTrigger: metricName: "Percentage CPU" operator: "LessThan" threshold: 30 scaleAction: direction: "Decrease" type: "ChangeCount" value: "1" cooldown: "PT10M" |
Flux がリポジトリの変更を検知すると、上記 ARM テンプレートが Azure に自動適用されます。
9‑3. コスト最適化 CI パイプライン(GitHub Actions の例)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
name: Cost Optimization Review on: schedule: - cron: '0 2 * * MON' # 毎週月曜 02:00 UTC jobs: generate-report: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Azure Login uses: azure/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: Export Reservation Utilization run: | az consumption reservation summary list \ --subscription ${{ secrets.AZURE_SUB_ID }} \ --output json > reservation.json - name: Analyze & Comment PR uses: peter-evans/create-pull-request@v5 with: title: "Reservation Utilization Report" body: | ## 予約インスタンス利用率(最新週) ```json $(cat reservation.json | jq '.[] | {name, utilization}') ``` |
効果
* 毎週自動で RI の利用率を取得し、閾値未満(例: 80 %)のリソースがあれば PR が作成され、チームが即座に対策を検討できるようになります。
10. まとめと次のアクション
- 可視化 → Azure Advisor と Cost Management のダッシュボードで現状把握。
- 短期改善 → 未使用 VM 停止、サイズダウングレードを自動化。
- 長期戦略 → Well‑Architected Review で全 Pillar を評価し、RI/Savings Plans の最適組み合わせを決定。
- 運用自動化 → Spot VM と Autoscale 設定を IaC・Runbooks で管理し、SRE の「Reduce Waste」原則に沿った継続的削減サイクルを構築。
- レビュー体制 → 月次 Cost Management レポートと Power BI ダッシュボードで KPI をモニタリングし、予算超過時は自動アラートで即応。
今すぐ実行できる 3 つのタスク
1. Azure Advisor の「低 CPU」推奨を取得し、PowerShell スクリプトで停止スケジュールを作成。
2. 本番環境の VM に対して Azure Hybrid Benefit を有効化(PowerShell 一括適用)。
3. GitHub Actions と Azure Automation を連携させ、RI 利用率レポートを毎週自動生成する CI パイプラインを導入。
これらを順次実装すれば、6 ヶ月以内に総コストの 15‑25 % 削減 が期待できます。継続的なモニタリングと自動化が最も重要な成功要因ですので、ぜひ組織全体で取り組んでください。
本ガイドは 2024 年 2 月時点の公式情報に基づき執筆しています。料金や機能は予告なく変更される可能性がありますので、最新ドキュメントを必ずご確認ください。