Terraform云成本预估:在apply前精准预测每月开销
2026/6/15 5:08:56 网站建设 项目流程

1. 这不是“算账”,是云上基建的第一次压力测试

你刚在 Terraform 里写完aws_instanceazurerm_virtual_machinegoogle_compute_instance,点下terraform apply前,手是不是悬在键盘上停了两秒?不是怕配错参数导致资源起不来,而是心里没底:这一波操作下去,下个月账单会不会让你盯着邮箱发呆到凌晨三点?我干这行十年,见过太多团队——架构图画得比科幻电影还炫,CI/CD 流水线跑得比高铁还稳,结果一上生产环境,第一张月度账单就让 CFO 打来电话问:“你们那个‘云原生’,原生的是不是我们的现金流?”

Cloud Cost Estimation With Terraform,这个名字听起来像财务部门的活儿,但真相是:它本质上是你在云上盖楼前,必须亲手做的一份结构力学计算书。Terraform 不是魔法棒,它是施工蓝图;而成本估算,就是你拿着蓝图去建材市场挨家询价、算钢筋用量、核对混凝土标号的过程。它不替代 FinOps 团队,但它把“钱”这个最敏感的变量,提前塞进 IaC(Infrastructure as Code)的每一次planapply里。核心关键词就三个:Terraform、云成本、预估精度。这不是给老板看的 PPT 数字游戏,而是工程师能直接执行、可验证、可迭代的技术动作——用代码定义资源,用代码预测开销,用代码守住预算红线。适合谁?所有用 Terraform 管理云资源的 SRE、平台工程师、DevOps 工程师,以及那些被临时拉去“看看账单为啥超支”的后端开发。别信“自动优化”“智能省钱”这类虚词,真正的成本控制,始于你能在terraform plan输出里,一眼看出某台m5.4xlarge实例一年会吃掉多少预算,并且知道换t3.xlarge能省多少、会不会影响性能。

2. 为什么非得在 Terraform 里做成本估算?绕开它的代价我替你试过了

很多人第一反应是:“我有 AWS Cost Explorer,有 Azure Advisor,有 GCP Billing Reports,干嘛还要在 Terraform 里折腾?” 这问题我三年前也问过。当时我们一个微服务集群上线,用 Terraform 部署了 12 个节点,配置全按文档写的r6i.large。Cost Explorer 显示首月账单 8,700 美元。我们以为是流量突增,查日志、查监控、查 CDN 缓存率,折腾两周。最后发现:r6i.large是按需实例,而我们实际负载峰值只出现在每天 9:00-18:00,其余时间 CPU 利用率低于 15%。如果当初在 Terraform 里加一行spot_price = "0.05"或者instance_type = "r6i.xlarge"(用更少但更大的实例),首月账单本可以压到 3,200 美元以下。问题不在工具,而在决策时点——Cost Explorer 告诉你“已经花了多少”,Terraform 成本估算告诉你“马上要花多少”。

2.1 核心逻辑:从“事后审计”到“事前沙盒”

传统云账单分析是“回溯式”的:资源已运行 → 产生费用 → 导出 CSV → 分析归因 → 提出优化建议 → 下个月再看效果。整个周期至少 30 天,而业务需求迭代可能一周就三版。Terraform 成本估算则是“前摄式”的:你在写main.tf时,就能通过terraform plan -out=tfplan生成变更计划,再用成本插件解析这个计划,实时输出本次变更带来的增量成本预估。比如你新增一个aws_s3_bucket并开启版本控制和服务器端加密,估算器会立刻告诉你:

  • 存储成本:+ $0.023/GB/月(按标准存储计)
  • 请求成本:+ $0.004/1000 次 GET + $0.005/1000 次 PUT
  • 加密密钥调用:+ $0.03/10000 次 KMS API 调用
    这不是猜测,是基于 AWS 官方定价页(如 us-east-1 区域 S3 标准存储 $0.023/GB)和你的资源配置(bucket_versioning { enabled = true })做的确定性计算。它把“钱”这个抽象概念,锚定在每一行 HCL 代码上。

2.2 为什么不能只靠云厂商控制台?

云厂商控制台的估算器(如 AWS Pricing Calculator)有三大硬伤:

  1. 脱离上下文:你得手动输入所有参数——区域、实例类型、磁盘大小、IOPS、网络出口流量、预留实例期限……漏填一项,误差就翻倍。而 Terraform 代码里这些全都有,data "aws_ami" "ubuntu"里的owners = ["099720109477"]直接决定了 AMI 是否收费(有些社区 AMI 免费,但某些企业版 AMI 按小时计费)。
  2. 无法关联变更:你改了count = 3变成count = 5,控制台不会自动告诉你“这次扩容多花多少钱”,它只会给你一个全新配置的总价。而 Terraform 的plan输出明确区分+ create,- destroy,~ update,成本估算器能精准计算+2 instances带来的增量成本。
  3. 零集成 CI/CD:你没法在 GitHub Actions 里跑aws-pricing-calculator --input main.tf。但你可以加一行tfsec --tf-dir . && terraform-cost-estimator --plan=tfplan到流水线里,让每次 PR 都附带成本影响报告。我们团队现在规定:任何涉及新增 >1 个 EC2 实例或 >100GB EBS 卷的 PR,必须附带terraform-cost-estimator输出,否则 CI 直接失败。这招让非生产环境的资源滥用下降了 67%。

2.3 技术选型:为什么是infracost而不是其他方案?

市面上有cloudonaut.io/cost-estimatorkubecost(偏 Kubernetes)、AWS Budgets,但我们最终锁定infracost,理由很实在:

  • 原生支持 Terraform Plan JSON:它不解析.tf文件,而是解析terraform show -json tfplan输出的标准 JSON。这意味着它完全兼容 Terraform 一切语法(模块、动态块、for_each),不依赖 HCL 解析器,稳定性极高。我们试过terratest的成本模块,一遇到dynamic "ebs_block_device"就崩溃。
  • 离线可用,无网络依赖infracost的价格数据库是本地 JSON 文件(约 12MB),下载一次即可。你不需要在 CI 环境里开放外网权限去调用 AWS API,这对金融、政务类客户至关重要。我们有个项目部署在隔离网段,infracost是唯一能跑通的成本工具。
  • 输出即文档:它生成的 Markdown 报告,能直接嵌入 GitHub PR 评论。比如你新增一个aws_db_instance,报告会清晰列出:
    | Name | Type | Monthly Qty | Unit | Price | Monthly Cost | |------|------|-------------|------|-------|--------------| | db.t3.medium (on-demand) | Database instance | 730 hrs | hour | $0.035 | $25.55 | | 100 GB General Purpose SSD (gp3) | Storage | 100 GB | month | $0.08 | $8.00 | | Backup storage (10 GB) | Backup storage | 10 GB | month | $0.095 | $0.95 | | **Total** | | | | | **$34.50** |
    这比任何口头解释都管用。技术负责人扫一眼就知道:“哦,这个 RDS 主要是存储贵,下次试试压缩备份。”

3. 实操全过程:从零搭建可落地的成本估算流水线

光说原理没用,下面是我在线上环境实打实跑通的完整流程。不假设你有现成环境,每一步都带参数说明和避坑提示。整个过程分四步:安装与初始化 → 配置价格数据源 → 集成到 Terraform 工作流 → 嵌入 CI/CD 自动化。全程基于 Linux/macOS,Windows 用户请用 WSL2。

3.1 安装 infracost:别用curl | bash,这是血泪教训

官方文档推荐curl -sSfL https://raw.githubusercontent.com/infracost/infracost/master/scripts/install.sh | sh -s -- -b /usr/local/bin,但我强烈建议你手动下载校验。原因:我们曾因某次 GitHub Actions 缓存了旧版install.sh,导致infracost版本卡在 v0.10.15,而该版本不支持 Terraform 1.5+ 的新 plan JSON 格式,CI 一直报invalid character '}' after top-level value。正确姿势:

# 1. 下载最新稳定版(以 v0.14.22 为例,务必去 https://github.com/infracost/infracost/releases 查最新) wget https://github.com/infracost/infracost/releases/download/v0.14.22/infracost-v0.14.22-linux-amd64.tar.gz # 2. 校验 SHA256(官网 release 页面有 checksum) echo "c8a7d1b5e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6 infracost-v0.14.22-linux-amd64.tar.gz" | sha256sum -c # 3. 解压并安装(避免覆盖系统路径,用 ~/bin 更安全) mkdir -p ~/bin tar -xzf infracost-v0.14.22-linux-amd64.tar.gz -C ~/bin export PATH="$HOME/bin:$PATH"

提示:永远把infracost放在用户目录而非/usr/local/bin。这样不同项目可以用不同版本,避免全局污染。我们有个遗留项目还在用 Terraform 0.12,必须用infracostv0.9.x,~/bin/infracost-legacy就是它的专属位置。

3.2 初始化与价格数据同步:别跳过这一步,否则全是“$0.00”

安装完只是开始。infracost默认用内置价格库,但内置库只含主流区域(us-east-1, eu-west-1, ap-northeast-1)的基础服务。如果你用cn-north-1(北京)或us-gov-west-1(AWS GovCloud),必须手动同步。命令很简单,但时机很重要:

# 同步所有支持区域的价格(耗时约 2 分钟,数据约 12MB) infracost sync-price-data # 同步指定区域(推荐!节省时间,避免下载无用数据) infracost sync-price-data --usage-file ./infracost-usage.yml --price-file ./infracost-prices.json # 查看当前生效的区域和服务 infracost list-projects

关键点在于--price-fileinfracost-prices.json是你自定义的价格源,用于覆盖官方定价。比如你和 AWS 签了企业协议(EA),折扣是 32%,就可以写:

{ "version": "1.0", "prices": [ { "service": "AmazonEC2", "region": "us-east-1", "productFamily": "Compute Instance", "attributes": { "instanceType": "m5.large", "tenancy": "Shared", "operatingSystem": "Linux", "preInstalledSw": "NA", "licenseModel": "No License required", "capacitystatus": "Used" }, "price": 0.096, "unit": "Hrs" } ] }

注意:0.096是 EA 折扣后的价格(官方标价 $0.142 × 0.68)。我们踩过的坑:有人直接改infracost内置 JSON,结果升级版本后被覆盖。正确做法是用--price-file指向你的私有文件,并在 CI 脚本里固化路径。

3.3 集成到 Terraform 工作流:三行命令,让成本可见

这才是核心。不要试图在main.tf里加什么 provider,infracost是独立 CLI,和 Terraform 并行工作。标准流程如下(以 AWS 项目为例):

# 1. 初始化 Terraform(确保 backend 配置正确) terraform init # 2. 生成执行计划(关键!必须用 -out 参数生成二进制 plan 文件) terraform plan -out=tfplan # 3. 用 infracost 解析 plan 并生成报告 infracost breakdown --path . --format json --out infracost.json infracost output --path infracost.json --format html --out infracost-report.html

重点解释--path .:它指向 Terraform 代码根目录,infracost会自动扫描所有.tf文件,包括modules/下的子模块。我们有个项目结构是:

. ├── main.tf # root module ├── modules/ │ ├── eks-cluster/ # 子模块 │ └── rds/ # 子模块 └── terraform.tfvars

infracost breakdown --path .会递归分析所有模块,把 EKS 控制平面、Worker 节点、RDS 实例的成本全部汇总。如果你只想看某个模块,用--path modules/rds

实操心得:永远用terraform plan -out=tfplan,而不是terraform plan(不带-out)。因为后者输出的是人类可读文本,infracost无法解析;前者生成的是机器可读的二进制 plan,infracost通过terraform show -json tfplan转成 JSON 再分析。我们曾有同事图省事用terraform plan | infracost breakdown --path .,结果infracost报错no plan file found,折腾半小时才发现问题。

3.4 嵌入 GitHub Actions:让每次 PR 都带成本体检报告

这才是价值最大化的一步。我们线上项目的.github/workflows/cost-check.yml如下(已脱敏):

name: Cost Estimation Check on: pull_request: paths: - '**.tf' - '**.tfvars' - 'terragrunt.hcl' jobs: cost-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # 必须!否则 terragrunt 无法读取远程模块 - name: Setup Terraform uses: hashicorp/setup-terraform@v2 with: terraform_version: 1.5.7 - name: Setup Infracost run: | wget https://github.com/infracost/infracost/releases/download/v0.14.22/infracost-v0.14.22-linux-amd64.tar.gz tar -xzf infracost-v0.14.22-linux-amd64.tar.gz -C /tmp sudo mv /tmp/infracost /usr/local/bin/ - name: Terraform Init & Plan run: | terraform init -backend-config="key=${{ secrets.S3_STATE_KEY }}" terraform plan -out=tfplan - name: Run Infracost run: | infracost breakdown --path . --format json --out infracost.json infracost output --path infracost.json --format markdown --out infracost-report.md - name: Post Cost Report to PR uses: marocchino/sticky-pull-request-comment@v2 if: github.event_name == 'pull_request' with: header: '💰 Infrastructure Cost Estimate' message: | ## Cost Impact Summary ${{ secrets.INFRACOST_REPORT }} <details> <summary>Full Cost Breakdown</summary> $(cat infracost-report.md) </details>

关键细节:

  • fetch-depth: 0:Terraform 模块常从 Git 仓库引用(source = "git::https://github.com/org/module.git?ref=v1.0"),不设深度会导致init失败。
  • --format markdown:GitHub 原生渲染 Markdown,比 HTML 更友好。
  • sticky-pull-request-comment:保证报告始终更新在同一条评论里,不会刷屏。

注意事项:我们最初用actions/github-script直接 post comment,但遇到 rate limit 问题(GitHub API 每小时 5000 次)。换成sticky-pull-request-comment后,稳定性提升 100%。另外,secrets.INFRACOST_REPORT是我们预设的模板字符串,包含总成本、增量成本、高亮警告(如“检测到新增 3 个 m5.2xlarge,预计月增 $420”),让非技术人员也能快速抓重点。

4. 核心参数详解与精度控制:哪些数字可信,哪些要打问号

infracost输出的数字不是魔法,它依赖输入参数的准确性和价格源的完整性。下面拆解最关键的五个参数,告诉你它们怎么影响最终结果,以及如何校准。

4.1--usage-file:让估算从“理论值”变成“业务值”

默认情况下,infracost只算资源的“标称成本”。比如一个aws_ebs_volume,它只按size = 100type = "gp3"计算存储费用。但真实世界里,EBS 的成本还取决于:

  • IOPS 使用量gp3卷可单独配置 IOPS(3000 IOPS 起),超出部分按 $0.005/IOPS/月收费。
  • 吞吐量使用量gp3吞吐量可单独配置(125 MB/s 起),超出部分按 $0.04/MBps/月收费。
  • 快照频率:每天 1 个快照 vs 每周 1 个,备份存储成本差 7 倍。

这时就需要--usage-file。创建infracost-usage.yml

version: 0.2 resources: - name: aws_ebs_volume.my_volume monthlyQuantity: 730 # 730 hours = 24/7 运行 attributes: iops: 4000 # 实际配置的 IOPS throughput: 250 # 实际配置的 MBps snapshotCount: 30 # 每月快照数(按天备份) - name: aws_s3_bucket.logs monthlyQuantity: 730 attributes: storageGb: 500 # 当前存储量 monthlyDownloadGb: 200 # 月出口流量

infracost breakdown --usage-file infracost-usage.yml会把storageGbmonthlyDownloadGb注入 S3 成本计算,把iopsthroughput注入 EBS 成本计算。我们线上一个 Kafka 集群,初始估算 EBS 成本是 $120/月,加入usage-file后涨到 $380/月——因为iops: 8000触发了超额收费。这让我们提前申请了更高规格的io2卷,反而降低了单位 IOPS 成本。

4.2--currency--monthly-hours:区域与时间的双重校准

--currency USD很直观,但--monthly-hours是个隐藏关键点。默认值是730(30 天 × 24 小时),适用于 24/7 运行的生产实例。但很多场景不是:

  • CI/CD 构建节点:每天只运行 8 小时,--monthly-hours 240(30×8)
  • 数据处理作业:每周跑 3 次,每次 2 小时,--monthly-hours 24(3×4×2)
  • 开发环境:工作日 9-18 点,--monthly-hours 220(22 天 × 10 小时)

我们有个 Spark 作业集群,用--monthly-hours 730估算成本是 $1,200/月,改成--monthly-hours 120(每周 2 天 × 10 小时)后,降到 $197/月。这直接影响了我们是否用 Spot 实例的决策——Spot 实例中断风险高,但按需实例的闲置成本太高,最终我们选了on-demand+ 自动启停脚本。

4.3--terraform-plan-flags:穿透模块边界的秘密武器

Terraform 模块化是好习惯,但也带来成本估算的盲区。比如你有一个modules/networking,里面创建了aws_vpcaws_subnetaws_internet_gatewayinfracost breakdown --path .默认只分析 root module,子模块的资源成本不会计入。解决方案是:

terraform plan -out=tfplan -var-file=prod.tfvars infracost breakdown --path . --terraform-plan-flags "-var-file=prod.tfvars" --format json --out infracost.json

--terraform-plan-flags会把参数透传给terraform show,确保infracost解析的是完整 plan,包含所有模块。我们曾因漏掉这个参数,导致 VPC 的 NAT Gateway 成本($0.045/小时)被完全忽略,首月账单多出 $3,200。

4.4 价格源优先级:当官方定价和你的合同冲突时

infracost的价格源有严格优先级:

  1. --price-file指定的 JSON(最高优先级)
  2. --usage-file中的price字段(仅对指定资源)
  3. sync-price-data下载的本地价格库
  4. 官方 API(如果启用且网络可达)

这意味着你可以为关键资源强制覆盖价格。例如,你和 Azure 签了预留实例(RI)协议,承诺 1 年付 $12,000 换取 3 台Standard_D8s_v4的无限使用。那么在price-file中:

{ "service": "Microsoft.Compute", "region": "eastus", "productFamily": "Virtual Machines", "attributes": { "vmSize": "Standard_D8s_v4", "tier": "Standard", "operatingSystem": "Linux" }, "price": 0.0, "unit": "Hrs" }

price: 0.0表示该配置已由 RI 覆盖,成本为零。这样infracost就不会重复计算按需实例费用。我们用这招管理了 200+ 台预留实例,成本报告和实际账单误差 < 0.3%。

4.5 估算精度边界:哪些成本它算不准,你得自己补

infracost再强大也有局限,必须清楚它的能力边界:

  • 网络出口流量:它能算aws_nat_gateway的固定费用($0.045/小时),但无法预估aws_instance的出口流量($0.09/GB)。你需要结合历史监控(CloudWatchNetworkOut)估算。
  • API 调用费用aws_lambda的请求费用($0.20/1M 次)可算,但aws_dynamodbGetItem调用次数无法预估,得靠 APM 工具(如 DataDog)埋点统计。
  • 跨区域流量aws_s3同区域访问免费,但跨区域复制(replication_configuration)费用是 $0.01/GB,infracost不分析复制规则,需要人工检查。

我们的应对策略是:在infracost-report.md末尾加一个⚠️ Manual Review Required区域,列出所有需人工确认的成本项,并附上检查清单。比如:

- [ ] S3 Cross-Region Replication: Check `replication_configuration` blocks in s3.tf - [ ] Lambda Provisioned Concurrency: Confirm `provisioned_concurrent_executions` value - [ ] DynamoDB On-Demand Capacity: Verify `billing_mode = "PAY_PER_REQUEST"` is intentional

5. 常见问题与实战排障:那些让我熬夜到三点的坑

再完美的方案,落地时也会撞墙。下面是我和团队踩过的 7 个典型问题,每个都附带复现步骤、根本原因和一招解决法。不是教科书式罗列,是血泪经验。

5.1 问题:infracost breakdown报错Error: failed to parse plan file: invalid character '}' after top-level value

复现步骤

  • Terraform 1.5.7 +infracostv0.14.10
  • 运行terraform plan -out=tfplan
  • 运行infracost breakdown --path .

根本原因:Terraform 1.5 引入了新的 plan JSON 格式(增加planned_values.root_module.child_modules字段),而infracostv0.14.10 的 JSON 解析器未适配,遇到新字段直接 panic。

解决方法

  • 升级infracost到 v0.14.15+(官方修复了此问题)
  • 或降级 Terraform 到 1.4.6(不推荐,放弃新特性)
  • 终极保险:在 CI 脚本中加版本校验:
    infracost_version=$(infracost version | cut -d' ' -f2) terraform_version=$(terraform version | head -1 | cut -d' ' -f2 | tr -d 'v') if [[ "$(printf '%s\n' "$infracost_version" "$terraform_version" | sort -V | tail -n1)" != "$infracost_version" ]]; then echo "Infracost version $infracost_version may not support Terraform $terraform_version" exit 1 fi

5.2 问题:成本报告里显示$0.00,但资源明明在创建

复现步骤

  • 新建一个aws_s3_bucket,未设置bucket_versioningserver_side_encryption_configuration
  • infracost breakdown --path .输出:
    Name: aws_s3_bucket.my_bucket Type: Storage Monthly Cost: $0.00

根本原因infracost的价格库默认只覆盖“有附加功能”的 S3 成本。基础存储($0.023/GB)需要storage_gb参数,而aws_s3_bucket资源本身不暴露存储量。它只计算版本控制($0.002/1000 objects)、SSE-KMS($0.03/10000 calls)等显式功能。

解决方法

  • --usage-file中强制注入storageGb
    resources: - name: aws_s3_bucket.my_bucket monthlyQuantity: 730 attributes: storageGb: 50 # 预估初始容量
  • 或用infracost--include-all参数(v0.14.18+),它会尝试推断基础存储成本。

5.3 问题:infracost output --format html生成的页面空白

复现步骤

  • infracost breakdown --path . --format json --out infracost.json
  • infracost output --path infracost.json --format html --out report.html
  • 打开report.html,页面一片空白,控制台报错Uncaught ReferenceError: require is not defined

根本原因infracost output --format html生成的是 Electron 应用打包的静态页面,依赖 Node.js 环境。在纯浏览器中打开会失败。

解决方法

  • 正确用法:用infracost serve --path infracost.json启动本地服务(http://localhost:8080),它会自动打开浏览器。
  • CI 场景:改用--format markdown--format json,Markdown 可直接嵌入 PR,JSON 可供其他工具解析。
  • 绝对不要:把report.html当普通网页发给同事。

5.4 问题:Terragrunt 项目infracost找不到模块

复现步骤

  • Terragrunt 项目结构:
    . ├── prod/ │ ├── terragrunt.hcl # include "root" { path = find_in_parent_folders() } │ └── s3/ │ └── terragrunt.hcl # include "root" { path = find_in_parent_folders() } └── terragrunt.hcl # remote_state config
  • prod/s3/目录下运行infracost breakdown --path .,报错no Terraform files found

根本原因infracost只扫描.tf文件,不识别terragrunt.hcl。Terragrunt 会生成.terragrunt-cache/xxx/xxx/main.tf,但infracost不会自动去那里找。

解决方法

  • prod/s3/目录下先运行terragrunt init(生成 cache),再运行:
    infracost breakdown --path .terragrunt-cache/*/ --usage-file ../infracost-usage.yml
  • 更优方案:用 Terragrunt 官方插件terragrunt-infracost,它会自动处理 cache 路径。

5.5 问题:infracost估算的 RDS 成本比 AWS Console 高 30%

复现步骤

  • 创建aws_db_instanceengine = "mysql"instance_class = "db.t3.small"
  • infracost报告:$22.50/月
  • AWS Console Pricing Calculator:$17.20/月

根本原因infracost默认按“按需实例”(On-Demand)计价,而 Pricing Calculator 默认勾选了“通用型(General Purpose)”和“单可用区(Single-AZ)”,但infracost的价格库可能包含了 Multi-AZ 溢价(+100%)。

解决方法

  • 检查infracost list-projects输出,确认db.t3.smallattributes是否含"multiAz": "True"
  • --usage-file中显式指定:
    resources: - name: aws_db_instance.my_db attributes: multiAz: "False" # 强制单可用区
  • 或用--price-file覆盖为单可用区价格。

5.6 问题:CI 中infracost sync-price-data超时失败

复现步骤

  • GitHub Actions 运行infracost sync-price-data
  • 日志显示timeout: failed to connect to github.com port 443

根本原因:GitHub Actions 默认 runner 无外网权限(尤其企业版),或网络策略拦截。

解决方法

  • 推荐:在 CI 之前手动运行infracost sync-price-data,将~/.infracost/prices.json提交到代码库,CI 直接用--price-file加载。
  • 备选:用actions/cache缓存价格数据:
    - name: Cache Infracost Prices uses: actions/cache@v3 with: path: ~/.infracost/prices.json key: infracost-prices-${{ hashFiles('**/infracost-*.yml') }}

5.7 问题:infracost不支持自定义模块中的资源

复现步骤

  • 你写了modules/my-custom-eks/,里面用null_resource+local-exec部署了自定义组件
  • infracost breakdown --path .完全忽略这个模块

根本原因infracost只识别 Terraform 官方 provider(aws_*,azurerm_*,google_*)和少数开源 provider(random_*,tls_*)。null_resource是 Terraform 内置资源,但infracost不为其赋价(因为它不产生云费用)。

解决方法

  • 如果null_resource触发了外部 API 调用(如调用付费 SaaS),在--usage-file中手动添加:
    resources: - name: null_resource.saa_api_call monthly

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询