说实话,第一次看到ACM(AWS Certificate Manager)账单时,我的血压真的有点高。
你以为 ACM 是免费的?AWS 官方确实写着“基础功能是免费的”。但当你兴冲冲地去部署一个带 HTTPS 的负载均衡器,下个月一看账单,发现每个月多出来几十甚至上百美元时,那种感觉就像是以为去自助餐能吃饱,结果被按头买了份“豪华海鲜拼盘”。
别急着骂街,这其中的门道其实非常清晰。作为在云原生领域摸爬滚打多年的老手,我见过太多人因为不懂 ACM 的计费边界而被“背刺”。今天咱们就把 2024 年最新的 ACM 计费规则扒开了、揉碎了讲清楚,顺便教你如何优雅地用免费证书搞定生产环境。
一、 为什么你会觉得 ACM “坑”?真相只有一个
首先,我们要明确一个核心概念:ACM 本身不收费,收费的是“高级证书”。
很多新手(包括刚入行的我)有个误区,觉得 ACM = 阿里云/腾讯云上的“免费证书申请服务”。在 AWS 里,ACM 是一个服务,但它包含两种类型的证书,计费逻辑截然不同:
1. AWS 托管证书(Public Hosted Zone + ACM)
这是真正的免费部分。
- 场景:你的域名托管在 Route 53,或者你通过 CNAME 记录验证了域名所有权。
- 费用:$0。
- 限制:只能申请 *.yourdomain.com 这种泛域名证书,或者特定域名的单证书。不能上传自定义的证书。
2. 私有证书(Private Certificate Authority)
这是 AWS 的付费增值服务,通过 AWS PCA(Private Certificate Authority)签发。
- 场景:企业内部私有的 PKI 体系,需要信任链在内部闭环。
- 费用:$400/月(PCA 费用)+ 签发证书的费用。
- 坑点:如果你不小心创建了一个 Private CA,哪怕一年只用一次,每个月也要交 400 刀。这就是很多“隐藏账单”的来源。
3. 第三方证书上传
如果你把 Let’s Encrypt 或者其他 CA 签发的证书上传到 ACM 里管理。
- 费用:$0(管理服务免费)。
- 但是:你不能直接通过 ACM 界面申请证书,得自己去外部申请。
2024 年最新变化提醒: AWS 在 2024 年进一步收紧了 ACM 免费证书的申请边界。以前有些灰色地带可以申请特定子域名的免费证书,现在强制要求必须使用 CNAME 验证或 DNS 验证,且泛域名证书(*.example.com)依然免费,但单域名证书的免费额度受到更严格的监控。
二、 那些让你“深夜破防”的隐藏扣费点
除了上面说的 PCA,还有几个隐蔽的扣费陷阱,请务必检查你的 AWS Billing Console。
陷阱 1:跨区复制证书
ACM 证书是按区域(Region)独立的。
- 默认行为:你在 us-east-1 申请的免费证书,不能直接用于 ap-southeast-1 的负载均衡器。
- 坑点:以前,你可以手动复制证书到其他区域,这个操作本身不收费。但现在,如果你使用的是某些自动化的基础设施即代码(IaC)工具,可能会在不同区域重复创建证书。虽然证书本身免费,但如果触发了某些关联的资源(如 NLB),成本就来了。
- 注意:ACM 证书在同一个区域内不同账户间不能共享,除非使用 Organizational 级别的策略,但这涉及 SSO 和权限配置,容易出乱子。
陷阱 2:证书到期后的“自动续订”幻觉
免费证书有效期是 12 个月。AWS 会在到期前 30-60 天自动尝试续订。
- 风险:如果你的 DNS 记录被误删,或者验证域名失联,续订会失败。证书过期后,你的负载均衡器会断连,业务中断。
- 更坑的是:为了恢复服务,你可能紧急申请新证书,如果此时操作不当(比如误触了某些付费选项),可能会产生意外费用。
陷阱 3:云资源未清理
这是最常见的“幽灵账单”。
- 场景:你测试完一个临时项目,创建了 ELB(弹性负载均衡器)和 ACM 证书。后来项目下线,你只删除了 EC2 实例,忘了删除 ELB。
- 结果:ELB 每月费用约 \(18-\)22 + 流量费。虽然证书免费,但承载证书的 ELB 是收费的。很多用户以为删了实例就没事了,其实 ELB 还在默默扣费。
三、 2024 年免费证书申请完整攻略(保姆级)
既然 ACM 免费证书香饽饽,那我们该怎么用?这里提供两套最稳妥的方案。
方案 A:Route 53 托管域名 + ACM(最简单,强烈推荐)
如果你的域名已经在 Route 53 托管,这是零成本、零运维的最佳方案。
步骤 1:在 ACM 控制台申请证书
- 登录 AWS 控制台,选择正确的区域(必须是 us-east-1,因为全球加速或 CloudFront 需要这个区域的证书;如果是单纯的区域级 ELB,可以选择对应区域)。
- 进入 Certificate Manager -> Request a certificate -> Request a public certificate。
- 点击 Next。
步骤 2:输入域名
- 选项 1:直接输入
example.com(单域名)。 - 选项 2(推荐):输入
*.example.com(泛域名,可覆盖所有子域名)。
- 点击 Next。
步骤 3:验证方式
- 选择 DNS validation(DNS 验证)。
- 点击 Review and Request。
- 点击 Confirm and Request。
步骤 4:自动添加 DNS 记录
- 此时,ACM 会列出需要添加的 CNAME 记录。
- 如果你的域名在 Route 53,点击 Create records in Route 53 按钮。
- AWS 会自动帮你添加验证记录,无需手动操作。
- 等待几分钟后,证书状态会从
Pending Validation变为Issued。
优点:全自动续订,完全免费,无需关心过期问题。 缺点:必须使用 Route 53 托管域名。
方案 B:非 Route 53 域名 + CNAME 验证(通用方案)
如果你的域名在阿里云、腾讯云或 Godaddy 等其他地方,操作稍微复杂一点,但依然免费。
步骤 1:申请证书 同上,在 ACM 中申请证书,选择 DNS validation。
步骤 2:手动添加 CNAME 记录
- ACM 页面会显示类似这样的记录:
Name: _xxxxxxxxx.yourdomain.com. Type: CNAME Value: _yyyyyyyyyy.acm-validations.aws. - 登录你的域名注册商控制台,添加这条 CNAME 记录。
- 等待 DNS 传播(通常几分钟到几小时)。
步骤 3:验证状态
回到 ACM 控制台,点击 Refresh,直到状态变为 Issued。
优点:支持任何域名注册商。 缺点:需要手动维护 DNS 记录,且 AWS 不会自动帮你添加记录,需要自己盯着。
四、 高级技巧:如何用 Let’s Encrypt 实现“无限免费”?
如果你对 AWS 的免费证书有所顾虑(比如担心 12 个月到期麻烦,或者想要更长的有效期),那么 Certbot + AWS ACM 的组合是业界标准做法。
虽然 ACM 免费证书已经很好用,但 Let’s Encrypt 可以提供 90 天有效期的证书,并且可以通过脚本自动续订,完全不受 AWS 控制台限制。
为什么还要用 Let’s Encrypt?
- 完全控制:证书在你手里,不依赖 AWS 的自动化流程。
- 无限续订:90 天一续,只要脚本跑得动,永远有效。
- 多域名支持:一个证书可以包含多个 SAN(Subject Alternative Names)。
自动化续订脚本示例(Bash)
以下是一个可以在 EC2 或 Lambda 中运行的脚本,用于申请和更新证书并导入 ACM。
#!/bin/bash
# 配置变量
DOMAIN="example.com"
EMAIL="admin@example.com"
AWS_REGION="us-east-1"
ACM_ARN=""
# 1. 使用 Certbot 申请证书(以 Nginx 插件为例,假设你有 Web Server)
# 如果没有 Web Server,可以使用 certbot-dns-route53 插件直接通过 DNS 验证
certbot certonly --nginx -d $DOMAIN -d www.$DOMAIN --email $EMAIL --agree-tos --no-eff-email --non-interactive
# 2. 检查证书是否申请成功
if [ -f "/etc/letsencrypt/live/$DOMAIN/fullchain.pem" ]; then
echo "Certificate issued successfully."
# 3. 使用 AWS CLI 导入证书到 ACM
# 注意:需要先配置好 AWS CLI 权限,具备 certificates:Import 权限
ACM_RESULT=$(aws acm import-certificate \
--certificate file:///etc/letsencrypt/live/$DOMAIN/fullchain.pem \
--private-key file:///etc/letsencrypt/live/$DOMAIN/privkey.pem \
--region $AWS_REGION)
ACM_ARN=$(echo $ACM_RESULT | jq -r '.CertificateArn')
echo "Certificate ARN: $ACM_ARN"
# 4. 绑定到 ALB(假设你已经有一个 ALB ARN)
# aws acm describe-certificate --certificate-arn $ACM_ARN
else
echo "Certificate issuance failed."
exit 1
fi
如何设置自动续订?
在 Linux 服务器上,使用 cron 定时任务:
# 编辑 crontab
crontab -e
# 添加以下内容,每天凌晨 2 点检查并续订
0 2 * * * certbot renew --quiet && /path/to/import_to_acm.sh
这样,即使 ACM 的自动续订失败,你也有一个完全独立的备份方案。
五、 如何避免账单陷阱?3 个自查清单
为了避免未来被“坑”,请定期执行以下检查:
检查 AWS PCA(私有证书颁发机构):
- 进入 ACM 控制台 -> Private certificate authorities。
- 如果你没有使用私有 CA 的需求,立即删除所有未使用的 PCA。
- 每个活跃的 PCA 每月收费 $400。这是最大的隐形杀手。
清理僵尸资源:
- 使用 AWS Cost Explorer 或 Trusted Advisor,查看是否有未关联 ACM 证书的 ELB 或监听器。
- 定期检查 EC2 控制台 和 ELB 控制台,确保没有遗留资源。
设置预算告警:
- 在 AWS Billing Console 设置 Budgets。
- 为 ACM 相关服务(实际上很难单独拆分 ACM,建议对整体计算资源设置告警)设置月度预算。
- 当支出超过 50%、80%、100% 时,发送邮件或 SNS 通知。
六、 真实案例:我的“血泪”教训
去年,我负责的一个测试环境因为业务下线,我只删除了所有的 EC2 实例。一个月后收到账单,发现多出了 $50 左右的费用。
查了半天,发现是一个过期的 NLB(Network Load Balancer) 还在运行。它背后没有任何实例,但 AWS 依然对 NLB 收取基础费用(约 $22/月)+ 流量费。更糟糕的是,这个 NLB 关联的 ACM 证书虽然免费,但证书已经过期,导致所有 HTTPS 请求失败。
我花了两个小时才找到这个“幽灵”负载均衡器。从那以后,我养成了习惯:任何资源下线,必须同时检查关联的 ELB、ACM 证书、S3 桶和 RDS 实例。
结语
ACM 本身不是“坑”,对计费规则的不了解才是坑。
对于大多数个人开发者和中小型企业,方案 A(Route 53 + ACM 免费证书) 已经足够强大。它简单、免费、自动续订,几乎不需要运维成本。只有当你有复杂的内部 PKI 需求时,才需要考虑付费的 Private CA。
希望这篇攻略能帮你避开那些隐藏的账单陷阱。如果有任何疑问,欢迎在评论区交流。毕竟,省钱是一门技术活,咱们一起把 AWS 的账单省到最低!