4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【生成AI活用】Visual Studio Subscription の $50 Azure クレジットで Windows Server + SQL Server 環境を構築する

4
Posted at

【生成AI活用】Visual Studio Subscription の $50 Azure クレジットで Windows Server + SQL Server 環境を構築する

はじめに

Visual Studio Subscription(Professional以上)には 毎月 $50 の Azure クレジットが付いてくる。
このクレジットを活用して、Windows Server 2022 + SQL Server 2022 環境をクラウド上に構築した。

オンプレでサーバーを調達・セットアップするのに比べて、30分〜1時間で同等の環境が手に入る。
しかもコストは平日 9:00-18:00 だけ動かせば $45/月 以内に収まり、$50 クレジットの範囲内で運用できる。

ローカルPCの SSMS から Azure VM 上の SQL Server に接続するところまで確認済み。

$50 クレジットの活用ポイント

  • 経費精算が不要:クレジット内で完結するので会社への申請・承認が一切いらない
  • サーバー調達コストゼロ:クレジットの範囲内なので実質無料
  • 使った分だけ課金:VMを停止すればディスク代のみ、削除すればゼロ
  • 平日 9:00-18:00 のみ動作:自動シャットダウンで月 $45 以内に抑える
  • 検証・学習用途に最適:Developer ライセンスで SQL Server も無料で使える

個人で動かせる範囲なので、上司への稟議・経費申請・支払い処理など一切不要。
思い立ったその日に環境が手に入る。

この記事の使い方:AIに渡せばそのまま構築できる

この記事をそのまま Claude などの AI にコピペして渡すと、AI がコマンドを順番に実行して環境構築を完了させてくれる。

実際、この環境構築は Claude に手順書を渡して実行させた。エラーが出ても Claude が原因を分析して別のアプローチを試すため、人間はほぼ何もしなくていい。「詰まったポイント」として記載している6つのエラーも、すべて Claude が自力で突破している。

「この手順書通りに Azure 環境を構築してください」
+ この記事の内容を貼り付け

az CLI・Ansible・PowerShell コマンドがすべてコード付きで記載されているため、
AI が手順を読み取り、コマンドを実行・確認・エラー対応まで自律的にこなせる。

人間が行う操作は以下の2つだけ:

  1. az login(初回認証のみ)
  2. 最終確認(SSMSで接続できるか確認)

それ以外のリソース作成・VM構築・SQL Serverインストール・各種設定はAIが自動実行する。


効果と費用

効果

項目 従来(オンプレ) 今回(Azure + AI)
可用性 ボロいPCは突然死する Azureの冗長インフラで安定稼働
構築時間 数日〜1週間 30分〜1時間
サーバー調達 発注・納期待ち 即日
経費精算 必要 不要
稟議・承認 必要 不要
繰り返し構築 手順書を見ながら手作業 記事をAIに渡すだけ
廃棄 処分手続きが必要 コマンド1行で削除

オンプレの検証サーバーは古いPCを使い回していることが多く、突然ハードウェア障害で死ぬリスクがある。
Azure VM はデータセンターの冗長インフラ上で動くため、ハードウェア起因の障害とは無縁になる。
「昨日まで動いてたのに今朝起動しない」という事故がなくなるのは地味に大きい。

費用

リソース 費用 備考
Windows Server 2022 無料 VS Subscriptionクレジットで賄う
SQL Server 2022 無料 Developer版(開発・検証用途)
SSMS 無料 —
Azure VM(Standard_D2s_v3) 約$40/月 平日9:00-18:00のみ稼働
ディスク + パブリックIP 約$5/月 —
合計 約$45/月 $50クレジット内に収まる

VS Subscription のクレジットは使わなければ毎月消える。眠らせておくより活用した方がお得。

image.png


構成

image.png

ローカルPC(SSMS)
    ↓ SQL Server(1433)
Azure VM(Windows Server 2022)
    - SQL Server 2022 Developer
    - SSMS
    ↑ Ansible(WinRM 5986)
WSL2(Ansible実行環境)

前提条件

  • Visual Studio Subscription(Professional以上)
  • WSL2
  • az CLI インストール済み
  • Python 3.8以上

コスト目安

リソース サイズ 月間コスト(平日9-18時のみ)
VM(Windows Server) Standard_D2s_v3 約$40/月
ディスク + パブリックIP — 約$5/月
合計 約$45/月($50クレジット内)

ステップ1: Azure ログイン・サブスクリプション設定

az login
az account list --output table
az account set --subscription "<サブスクリプションID>"

ステップ2: リソースグループ作成

az group create \
  --name rg-winserver-demo \
  --location japaneast

ステップ3: 仮想ネットワーク作成

az network vnet create \
  --resource-group rg-winserver-demo \
  --name vnet-winserver \
  --address-prefix 10.0.0.0/16 \
  --subnet-name snet-winserver \
  --subnet-prefix 10.0.1.0/24

ステップ4: NSG作成・ルール設定

az network nsg create \
  --resource-group rg-winserver-demo \
  --name nsg-winserver

# 自分のIPを確認
curl https://api4.ipify.org

# RDP(自分のIPのみ)
az network nsg rule create \
  --resource-group rg-winserver-demo \
  --nsg-name nsg-winserver \
  --name allow-rdp \
  --priority 1000 \
  --protocol Tcp \
  --destination-port-ranges 3389 \
  --source-address-prefixes "<自分のIP>/32" \
  --access Allow

# WinRM HTTPS(Ansible用・自分のIPのみ)
az network nsg rule create \
  --resource-group rg-winserver-demo \
  --nsg-name nsg-winserver \
  --name allow-winrm \
  --priority 1010 \
  --protocol Tcp \
  --destination-port-ranges 5986 \
  --source-address-prefixes "<自分のIP>/32" \
  --access Allow

# SQL Server(自分のIPのみ)
az network nsg rule create \
  --resource-group rg-winserver-demo \
  --nsg-name nsg-winserver \
  --name allow-sqlserver \
  --priority 1030 \
  --protocol Tcp \
  --destination-port-ranges 1433 \
  --source-address-prefixes "<自分のIP>/32" \
  --access Allow

ステップ5: Windows Server VM 作成

az vm create \
  --resource-group rg-winserver-demo \
  --name vm-winserver \
  --image MicrosoftWindowsServer:WindowsServer:2022-datacenter:latest \
  --size Standard_D2s_v3 \
  --admin-username azureuser \
  --admin-password "P@ssw0rd1234!" \
  --vnet-name vnet-winserver \
  --subnet snet-winserver \
  --nsg nsg-winserver \
  --public-ip-sku Standard

作成後にパブリックIPを確認:

az vm list-ip-addresses \
  --resource-group rg-winserver-demo \
  --name vm-winserver \
  --output table

詰まったポイント① --image Win2022Datacenter で実行するとJSONパースエラーが発生した。
フルURN形式 MicrosoftWindowsServer:WindowsServer:2022-datacenter:latest を指定すること。


ステップ6: WinRM 有効化

WinRM の設定は難所になると思っていたが、Claude が az vm run-command で PowerShell を流す方法を選択し、一発で通した。証明書作成・リスナー登録・ファイアウォール設定まで1コマンドで完結する。

az vm run-command invoke \
  --resource-group rg-winserver-demo \
  --name vm-winserver \
  --command-id RunPowerShellScript \
  --scripts '
    Enable-PSRemoting -Force
    $cert = New-SelfSignedCertificate -DnsName $env:COMPUTERNAME -CertStoreLocation Cert:\LocalMachine\My
    New-Item -Path WSMan:\LocalHost\Listener -Transport HTTPS -Address * -CertificateThumbprint $cert.Thumbprint -Force
    New-NetFirewallRule -Name "WinRM HTTPS" -DisplayName "WinRM HTTPS" -Enabled True -Direction Inbound -Protocol TCP -LocalPort 5986 -Action Allow
    Write-Output "WinRM設定完了"
  '

ステップ7: Ansible セットアップ(WSL2)

# pip3 が見つからない場合は先にインストール
sudo apt-get update && sudo apt-get install -y python3-pip

pip3 install ansible pywinrm

# Windowsコレクションのインストール
ansible-galaxy collection install ansible.windows
ansible-galaxy collection install chocolatey.chocolatey

詰まったポイント② pip install は pip: command not found になる。pip3 を使うこと。


ステップ8: Ansible 接続確認

inventory.yml を作成:

all:
  hosts:
    winserver:
      ansible_host: <パブリックIP>
      ansible_user: azureuser
      ansible_password: "P@ssw0rd1234!"
      ansible_connection: winrm
      ansible_winrm_transport: ntlm
      ansible_winrm_port: 5986
      ansible_winrm_scheme: https
      ansible_winrm_server_cert_validation: ignore

接続確認:

ansible -i inventory.yml winserver -m ansible.windows.win_ping

成功時:

winserver | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

ステップ9: SQL Server 2022 インストール

詰まったポイント③(重要) Ansible経由(WinRM/NTLMセッション)でChocolateyを実行すると、
SQL Server setup が Access is denied (CryptographicException) で失敗する。

原因:WinRMのNTLMセッションでは Windows DPAPI(暗号化API)が使えないため。

解決:az vm run-command invoke を使う。これはSYSTEMコンテキストで動くため制限を回避できる。

az vm run-command invoke \
  --resource-group rg-winserver-demo \
  --name vm-winserver \
  --command-id RunPowerShellScript \
  --scripts "
    Set-ExecutionPolicy Bypass -Scope Process -Force
    iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
    choco install sql-server-2022 --yes --no-progress \`
      --package-parameters '/SQLSYSADMINACCOUNTS:azureuser /IACCEPTSQLSERVERLICENSETERMS /ENU'
  "

インストール完了後、再起動が必要な場合がある:

# Ansibleで再起動
ansible -i inventory.yml winserver -m ansible.windows.win_reboot

詰まったポイント④ 初回実行時に「再起動が必要」で SQL Server インストールが失敗した。
VMを再起動してから再実行すること。


ステップ10: SSMS インストール

az vm run-command invoke \
  --resource-group rg-winserver-demo \
  --name vm-winserver \
  --command-id RunPowerShellScript \
  --scripts "choco install sql-server-management-studio --yes --no-progress"

ステップ11: SQL Server をローカルPCから接続できるように設定

SQL Server インストール直後は以下の2つが無効になっている。

1. TCP/IP の有効化

デフォルトではSQL ServerはNamed Pipesのみ。TCP/IPをレジストリで有効化する。

az vm run-command invoke \
  --resource-group rg-winserver-demo \
  --name vm-winserver \
  --command-id RunPowerShellScript \
  --scripts "
    \$regPath = 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQLServer\SuperSocketNetLib\Tcp'
    Set-ItemProperty -Path \$regPath -Name 'Enabled' -Value 1
    Restart-Service MSSQLSERVER -Force
    Start-Sleep 8
    netstat -an | findstr ':1433'
  "

0.0.0.0:1433 LISTENING が表示されればOK。

詰まったポイント⑤ ポート1433を開けてもSSMSから接続できなかった。
SQL ServerのTCP/IPプロトコルがデフォルトで無効なため。レジストリで有効化が必要。

2. 混合認証モード(Mixed Mode)の有効化

デフォルトはWindows認証のみ。SQL Server認証も有効にする。

az vm run-command invoke \
  --resource-group rg-winserver-demo \
  --name vm-winserver \
  --command-id RunPowerShellScript \
  --scripts "
    \$regPath = 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQLServer'
    Set-ItemProperty -Path \$regPath -Name 'LoginMode' -Value 2
    Restart-Service MSSQLSERVER -Force
    Start-Sleep 8
  "

3. SQL Serverログインの作成

RunCommandはSYSTEMコンテキストで動作するため、まずSYSTEMをsysadminに追加する。

az vm run-command invoke \
  --resource-group rg-winserver-demo \
  --name vm-winserver \
  --command-id RunPowerShellScript \
  --scripts "
    # シングルユーザーモードでSYSTEMをsysadminに追加
    Stop-Service MSSQLSERVER -Force
    Start-Sleep 3
    \$sqlProcess = Start-Process -FilePath 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Binn\sqlservr.exe' -ArgumentList '-m -s MSSQLSERVER' -PassThru
    Start-Sleep 10
    sqlcmd -S '.' -Q \"CREATE LOGIN [NT AUTHORITY\SYSTEM] FROM WINDOWS; ALTER SERVER ROLE sysadmin ADD MEMBER [NT AUTHORITY\SYSTEM];\" 2>&1
    Stop-Process -Id \$sqlProcess.Id -Force
    Start-Sleep 3
    Start-Service MSSQLSERVER
    Start-Sleep 8

    # SQL Serverログインを作成
    sqlcmd -S '.' -Q \"IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name='azureuser') CREATE LOGIN azureuser WITH PASSWORD='P@ssw0rd1234!'; ALTER SERVER ROLE sysadmin ADD MEMBER azureuser;\" 2>&1
    Write-Output 'Done'
  "

詰まったポイント⑥ エラー18456(Login failed)が発生した。
SQL Server認証モードがWindows認証のみになっているのが原因。
Mixed Mode への変更 + SQLログイン作成が必要。
RunCommandはSYSTEM権限で動くため、いきなりsqlcmdでログインを作ろうとしても権限エラーになる。
シングルユーザーモード経由でSYSTEMをsysadminに追加してから作成すること。


ステップ12: 自動シャットダウン設定(コスト節約)

az vm auto-shutdown \
  --resource-group rg-winserver-demo \
  --name vm-winserver \
  --time 1800 \
  --timezone "Tokyo Standard Time"

接続情報

Windows Server(RDP)

項目 値
接続先 <パブリックIP>
ポート 3389
ユーザー名 azureuser
パスワード P@ssw0rd1234!

Windowsの「リモートデスクトップ接続」で <パブリックIP> を入力して接続する。

image.png

SQL Server(SSMS)

項目 値
サーバー名 <パブリックIP>,1433
認証 SQL Server 認証
ログイン azureuser
パスワード P@ssw0rd1234!

image.png


詰まったポイントまとめ

# 症状 原因 解決
1 VMイメージのJSONパースエラー Win2022Datacenter エイリアスが壊れている フルURN形式を使う
2 pip: command not found WSL2では pip3 を使う pip3 install に変更
3 SQL Server インストールが Access is denied で失敗 WinRM/NTLMセッションでDPAPIが使えない az vm run-command(SYSTEMコンテキスト)で実行
4 SQL Server インストールが「再起動が必要」で失敗 Chocolateyインストール後にペンディング再起動が残っていた VMを再起動してからリトライ
5 1433ポート開放後もSSMSから接続できない SQL ServerのTCP/IPが無効(デフォルト) レジストリで Enabled=1 に設定して再起動
6 エラー18456(Login failed) SQL Server認証モードがWindows認証のみ Mixed Mode有効化 + SQLログイン作成

リソース削除(検証後)

az group delete \
  --name rg-winserver-demo \
  --yes \
  --no-wait

まとめ

Visual Studio Subscription の $50 クレジットを活用することで、
オンプレのサーバー調達・セットアップにかかる数日〜1週間の作業を 30分〜1時間 に短縮できた。

コスト面でも平日 9:00-18:00 のみ稼働させれば $45/月 に収まるため、毎月のクレジット内で運用可能。
SQL Server Developer ライセンスも含めて 実質無料 で検証・学習環境を持てる。

技術面では、SQL Server のインストールは WinRM 経由では DPAPI の制限があるため、
az vm run-command(SYSTEMコンテキスト)で実行する必要がある点が最大のハマりポイントだった。

経費精算なし・稟議なし・申請なし。VS Subscription を持っているなら、クレジットを眠らせておくのはもったいない。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?