发现亚马逊ACM私有证书被重复扣费 检查Load Balancer绑定与托管域名配置避免每月多支出证书费用
前几天我的一位做后端的同事突然找我,说他AWS账单里有一笔小额费用怎么也对不上,每个月都有,但金额不多,一开始根本没当回事。后来仔细一查,居然是AWS ACM(AWS证书管理器)的私有证书在”偷偷”扣钱。
这个事说出来挺让人后怕的。AWS ACM本身提供公网证书是免费的,但如果你用的是私有证书(Private Certificate),情况就完全不同了——每创建一个私有CA,每月基础费用100美元,再创建一个证书模板,每发布一个证书还要额外收费。如果你以为AWS的”私有证书”也是免费的,那你每个月都在默默交钱。
我花了整整一个下午帮他把这个问题摸清楚,现在想把整个排查过程、底层逻辑和避坑方法,掰开揉碎了讲给你听。
为什么你会”被扣费”
先说核心原因。AWS ACM的公网证书确实是免费的,这是大家普遍知道的事。但私有证书完全是另一套体系:
私有CA(Private CA)的基础费用:每月100美元,按每个私有CA收取。
证书发布费用:每个发布的证书大约0.11美元,长期持有还要付月度费用。
所以如果你创建了多个私有CA,或者同一个CA下反复发布、吊销、再发布证书,账单上的数字就会悄然增长。而很多团队在搭建内部HTTPS环境、API网关认证或者Service Mesh的时候,会在不同Region、不同账号下重复创建私有CA,自己完全不知道。
更隐蔽的是:有些私有证书被错误地绑定到了负载均衡器上,导致系统以为你还在使用它,持续计费,而实际上业务早已迁移或废弃。
最常见的”踩坑”场景
我整理了几个实际发生过的案例,你看是不是也很眼熟:
场景一:跨Region复制证书,但旧证书没清理
有些团队为了多Region高可用,会在us-east-1创建私有CA,然后用ACM Private CA的复制功能把证书复制到eu-west-1。复制成功后,源CA的证书还在,目标CA也生成了一份。两地的证书都在计费,但很多人只关注到了”有一个证书在用”,忘了两个都在收费。
场景二:Load Balancer切换后,旧证书没解绑
这是最典型的”幽灵扣费”。你把应用从Application Load Balancer(ALB)迁移到新架构,解绑了证书,但Certificate ARN还残留在某个Listener的Rule里。AWS不会主动帮你清理,账单照扣不误。
场景三:同一证书绑定到多个Load Balancer
很多人不知道,一个ACM证书可以同时绑定到多个ALB/NLB。你以为只给主入口用了,实际上后台可能挂着5个Load Balancer,每个都在”共享”这个证书,而计费端点看到的是证书本身,不是绑定关系——所以只要证书存在,费用就存在。
场景四:测试环境忘记销毁
开发或者测试环境创建的私有CA和证书,用完没删除。一个月后你发现账单多了100多美元,回头找才发现是三个月前某个实验性项目遗留的”遗产”。
如何排查你的ACM费用
下面这些步骤,按顺序来,基本能把隐藏费用挖出来。
第一步:确认你用的是否是私有证书
登录AWS控制台,进入 ACM服务,点击左侧 Private certificate authority。如果这个菜单是灰色的或者找不到,说明你可能用的是公网证书,那个是免费的,不用慌。
如果能看到,点进去,你会看到所有私有CA的列表。每个CA旁边会显示它的状态(Created / Disabled / Deleted)和创建时间。
你可以用CLI快速列出来:
aws acm-pca list-authorities \
--region us-east-1 \
--query 'Authorities[].[AuthorityName,Status,CreatedAt,Arn]' \
--output table
输出大概长这样:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| ListAuthorities |
+----------------------+-----------+---------------------+--------------------------------------------------------------------------------+
| AuthorityName | Status | CreatedAt | Arn |
+----------------------+-----------+---------------------+--------------------------------------------------------------------------------+
| prod-private-ca | ACTIVE | 2024-01-15 10:30:00 | arn:aws:acm-pca:us-east-1:123456789012:certificate-authority/xxxx-xxxx-xxxx |
| staging-private-ca | ACTIVE | 2024-02-20 14:00:00 | arn:aws:acm-pca:us-east-1:123456789012:certificate-authority/yyyy-yyyy-yyyy |
| dev-private-ca | DISABLED | 2023-11-01 09:00:00 | arn:aws:acm-pca:us-east-1:123456789012:certificate-authority/zzzz-zzzz-zzzz |
+----------------------+-----------+---------------------+--------------------------------------------------------------------------------+
注意看状态。DISABLED不代表免费了——只要CA没被彻底删除,月费照样收。只有Deleted状态才会停止计费。
第二步:检查每个CA下有多少证书
aws acm-pca list-certificates \
--certificate-authority-arn arn:aws:acm-pca:us-east-1:123456789012:certificate-authority/xxxx-xxxx-xxxx \
--region us-east-1 \
--query 'Certificates[].[Serial,Status,CreatedAt]' \
--output table
这个命令会列出该CA下所有证书,包括已吊销的。吊销(REVOKED)的证书在吊销后30天内仍会计费,之后才停止。所以即使你觉得”用不到了”,也别急着手动吊销,先确认它真的不需要了。
第三步:检查Load Balancer上的证书绑定
这一步最关键,也是很多人漏掉的。我们用CLI遍历所有ALB:
aws elbv2 describe-load-balancers --region us-east-1 --query 'LoadBalancers[].{Name:Name,Arn:LoadBalancerArn,Type:Type}' --output json
拿到每个ALB的ARN后,再查它的Listeners:
aws elbv2 describe-listeners \
--load-balancer-arn arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/app/my-alb/xxxxx \
--region us-east-1 \
--query 'Listeners[].{Port:Port,Protocol:Protocol,CertificateArn:Certificates[0].CertificateArn}' \
--output table
你会看到类似这样的输出:
-------------------------------------------------------------------------------------------------------------------
| DescribeListeners |
+------+-----------+--------------------------------------------------------------------------------+
| Port | Protocol | CertificateArn |
+------+-----------+--------------------------------------------------------------------------------+
| 443 | HTTPS | arn:aws:acm:us-east-1:123456789012:certificate/abcd-1234-xxxx-xxxx-1234567890ab |
| 80 | HTTP | None |
+------+-----------+--------------------------------------------------------------------------------+
注意看这个CertificateArn。它指向的是ACM公网证书还是私有证书? 私有证书的ARN格式不同,一般可以在ACM控制台里直接对比。如果ARN对应的是一个Private CA签发的证书,而该CA仍在计费,这就是一个潜在的”重复扣费点”。
第四步:用Cost Explorer看ACM具体费用
AWS账单里有专门的ACM费用分项。进入 Cost Explorer,筛选服务为AWS Certificate Manager,你会看到:
- ACM Private CA 基础费用:每个CA每月100美元
- 证书发布费用:按证书数量计费
如果这个分项的数值在增长,而你又没有新增业务,那就是有问题了。
你也可以用AWS Cost Anomaly Detection,设置一个监测规则,专门追踪ACM相关费用异常。这个功能对小额但持续的费用非常敏感,能主动推送告警。
如何避免被”暗扣”
排查完了,更重要的是建立防护机制。我在帮同事处理完之后,给他建了以下几个习惯:
1. 用标签(Tag)管理所有ACM资源
给每个私有CA和证书加上明确的标签,比如Environment: prod、Owner: backend-team、Project: payment-service。这样在账单分析的时候,可以按标签维度过滤,一眼看出哪些资源属于哪个项目。
aws acm-pca tag-certificate-authority \
--certificate-authority-arn arn:aws:acm-pca:us-east-1:123456789012:certificate-authority/xxxx-xxxx-xxxx \
--tags Key=Environment,Value=prod Key=Owner,Value=backend-team
2. 用AWS Config规则检测闲置证书
AWS Config可以监控ACM资源的变化。设置一条规则,比如acm-certificate-expired-check,当证书临近过期或者状态变为REVOKED超过30天,就触发告警。
你也可以用CloudWatch Events(EventBridge)监听ACM事件:
{
"source": ["aws.acm"],
"detail-type": ["ACM Certificate Status Change"],
"detail": {
"CertificateArn": ["arn:aws:acm:*:*:certificate/*"]
}
}
配置一个Lambda来响应,当证书状态变为REVOKED,记录时间,30天后自动建议删除对应的CA。
3. 建立”证书生命周期”文档
这个听起来土,但非常有效。每次创建私有CA或发布证书,在Confluence或者Notion上记录:
- 创建原因
- 绑定哪些Load Balancer或服务
- 预计使用周期
- 负责人
3个月后再回顾一次,把已经废弃的清理掉。我们团队后来养成了”月度资源盘点”的习惯,每月花15分钟检查一下ACM资源,账单从此稳定。
4. 用Pricing Calculator做成本预估
如果你要在多个Region部署私有CA,先用AWS Pricing Calculator算一下。比如:
- 3个私有CA × 100美元/月 = 300美元/月
- 50个证书 × 0.11美元 = 5.5美元/月
这个数字写在项目文档里,每次新增CA之前看一眼,能避免”不知不觉就多出一块费用”的情况。
如何彻底删除不需要的私有CA
如果你确认某个私有CA已经没有任何业务在用,可以按照以下步骤彻底删除,停止计费:
吊销该CA下所有证书
首先要把CA签发的所有证书吊销:
aws acm-pca revoke-certificate \
--certificate-authority-arn arn:aws:acm-pca:us-east-1:123456789012:certificate-authority/xxxx-xxxx-xxxx \
--certificate-serial <serial> \
--revoke.reason SUPERSEDED \
--region us-east-1
等待30天
吊销后证书需要30天才会计费停止。这是AWS的缓冲期,目的是防止误操作。
禁用CA
aws acm-pca update-certificate-authority \
--certificate-authority-arn arn:aws:acm-pca:us-east-1:123456789012:certificate-authority/xxxx-xxxx-xxxx \
--status DISABLED \
--region us-east-1
删除CA
aws acm-pca delete-certificate-authority \
--certificate-authority-arn arn:aws:acm-pca:us-east-1:123456789012:certificate-authority/xxxx-xxxx-xxxx \
--region us-east-1
删除之后,这个CA的月费才会真正归零。你可以在Cost Explorer里验证,下个月账单上这笔费用应该消失。
一个真实的”救火”案例
我同事的情况是这样的:他们有一个支付服务,早期在us-east-1创建了一个私有CA,给内网API网关用了HTTPS。后来架构升级,API网关迁移到了AppSync,私有的ACM证书被废弃了。但当时没人去删CA,也没人去检查负载均衡器上有没有残留绑定。
结果每个月账单上多100美元,持续了8个月,总共将近800美元。
发现的过程其实挺戏剧性的——财务系统突然推送了一个”ACM费用异常告警”,金额比上个月多了100美元。他一开始以为是新增了什么服务,结果查了半天发现,那个CA的状态还是ACTIVE,但没有任何证书在使用。
我们最后把那个CA禁用了,30天后确认账单归零,800美元的冤枉钱算是打住了。之后他给我的建议是:“AWS的免费服务要珍惜,但收费服务更要警惕。不要觉得金额小就不管,积少成多真的很吓人。”
总结
AWS ACM私有证书的费用问题,本质上是”认知盲区”——很多人以为ACM都是免费的,直到账单推送过来才发现不对。排查的关键在于:
- 确认CA状态:ACTIVE和DISABLED都要收费,只有Deleted不收费。
- 检查证书绑定:Load Balancer、API Gateway、CloudFront都可能引用证书,逐一排查。
- 建立标签和管理习惯:用标签追踪来源,用文档记录生命周期。
- 设置告警机制:Cost Anomaly Detection和CloudWatch Events能帮你主动发现问题,而不是等账单来”教育”你。
费用这个东西,小的看不出来,大的吓死人。定期检查,保持警觉,才能让云服务真正为你省钱,而不是偷偷吃掉你的预算。