Infracost v2.18.2 配置参数详解
详解 Infracost v2.18.2 配置面:全局与 scan/diff/inspect 参数表、infracost.yml autodetect/projects 全参数、模板语法与 CI/CD 集成(GitHub App 门禁),附 monorepo 生产配置模板。
Infracost v2.18.2 配置参数详解
目标:系统梳理 Infracost CLI v2.18.2 的全部配置面——命令行参数(全局 flags 与 scan/diff 专属 flags)、
infracost.yml仓库配置文件(autodetect/projects 两大块与模板语法)、CI/CD 集成配置,并给出可直接落地的 monorepo 生产配置模板。所有 flags 与回显均在 Ubuntu 24.04 + Infracost 2.18.2 实测取得;infracost.yml参数说明经官方 Config file 文档实查(2026-10-25)并与本机 CLI 行为交叉核对。
一、环境信息
| 项目 | 取值 |
|---|---|
| 操作系统 | Ubuntu 24.04 LTS(x86_64) |
| CLI 版本 | Infracost 2.18.2(官方最新稳定版,2026-10-22 发布) |
| CLI 位置 | /usr/local/bin/infracost |
| 演示工程 | /root/demo-terraform(单 AWS provider 项目,含 1 台 t3.medium EC2 与 1 个 S3 桶) |
| 全局缓存目录 | ~/.cache/infracost(插件、扫描结果、解析缓存) |
| 凭据目录 | 用户配置目录(由 infracost auth login 写入) |
| 官方配置文档 | https://www.infracost.io/docs/config_file(2026-10-25 实查) |
安装与凭据初始化方法见《Infracost v2.18.2 安装指南》;本文所有子命令的完整参数面与实测回显见《Infracost v2.18.2 常用 CLI 命令详解》。
二、前置条件
- 已按安装指南完成 CLI 安装(
infracost --version回显 2.18.2); - 已执行
infracost auth login(或 device flow)落盘凭据——v2 的扫描/组织类命令在无凭据时直接拦截进入登录引导,配置文件解析发生在凭据校验之后(本机实测:在演示工程放置一个故意写坏的infracost.yml后执行infracost scan,输出仍是登录引导 URL 而非 YAML 报错); - 理解本文配置示例的载体:一个 Terraform 工程
/root/demo-terraform,main.tf内容:
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.medium"
tags = {
Name = "infracost-demo-web"
}
}
resource "aws_s3_bucket" "logs" {
bucket = "infracost-demo-logs-q1w2e3r4"
}
三、参数查看与修改方式
Infracost v2 的配置分四个层次,优先级从高到低(云端 Org/Repo 设置高于仓库内文件,来源:官方 Config file 文档 Source Control Integrations 节,2026-10-25 实查):
| 层次 | 载体 | 查看方式 | 典型用途 |
|---|---|---|---|
| ① 命令行 flags | infracost <命令> --flag | infracost --help / infracost <命令> --help | 单次运行覆盖(输出格式、组织、币种) |
| ② 仓库配置文件 | 仓库根 infracost.yml(静态)或 infracost.yml.tmpl(模板) | 直接读文件;infracost scan --json 可核对 CLI 实际使用的项目清单 | 多项目/多环境/monorepo 的项目映射 |
| ③ 云端 Org/Repo 设置 | Infracost Cloud 控制台 Org Settings > Default Repo Config File / Repo Settings | 控制台查看 | 组织统一配置,仓库内文件可覆盖 |
| ④ 凭据与本地状态 | 用户配置目录 + ~/.cache/infracost | infracost auth whoami / infracost cache info / infracost doctor | 登录态、缓存治理 |
安装健康与配置合法性自查(实测回显):
infracost doctor
Infracost Doctor 2.18.2 - running 7 checks
Authentication
✗ No credentials found
→ Run `infracost auth login` to authenticate
⊘ Token valid
→ skipped (No credentials found)
⊘ Organization accessible
→ skipped (No credentials found)
⊘ API reachable
→ skipped (Organization accessible)
CLI
✔ Version 2.18.2 (latest)
Configuration
✔ Config file valid
! Default org set
→ No organization data available
✔ 2 passed ! 1 warning ✗ 1 issue ⊘ 3 skipped
Run infracost doctor --fix to attempt auto-remediation
Info: 1 health check(s) failed
Configuration → Config file valid 即配置自检项;完成登录后复跑,凭据四项会依次点亮为 ✔。
⚠️ 环境变量边界(重要):v2 不再读取
INFRACOST_API_KEY环境变量——本机以INFRACOST_API_KEY=<任意值> infracost doctor实测,凭据检查项仍报No credentials found。v0.x 时代「export 一个 API key 走天下」的用法在 v2 失效,凭据唯一来源是infracost auth loginOAuth 落盘(CI 场景由官方集成注入访问令牌)。
四、命令行参数详解(实测全景)
4.1 全局 flags(所有子命令共享)
来源:infracost --help 实测回显,默认值照抄:
| 参数 | 默认值 | 说明 |
|---|---|---|
--access-token-use-cache | true | 读取并缓存访问令牌;设为 false 强制全新登录 |
--debug | 关 | 开启调试日志,排障首选 |
--json | 关 | 命令结果与日志以 JSON 输出(可管道消费) |
--llm | 关 | 输出 token 紧凑格式,面向 LLM 管道 |
--no-color | 关 | 关闭彩色输出(重定向日志时建议开启) |
--oauth-use-device-flow | 关 | 登录改用 device flow(无浏览器服务器必备) |
--org string | 空 | 指定组织 slug/ID(多组织账号切换扫描上下文) |
-h, --help | — | 帮助 |
-v, --version | — | 版本号 |
4.2 scan 专属 flags
来源:infracost scan --help 实测回显:
| 参数 | 默认值 | 说明 |
|---|---|---|
[path] 位置参数 | 当前目录 | 要扫描的工程路径,如 infracost scan ./terraform |
--currency string | 空(按账号默认) | ISO 4217 币种(USD/EUR/GBP…),改估算展示币种 |
--include-warnings | 关 | 摘要中同时显示 warning 级诊断 |
-o, --option stringArray | 空 | 插件专属选项,形如 -o infracost/terraform.option=yes |
--ssh-key-file string | 标准的 ~/.ssh 密钥 | 拉取私有 Terraform module 时使用的 SSH 私钥(逗号分隔多个) |
示例(实测参数解析正常;未登录时输出为登录引导,说明 flags 校验先于业务执行):
cd /root/demo-terraform
infracost scan --currency EUR --no-color --include-warnings
Please go to the following URL to log in:
https://login.infracost.io/authorize?audience=https%3A%2F%2Fdashboard.api.infracost.io&client_id=uMF6vrdl42thCHGI6Os6UqMqr2Px412O&code_challenge=I0Ni4aEh--8GaBEqVadEIu6tsGO8CibMJCja5tGxw2o&code_challenge_method=S256&icSource=cli&redirect_uri=http%3A%2F%2Flocalhost%3A26372%2Fcallback&response_type=code&scope=offline_access+orgs%3Aread+policies%3Aread+prices%3Aread+runs%3Awrite&state=veN1_upKSK2H89p0cqc3ZQ%3D%3D
Press Enter to open the browser automatically...
4.3 diff 专属 flags
来源:infracost diff --help 实测回显:
| 参数 | 默认值 | 说明 |
|---|---|---|
[path] 位置参数 | 当前目录 | 被比较的工程路径 |
--compare-to string | 该路径最近一次缓存扫描 | 基线 JSON 文件路径(用 infracost scan --json > infracost-base.json 生成) |
--currency string | 空 | 同 scan |
-o, --option stringArray | 空 | 同 scan |
--ssh-key-file string | 同 scan | 同 scan |
官方示例流(--help 示例原文):
infracost scan --json > infracost-base.json
infracost diff --compare-to infracost-base.json
4.4 inspect 查询参数
infracost inspect 消费最近一次扫描的缓存结果,参数最丰富(完整示例与回显见命令篇)。常用参数速览(实测 --help):--summary(总览)、--top N(最贵资源)、--top-savings N(最省钱修复点)、--total-savings(年化节省合计)、--missing-tag key(缺失标签)、--invalid-tag key(非法标签值)、--min-cost/--max-cost(成本阈值)、--filter(组合过滤)、--group-by(分组维度)、--fields(列投影)、--addresses-only(仅地址)、--file(读 JSON 文件跳过缓存)、--diagnostics(按项目诊断)。
五、infracost.yml 配置文件详解
infracost.yml 解决的核心问题:一个仓库里有多个 Terraform 项目/环境时,告诉 CLI 每个项目在哪、用哪些变量文件。文件放仓库根,scan 运行时自动发现(官方文档:infracost scan auto-discovers either file when it runs from the repo root)。
5.1 三种配置方式
官方给三种方式(按仓库复杂度选择,来源:Config file 文档 Overview,2026-10-25 实查):
方式一:auto-detect 定制(自动探测 + 提示词)——大部分场景首选,只写「提示」修正自动探测:
version: 0.1
autodetect:
env_names:
- dev
- qual
- prod
exclude_dirs:
- legacy
方式二:静态配置文件——结构固定的小仓库,逐项目手写:
version: 0.1
projects:
- path: infra
name: dev
terraform_var_files:
- ../environment/dev.tfvars
- path: infra
name: qual
terraform_var_files:
- ../environment/qual.tfvars
- path: infra
name: prod
terraform_var_files:
- ../environment/prod.tfvars
方式三:高级模板(infracost.yml.tmpl)——项目频繁增减的动态 monorepo,模板按目录树展开(Golang text/template 语法):
version: 0.1
projects:
{{- range $project := matchPaths "environment/:env.tfvars" }}
{{- if eq $project.env "legacy"}}
{{- continue }}
{{- end }}
- path: .
name: {{ $project.env }}
terraform_var_files:
- {{ $project._path }}
{{- end }}
模板展开后等价于静态配置(environment/ 下每个 <env>.tfvars 生成一个项目,legacy 被排除);模板文件本身入库,无需提交渲染产物。
5.2 autodetect 块参数表
来源:官方 Config file 文档 Auto-detect parameters 节(2026-10-25 实查):
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
env_names | 字符串数组 | 自动推断 | 用于分组 Terraform var 文件的环境名清单(如 dev/qual/prod) |
exclude_dirs | 字符串数组 | 空 | 从项目探测中排除的目录(旧基建、测试目录) |
include_dirs | 字符串数组 | 空 | 强制纳入扫描的目录(确保被探测到) |
path_overrides | 对象数组 | 空 | 按环境×目录组合自定义包含/排除规则 |
max_search_depth | 整数 | 10 | 项目搜索的最大目录深度 |
force_project_type | 字符串 | 空 | 强制把探测到的项目归类为 terraform 或 terragrunt(两类并存冲突时用) |
terraform_var_file_extensions | 字符串数组 | .tfvars 系 | 识别 var 文件的后缀(非标准命名时用) |
5.3 projects 块参数表
来源:官方 Config file 文档 Static config file project parameters 节(2026-10-25 实查):
| 参数 | 类型/默认 | 说明 |
|---|---|---|
path | 字符串,必填 | Terraform 目录,相对运行目录;同一路径可重复声明(不同 var 文件即不同项目) |
name | 字符串,默认取代码路径/workspace/模块名 | 项目名,出现在 PR 评论、CLI 输出与 Infracost Cloud |
terraform_var_files | 字符串数组 | 类似 -var-file;.auto.tfvars 自动加载无需列出;路径相对项目 path |
terraform_vars | 字符串映射 | 类似 -var 的内联变量 |
dependency_paths | 字符串数组 | 仅 GitHub/Azure Repos/GitLab App 用户:声明哪些文件/目录变更才触发该项目估算(支持 glob);声明后 path 本身变更不再触发,除非包含在内 |
usage_file | 字符串 | Infracost usage 文件路径(为按用量计费资源提供用量假设) |
exclude_paths | 字符串数组 | 项目 path 内要排除的子路径(支持 glob) |
include_all_paths | 布尔,默认 false | true 时把根模块与非根模块都纳入估算(最深 10 层) |
skip_autodetect | 布尔,默认 false | true 时把顶层目录当单一项目,不再自动探测子项目 |
env | 字符串映射 | 传给项目处理的进程环境变量,支持 ${MY_ENV_VAR} 引用既有变量;注意 INFRACOST_ 前缀变量是全局的,不能用在这里 |
terraform_workspace | 字符串 | 仅多 workspace 仓库设置(否则可能报 workspaces not supported) |
terraform_cloud_workspace | 字符串 | Terraform Cloud/Enterprise 用户:本地与云端 workspace 名不一致时设置 |
terraform_cloud_org | 字符串 | Terraform Cloud/Enterprise 组织 |
yor_config_path | 字符串 | Yor 用户的配置文件路径(标签治理时纳入 Yor 标签值);YOR_SIMPLE_TAGS 环境变量会自动并入 |
5.4 模板语法要点
模板基于 Golang text/template(与 Helm 同源),核心要素(官方文档 Advanced config template syntax 节,2026-10-25 实查):
- 动作定界符
{{ }},{{- }}裁剪空白;支持if/else if/else、and/or/ne/eq逻辑; range+matchPaths:matchPaths "environment/:env.tfvars"返回目录树中所有匹配项,逐项展开为项目;:env是捕获段,以$project.env访问,$project._path为捕获文件的完整路径;- 全局变量:
.RepoName(仓库名)、.Branch(当前分支)、.DetectedRootModules(自动探测的根模块及其 projects)、.DetectedProjects(探测项目的简化视图:Name/Path/TerraformVarFiles/DependencyPaths/Env)。
六、CI/CD 集成配置
6.1 两种集成模式
官方 CI/CD 集成(来源:官网 Integrations 文档,2026-10-25 实查)分两类:
| 模式 | 形态 | 维护成本 | 适用 |
|---|---|---|---|
| 托管 GitHub App | Infracost 官方基础设施运行,GitHub Marketplace 安装,自动发 PR 评论、自动开修复 PR(AutoFix)、只跑变更目录 | 零(无需在 CI 装/升级 CLI) | GitHub/GitHub Enterprise Cloud 的组织首选 |
| 自管 CI 集成 | GitHub Actions/GitLab CI/Azure DevOps/Bitbucket 流水线内运行 CLI | 需维护 CLI 版本与凭据 | 无 GitHub App 条件或自建 GitLab 等场景 |
6.2 GitHub App 配置链路(官方 Usage 步骤,实查 2026-10-25)
- 登录 Infracost Cloud(dashboard.infracost.io,免费试用无需信用卡),每个账号自带个人默认组织;给公司用先在组织下拉中新建组织;
- Org Settings > Integrations > GitHub 按向导选择要授权的仓库(App 仅需 PR 写权限用于发评论/开修复 PR,其余为只读;官方列有完整权限清单与「Infracost (Limited)」受限版);
- 需要定制运行方式时,加
infracost.yml/infracost.yml.tmpl配置文件(优先级:Org 默认配置 < Repo Settings < 仓库内文件——仓库内文件仅在云端未配置时生效); - 向仓库发一个 PR 即可在 PR 中看到成本差、FinOps 与标签问题;合并后 Infracost Cloud 记录合并时间/审批人/合并人;
- 门禁:在策略设置开启「Require approval before merging」后,Infracost 会对违规 PR 返回 failed status check;再在 GitHub 侧用 Ruleset(推荐,组织级)或分支保护规则把名为
Infracost(注意大写 I)的 check 设为 Required,即可实现「策略不过不准合并」; - PR 评论区可
@infracost help获取 dismiss/snooze 指引(紧急变更可搁置违规项,Infracost 相应返回 passed 解锁); - 从 GitHub Actions 迁移到 App(官方迁移清单):装 App → 发测试 PR 验证 → 从工作流中删除原 Infracost steps。
网络放行(GitHub Enterprise Cloud IP 白名单场景,官方实查值):入站放行 3.133.40.66、3.16.104.91、3.147.121.170、3.141.214.65、18.221.82.195、18.119.42.142(443 端口);出站放行 dashboard.api.infracost.io:443(按 IP 时为 52.223.24.69、76.223.127.201)。
6.3 自管 CI 集成的配置要点
自管模式在流水线里运行 CLI,配置要点(对应命令均在本机实测其帮助与形态):
- 凭据:CI 机器无法交互登录,使用官方 CI 集成的访问令牌注入(GitHub App/云平台生成的 token 走环境变量注入通道;本地交互登录是
infracost auth login,见安装指南十、1); - 步骤:安装 CLI(Docker 镜像
infracost/infracost或安装脚本)→ 凭据注入 → 仓库根执行infracost scan(自动发现infracost.yml/infracost.yml.tmpl,官方文档原文:Infracost scan auto-discovers either file when it runs from the repo root)→ 输出 JSON 供后续步骤消费; - 基线 diff:把主干扫描 JSON 存为构建产物,PR 里
infracost diff --compare-to <基线 JSON>; - 辅助命令:
infracost ci setup(实测:ci命令族仅含 setup 子命令,用于给当前仓库生成 CI 集成配置)、infracost org current/org switch(多组织流水线切换扫描上下文)。
七、生产配置模板
适用于「单仓多环境 Terraform monorepo、AWS 主力、需纳入云组织统一策略」的典型生产形态(以 8GB 内存通用 CI runner 为基准;Infracost 为一次性执行进程,无驻留内存占用,插件与缓存合计磁盘占用约百 MB 级):
# /path/to/repo/infracost.yml —— 生产 monorepo 模板
version: 0.1
autodetect:
# 环境清单:目录树下凡匹配 <路径>/<环境>.tfvars 即生成对应项目
env_names:
- dev
- staging
- prod
# 排除历史遗留与实验目录
exclude_dirs:
- legacy
- .terraform
# 探测深度:目录层级深的 monorepo 适当调大
max_search_depth: 10
# 仓库同时存在 terragrunt 与 terraform 时避免类型误判
# force_project_type: terragrunt
projects:
# 主基建:同一 path 以不同 var 文件声明三个环境项目
- path: infra
name: infra-dev
terraform_var_files:
- ../environments/dev.tfvars
- path: infra
name: infra-staging
terraform_var_files:
- ../environments/staging.tfvars
- path: infra
name: infra-prod
terraform_var_files:
- ../environments/prod.tfvars
# 用量敏感项目:挂 usage 文件提升按用量资源(S3/CloudWatch 等)估算精度
- path: infra
name: infra-prod-usage
terraform_var_files:
- ../environments/prod.tfvars
usage_file: ../environments/prod-usage.yml
# GitHub App 用户:只有这些路径变更才触发该项目估算
dependency_paths:
- infra/**
- environments/prod.tfvars
逐项说明:
env_names+exclude_dirs:修正自动探测——补齐staging(否则只被识别 dev/prod 的常见问题)并排除legacy(官方示例同款场景);- 三个环境项目显式声明:
name落到 PR 评论里的项目名,评审时一眼分清环境;.auto.tfvars无需列入terraform_var_files(自动加载); usage_file:Infracost 的 usage 文件以 YAML 提供月均请求量/存储量等假设值,未提供时按典型默认用量估算(估算口径差异见 A1 篇限制章节);dependency_paths:控制 GitHub App 触发范围,减少无效扫描;设置后path自身变更不再触发(官方参数说明原文),故把infra/**一并列入;- 敏感值:
env块可引用${MY_ENV_VAR}形式的既有环境变量传入(如私有 module 的访问令牌),不要把密钥明文写进infracost.yml。
配置生效验证:
cd /path/to/repo
infracost scan --json | python3 -m json.tool | grep -m 5 '"name"'
(scan --json 输出包含 CLI 实际使用的项目清单,官方文档指定的核对方式;登录后执行。)
八、常见问题(FAQ)
Q1:infracost.yml 放了但没生效?
三查:文件是否在运行 infracost scan 的工作目录(仓库根);文件名是 infracost.yml 还是模板 infracost.yml.tmpl(模板按当前目录树展开,展开失败不报错、表现为项目清单为空);是否被云端 Org/Repo 设置覆盖(云端配置优先,仓库文件只在云端未配置时生效——官方优先级规则)。
Q2:坏 YAML 为什么不报错,直接让我登录?
v2 的凭据校验先于配置解析(本机实测:坏 YAML 下 infracost scan 输出登录引导 URL)。登录后重新执行即可看到 YAML 语法报错;infracost doctor 的 Config file valid 项可作健康信号。
Q3:同一路径多个环境怎么配?
projects 里重复声明同一 path、不同 name 与 terraform_var_files(五、1 方式二即官方示例原样结构)。不要用 env 块传 INFRACOST_ 前缀变量(官方明确其全局作用域,禁止在项目级使用)。
Q4:Terragrunt 和 Terraform 混在一个仓库,探测类型来回跳?
autodetect.force_project_type 强制归类(terraform 或 terragrunt 二选一,官方参数)。
Q5:CI 里没有浏览器,登录怎么办?
CI 不走交互登录:用官方 CI 集成的访问令牌注入(6.2/6.3);本地无浏览器的开发机用 infracost auth login --oauth-use-device-flow(实测输出 https://login.infracost.io/activate + 设备码)。
Q6:--llm 和 --json 有什么区别?
--json 是完整结构化输出(脚本消费);--llm 是 token 紧凑格式(LLM 管道/代理消费,代价是丢掉部分冗余字段)。两者均为全局 flags,可叠加 inspect --summary 等查询命令。
Q7:私有 Terraform module 拉取失败?
配置 --ssh-key-file 指向可访问私有仓库的 SSH 私钥(默认已尝试标准 ~/.ssh 密钥);CI 场景把私钥落为构建机密钥文件再传入。GitHub App 用户另见官方 Source control integrations 的私有模块章节。
九、参考链接
- Config file 官方参考(本文 5.x 参数表来源):https://www.infracost.io/docs/config_file
- 官方 Getting Started:https://www.infracost.io/docs/
- GitHub App 集成(本文 6.2 来源):https://www.infracost.io/docs/integrations/github_app/
- Source control 集成总览:https://www.infracost.io/docs/integrations/source_control/
- Usage-based resources(usage 文件):https://www.infracost.io/docs/features/usage_based_resources
- Auto-fix PR 博客:https://www.infracost.io/blog/ai-for-finops-fix-cloud-cost-issues-faster/
- CLI 仓库:https://github.com/infracost/cli