Azure 学生订阅开不了机器,顺手写了个开机脚本
我用学校邮箱开了 Azure for Students,有 100 美元额度,还有一年的免费机型。想看看能开什么机器,结果在控制台里怎么都找不到能开的机型,前后绕了大半天。最后发现问题出在两个很不起眼的地方,于是顺手写了一个开机脚本,免得别人再踩一遍。
文中不写 IP、订阅 ID 和任何密钥。
控制台里一台都开不了
一开始的想法很简单:在控制台里查一下学生订阅能开哪些机型。控制台的界面很绕,我就打开右上角的 Cloud Shell,粘了一段查询脚本进去。
第一次跑完,一台都没有。
原因是脚本的筛选条件写得太严。很多机型只是在某个可用区不对学生订阅开放,整个区域其实是能开的,脚本却把它们全部排除了。改掉以后再跑,第一行输出就不对:
当前订阅:sub-qmul-avd-prod
区域总 vCPU:已用 0 / 上限 350
这不是我的学生订阅,是学校远程桌面用的生产订阅。我的账号在学校的租户里,能看到这个订阅,Cloud Shell 默认选中的也是它。要是真在这上面开了机器,钱就记到学校的账上了。
换成本机命令行,电脑卡死了
Cloud Shell 粘长脚本很容易出错,我干脆在 Mac 上装了 Azure CLI,登录时手动选了学生订阅。
接着犯了第二个错:同时查五个允许的区域,每个区域都下载完整的机型列表。一个区域大约 3 MB 的 JSON,五个一起跑,再加上 jq 处理,电脑直接卡死了。之后改成一个区域一个区域地查,并且只下载某个系列的机型。
真正的原因:计算服务没注册
学生订阅里机型列表能查到,配额却是空的,az vm list-usage 什么都不返回。查了一下,学生订阅的 Microsoft.Compute 资源提供程序状态是 NotRegistered。
没注册的时候,配额查不出来,控制台里看着就像哪台机器都开不了。注册是免费的,也不会创建任何东西,一条命令就行:
az provider register -n Microsoft.Compute --subscription "Azure for Students" --wait
注册以后,五个区域的配额都出来了,而且完全一样:
- 每个区域总共 6 个 vCPU;
- 大部分系列单独限 4 个,B v2 系列限 10 个,但都受总数 6 的约束;
- 单台最大只能开 4 vCPU。
还有一点:老款的 B1s 在 japaneast 对学生订阅是整个区域不开放的。所以在东京,免费的选择只剩 B2ats_v2(x86)和 B2pts_v2(ARM),都是 2 核 1 GB。
回头看:我没从免费服务页面进去
我一开始是在控制台普通的"创建虚拟机"入口操作的,订阅也选了 Azure for Students,可机型那一栏就是没有可选项。现在知道是计算服务没注册的缘故。
学生订阅正确的入口是控制台里的免费服务页面:https://portal.azure.com/#view/Microsoft_Azure_Billing/FreeServicesBlade。从那里创建,列出来的就是免费额度里的机型。
于是写了个脚本
能开的机型、价格、免费额度都能用命令查出来,只是散在好几个地方。我把整个过程写成了一个一问一答的脚本,叫 azure-vm-wizard,每一步直接回车就是推荐选项:
-
选订阅:查出每个订阅的真实类型,学生订阅标 ★;选到别的订阅会警告,告诉你钱会记到谁的账上。
-
计算服务:没注册就提示,并帮你注册。
-
选区域:只列出订阅允许的区域,带中文名,离中国、日本近的排在前面。
-
选机型:先选系列,再列出配额够用的机型,带官方零售价和月费估算,免费的标 ★。
1) Standard_B2pts_v2 2 vCPU 1 GB Arm64 $0.0108/h ~ $7.88/月 ★ 免费额度 2) Standard_B2ats_v2 2 vCPU 1 GB x64 $0.0123/h ~ $8.98/月 ★ 免费额度 3) Standard_B2ts_v2 2 vCPU 1 GB x64 $0.0136/h ~ $9.93/月 -
系统和登录:按架构选对镜像,钥匙不存在就新建,保留用户名会被拦下。
-
可选设置:开放端口、每天自动关机(按本机时间填,脚本换算成 UTC)。
-
费用清单:机器、硬盘、公网 IP、流量分开列,标出哪些免费、每月大约扣多少。
-
演练:先把完整命令打印出来,确认了才真正创建。
另外有一个管理菜单,可以看登录命令、停止、启动、删除。删除前要手打机器名确认。还有一个查本月花费的菜单。常见的报错,比如配额不够、机型不可用、区域不允许,都翻译成了能照着做的提示。
在 Cloud Shell 里一行就能跑:
bash <(curl -fsSL https://raw.githubusercontent.com/Arcueid0221/azure-vm-wizard/main/azure-vm-wizard.sh)
这里要用 bash <(curl …),不能用 curl … | bash,后者会让脚本读不到键盘输入。
实测
我用脚本在 koreacentral 真开了一台测试机,把创建、开端口、自动关机、停止、启动、删除都走了一遍,最后整个资源组删干净。中间有个小插曲:我这边的网络连不上那台机器的 22 端口,从另外两台云服务器却都能连上,所以是本地网络的问题。我顺手在脚本的登录说明里加了一句:ssh 超时的话,换手机热点或者 Cloud Shell 试试。
最后在 japaneast 开了一台 B2ats_v2,Ubuntu 24.04,现在跑着监控探针,也当了一个备用的代理节点。
还没做好的
- Cloud Shell 里的完整交互我还没测过,只在 Mac 上跑过。
- README 里写着"学生额度的余额命令行查不到",这句话是错的。后来发现余额挂在结算账号下面,换一层接口就能查到。暂时还没改。