Azure 学生订阅开不了机器,顺手写了个开机脚本

· 网安 · #服务器, #折腾, #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

注册以后,五个区域的配额都出来了,而且完全一样:

还有一点:老款的 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. 选订阅:查出每个订阅的真实类型,学生订阅标 ★;选到别的订阅会警告,告诉你钱会记到谁的账上。

  2. 计算服务:没注册就提示,并帮你注册。

  3. 选区域:只列出订阅允许的区域,带中文名,离中国、日本近的排在前面。

  4. 选机型:先选系列,再列出配额够用的机型,带官方零售价和月费估算,免费的标 ★。

    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/月
    
  5. 系统和登录:按架构选对镜像,钥匙不存在就新建,保留用户名会被拦下。

  6. 可选设置:开放端口、每天自动关机(按本机时间填,脚本换算成 UTC)。

  7. 费用清单:机器、硬盘、公网 IP、流量分开列,标出哪些免费、每月大约扣多少。

  8. 演练:先把完整命令打印出来,确认了才真正创建。

另外有一个管理菜单,可以看登录命令、停止、启动、删除。删除前要手打机器名确认。还有一个查本月花费的菜单。常见的报错,比如配额不够、机型不可用、区域不允许,都翻译成了能照着做的提示。

在 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,现在跑着监控探针,也当了一个备用的代理节点。

还没做好的

← 全部文章