Oracle 将 Always Free Ampere A1 Compute 的免费额度从 4 个 OCPU、24 GB 内存下调到 2 个 OCPU、12 GB 内存,而且没有公开公告。更麻烦的是,文档写着新限制适用于 “all tenancies”,但支持邮件又说只影响免费层账号,PAYG 账号是否受影响出现了互相矛盾的说法。
这不是一次简单的规格调整。对把免费 ARM 实例当作长期开发环境、低成本自托管节点、CI 辅助机器的团队来说,它提醒我们:云厂商的免费配额不是合同式容量,应该被当作可能变化的外部依赖来管理。
变化真正影响的是容量假设
旧额度下,4 OCPU / 24 GB RAM 可以拆成多个小实例,也可以跑一台相对宽裕的 ARM VM。很多人会把它用于:
- 个人 Kubernetes / k3s 实验集群
- 轻量数据库、监控、博客、跳板机
- ARM 架构构建与测试
- 常驻开发环境或小型 side project
新额度变成 2 OCPU / 12 GB RAM 后,单看数字仍然可用,但部署策略会明显变窄:
- 原本 2 台 2 OCPU / 12 GB 的组合不再成立
- 原本 4 OCPU / 24 GB 的“一台全吃”实例不再可复制
- 新建资源、重建实例、迁移区域时更容易撞到限制
- 文档和支持口径不一致时,自动化脚本可能比人更早失败
这里最危险的不是少了 2 个 OCPU,而是团队以为“免费层规格不会变”。一旦这个假设写进 Terraform、Ansible、Helm values 或内部文档,后续故障会表现为创建失败、扩容失败、重建失败,而不是一个清晰的“配额被砍了”。
免费层也需要配额监控
很多团队只监控生产账号的 quota,却忽略免费层、实验账号、个人云账号。实际上,免费资源更应该被监控,因为它们通常没有 SLA,也更容易发生策略调整。
可以这样实践:把期望的 Ampere A1 配额写成一个可执行检查。下面示例使用 OCI CLI 查询 Compute 配额相关信息,并在低于期望值时失败。运行前需要安装并配置 oci CLI,且将 compartment OCID 改成你的值。
#!/usr/bin/env bash
set -euo pipefail
COMPARTMENT_ID="ocid1.compartment.oc1..replace_with_yours"
REGION="us-ashburn-1"
EXPECTED_OCPUS=4
EXPECTED_MEMORY_GB=24
echo "Checking OCI limits in region: ${REGION}"
oci limits resource-availability get \
--service-name compute \
--limit-name standard-a1-core-count \
--compartment-id "${COMPARTMENT_ID}" \
--region "${REGION}" \
--query 'data.{available:available,used:used}' \
--output json
A1_AVAILABLE=$(oci limits resource-availability get \
--service-name compute \
--limit-name standard-a1-core-count \
--compartment-id "${COMPARTMENT_ID}" \
--region "${REGION}" \
--query 'data.available' \
--raw-output)
if [ "${A1_AVAILABLE}" -lt "${EXPECTED_OCPUS}" ]; then
echo "ERROR: Ampere A1 available OCPUs ${A1_AVAILABLE} is below expected ${EXPECTED_OCPUS}."
echo "Review instance shapes, Terraform variables, and account tier assumptions."
exit 1
fi
echo "OK: Ampere A1 available OCPUs are within expected range."
这个脚本不保证能覆盖所有 Oracle 账号类型差异,也不替代官方账单与限制页面。它的价值在于把“我们以为还有 4 OCPU”变成一条可失败的流水线检查。
把实例规格从代码里解耦出来
如果你的基础设施代码里硬编码了 VM.Standard.A1.Flex 的 OCPU 和内存,就容易在配额变化后批量失败。更稳妥的做法是把免费层容量当成变量,并为不同账号类型准备不同 profile。
例如 Terraform 可以这样改造:
variable "a1_ocpus" {
type = number
description = "Ampere A1 OCPU count for this tenancy"
default = 2
}
variable "a1_memory_gb" {
type = number
description = "Ampere A1 memory in GB for this tenancy"
default = 12
}
resource "oci_core_instance" "dev_arm" {
availability_domain = var.availability_domain
compartment_id = var.compartment_id
shape = "VM.Standard.A1.Flex"
shape_config {
ocpus = var.a1_ocpus
memory_in_gbs = var.a1_memory_gb
}
create_vnic_details {
subnet_id = var.subnet_id
assign_public_ip = true
}
source_details {
source_type = "image"
source_id = var.image_id
}
}
然后在免费层环境中使用更保守的变量:
terraform apply \
-var='a1_ocpus=2' \
-var='a1_memory_gb=12'
如果你确认某个 PAYG 租户仍有更高额度,也不要把它写死在模块里,而是放到环境变量、.tfvars 或 CI 参数中。这样当官方口径再次变化时,你只需要调整配置,不需要改模块代码。
口径冲突时,按更严格限制设计
这次事件的关键细节在于:文档称新限制适用于所有 tenancy,而支持邮件称只影响免费层账号。对工程团队来说,最实用的处理方式不是猜哪一方最终正确,而是按更严格的限制设计系统。
建议做三件事:
- 将新建实例的默认值降到 2 OCPU / 12 GB RAM
- 在 CI 或日常巡检中加入配额检查
- 给关键服务准备迁移路径,不要只依赖免费 ARM 节点
- 对 PAYG 账号单独验证,不把支持邮件当作可执行事实
如果你的服务真的需要稳定容量,免费层适合做开发、测试、学习和低风险自托管,不适合作为没有备份的生产底座。免费资源的成本很低,但不确定性本身也是一种成本。
迁移与降级清单
可以按这个顺序收敛风险:
- 列出所有使用
VM.Standard.A1.Flex的实例和 Terraform 模块。 - 检查是否有 4 OCPU / 24 GB 的硬编码规格。
- 将默认规格改为 2 OCPU / 12 GB,并允许按环境覆盖。
- 为数据库、监控、CI runner 这类状态或关键组件准备备份。
- 在重建实例前先查配额,避免删掉旧资源后新资源创建不出来。
云厂商的免费层很适合试水新架构,但它不是静态资产。把免费额度当作会变化的 API,而不是永远有效的承诺,基础设施代码才不会在下一次安静调整时突然失效。