Terraform AWS Provider 数据源 `aws_budgets_budget` 完全指南:查询 AWS Budgets 预算配置的实战与源码解析
Terraform AWS Provider 数据源aws_budgets_budget完全指南查询 AWS Budgets 预算配置的实战与源码解析【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws本文围绕 terraform-provider-aws 中的aws_budgets_budget数据源展开完整讲解如何通过 Terraform 读取现有 AWS Budgets 预算的名称、预算限额、成本类型、通知订阅、自动调整参数等全部配置信息。读完本文你将掌握该数据源的参数与属性全貌、嵌套对象的含义并理解其底层读取逻辑含budget_exceeded判定、账号默认值、重试机制与标签支持能够在真实项目中正确编写和引用该数据源。一、数据源概述aws_budgets_budget是 terraform-provider-aws 提供的 Web Services BudgetsAWS 成本管理服务数据源用于读取而非创建一个已存在的 AWS Budget 预算对象。它与管理资源aws_budgets_budget成对出现资源负责创建/更新/删除预算数据源负责查询预算的当前状态与完整配置供其他资源或输出引用。从源码注释可以确认其注册方式在 budget_data_source.go 中通过// SDKDataSource(aws_budgets_budget, nameBudget)与// Tags(identifierAttributearn)两个生成注解声明前者将该类型注册为 SDK v2 数据源后者声明其标签以 ARN 为标识属性即数据源可读取并导出预算的标签信息。数据源的典型价值在于引用既有预算配置当预算由控制台、CLI 或他人创建或用 Terraform 之外的流程管理时可通过数据源把真实配置引入状态避免重复定义。跨资源联动读取预算的budget_exceeded、calculated_spend等动态状态用于告警、报表或条件化输出。跨账号查询通过account_id读取指定账号下的预算需相应 IAM 权限。二、快速上手基本用法最基础的使用方式是把数据源直接挂在同名的aws_budgets_budget资源之后通过资源属性引用预算名称data aws_budgets_budget test { name aws_budgets_budget.test.name }这一写法与仓库中 testdata/tmpl/budget_data_source.gtpl 及 testdata/Budget/data.tags/main_gen.tf 中的测试配置一致也是官方文档中的标准示例。在验收测试 budget_data_source_test.go 中配套的测试资源使用了RI_UTILIZATION预留实例利用率预算类型resource aws_budgets_budget test { name test-budget-name budget_type RI_UTILIZATION limit_amount 100.0 limit_unit PERCENTAGE time_unit QUARTERLY cost_filter { name Service values [Amazon Redshift] } tags { key1 value1updated } }该测试随后用data aws_budgets_budget读取资源名称并校验了account_id、name、calculated_spend.#、budget_limit.#、billing_view_arn、标签数量等多个属性说明这些属性都是经过真实 AWS API 验证的可靠字段。三、参数Argument Reference数据源的参数用于定位要查询的预算对象全部参数如下必填参数name- 预算名称在账号内唯一。数据源通过该名称精确定位预算。可选参数account_id- 目标预算所属账号的 ID。省略时默认使用当前凭证对应的账号 ID。这一点在源码中有直接体现读取函数中使用cmp.Or(d.Get(names.AttrAccountID).(string), c.AccountID(ctx))进行取值见 budget_data_source.go即配置了 account_id 就用它否则回退到客户端当前账号 ID。name_prefix- 预算名称的前缀。数据源内部通过create.Name(ctx, name, name_prefix)将name与name_prefix合并为最终查询名称二者可以组合使用。name与name_prefix本质上服务于同一目标二选一即可管理资源 schema 中对二者设置了ConflictsWith互斥约束数据源沿用相同语义。四、属性Attribute Reference除上述参数外数据源还导出以下只读属性覆盖 AWS Budgets API 中Budget对象的几乎全部字段属性类型/含义auto_adjust_data对象包含自动调整预算AutoAdjustData的参数决定自动调整型预算的金额。billing_view_arn账单视图Billing View的 ARN。budget_exceeded布尔值标识该预算是否已被超出实际花费超过预算限额。budget_limit预算限额对象包含 Spend 的金额与单位即你希望追踪的成本/用量/RI 利用率/RI 覆盖/节省计划利用率/节省计划覆盖额度。budget_type预算类型标识预算是追踪货币成本还是用量如COST、USAGE、RI_UTILIZATION等。calculated_spend与预算关联的花费对象包含 actualSpend已使用量与 forecastedSpend基于历史用量预测的预期花费。cost_filterCostFilter 名称/值对的列表即应用于预算的成本过滤器。cost_typesCostTypes 对象定义预算中包含的成本类型如税、订阅等。notificationBudget Notification 对象可多次出现以定义多个预算通知。planned_limitPlanned Budget Limits 对象可多次出现以规划多个预算限额。tags分配给该资源的标签映射。数据源 schema 使用tftags.TagsSchemaComputed()声明表示该属性为计算只读属性直接返回 AWS 侧的真实标签。time_period_end预算覆盖时间段的结束时间无结束日期限制。格式2017-01-01_12:00。time_period_start预算覆盖时间段的开始时间若未指定AWS 默认使用所选时间周期的起始时刻。开始时间必须早于结束时间。格式2017-01-01_12:00。time_unit预算重置实际/预测花费的周期长度。合法值MONTHLY、QUARTERLY、ANNUALLY、DAILY。arn预算的 ARN由源码中的budgetARN(ctx, c, accountID, budgetName)基于账号与预算名构造同时是标签的标识属性。值得注意的是time_period_end在管理资源 schema 中的默认值为2087-06-15_00:00见 budget.go即长期有效的远期间接默认time_period_start则默认为所选时间周期的开始时刻。budget_exceeded 的实现原理budget_exceeded并非 AWS API 直接返回的字段而是数据源内部计算得出。在 budget_data_source.go 的读取逻辑中当CalculatedSpend.ActualSpend存在且实际花费的单位与预算限额单位一致时将BudgetLimit.Amount与ActualSpend.Amount分别解析为浮点数进行比较若预算限额 实际花费则budget_exceeded true否则为false若单位不一致或缺少花费数据则维持初始值false。这意味着该属性适合作为预算是否超支的快速判断依据在 CI 检查、条件输出等场景中非常实用。五、嵌套对象详解Spend花费对象budget_limit、actual_spend、forecasted_spend等字段内部都是 Spend 对象包含两个属性amount- 与预算预测、实际花费或预算阈值关联的成本/用量金额。长度约束最小1最大2147483647字符串形式。unit- 金额的计量单位如 USD、GBP 等。长度约束最小1最大2147483647。源码中通过flattenSpend将 AWS SDK 的awstypes.Spend展平为{amount, unit}结构flattenCalculatedSpend则把awstypes.CalculatedSpend展平为{actual_spend: [...]}见 budget_data_source.go。注意数据源导出的calculated_spend目前仅包含actual_spend子块。Actual Spend实际花费已使用的成本、用量、RI 单元或节省计划单元数量。类型为 Spend与budget_exceeded的判定直接相关。Forecasted Spend预测花费基于历史用量特征预测的成本、用量、RI 单元或节省计划单元数量。类型同样为 Spend。Auto Adjust Data自动调整数据定义自动调整型预算金额的参数auto_adjust_type必填- 定义预算基于历史数据还是预测数据自动调整。合法值FORECAST、HISTORICAL。historical_options可选- Historical Options 配置块。当auto_adjust_type为HISTORICAL时必须提供用于定义自动调整预算所依据的历史数据。last_auto_adjust_time可选- 预算最近一次被自动调整的时间。在管理资源 schema 中auto_adjust_data为MaxItems: 1的列表块auto_adjust_type通过enum.Validate[awstypes.AutoAdjustType]()校验取值historical_options.budget_adjustment_period的取值范围被限制在 160validation.IntBetween(1, 60)这些约束同样适用于理解数据源返回值的含义。Historical Options历史选项budget_adjustment_period必填- 参与移动平均计算的预算周期数用于确定自动调整后的预算金额。lookback_available_periods可选- 描述BudgetAdjustmentPeriod中有多少个预算周期参与了当前预算限额的计算。若某周期无成本数据则该周期不计入平均。该值不可手动设置由 AWS 根据budget_adjustment_period与历史成本数据自动计算在数据源与资源 schema 中均为Computed属性。Budget Notification预算通知notification对象的合法键与aws_budgets_budget管理资源的 notification 块字段一一对应comparison_operator必填- 用于评估条件的比较运算符。合法值LESS_THAN、EQUAL_TO、GREATER_THAN。threshold必填- 触发通知的阈值。schema 类型为TypeFloat支持小数如 80.5。threshold_type必填- 阈值类型。合法值PERCENTAGE百分比或ABSOLUTE_VALUE绝对值。notification_type必填- 针对哪种预算值通知。合法值ACTUAL实际值或FORECASTED预测值。subscriber_email_addresses可选- 接收通知的 E-Mail 地址集合。与subscriber_sns_topic_arns至少二选一。subscriber_sns_topic_arns可选- 接收通知的 SNS 主题 ARN 集合。与subscriber_email_addresses至少二选一。注意在管理资源 schema 中subscriber_sns_topic_arns的元素还带有verify.ValidARN校验确保必须是合法 ARN 格式。Cost Filter成本过滤器根据预算类型可选择以下一个或多个预算过滤器维度PurchaseType、UsageTypeGroup、Service、Operation、UsageType、BillingEntity、CostCategory、LinkedAccount、TagKeyValue、LegalEntityName、InvoicingEntity、AZ、Region、InstanceType每个过滤器是一个{name, values}对。在数据源 schema 中cost_filter为TypeSet结构其values为字符串列表。更详细的过滤器语义可参考 AWS 官方 CostFilter 文档AWS 成本管理用户指南中的创建预算过滤器章节。Cost Types成本类型cost_types对象的合法键决定预算中包含哪些成本构成。数据源返回的值即预算创建时设置的实际值管理资源中的默认值也列在括号中供对照include_credit- 是否包含信用额度默认true。include_discount- 是否包含折扣默认true。include_other_subscription- 是否包含其他订阅成本默认true。include_recurring- 是否包含经常性成本默认true。include_refund- 是否包含退款默认true。include_subscription- 是否包含订阅费用默认true。include_support- 是否包含支持费用默认true。include_tax- 是否包含税费默认true。include_upfront- 是否包含预付成本默认true。use_amortized- 是否使用摊销费率默认false。use_blended- 是否使用混合成本默认false。这些默认值均可在管理资源 schema 中逐一对应见 budget.go默认值语义与 AWS CostTypes API 保持一致。更细节的字段含义可参考 AWS 官方 CostTypes API 文档。Planned Budget Limits规划预算限额planned_limit对象的合法键用于为未来时间周期规划预算限额amount必填- 预算衡量的成本或用量金额。start_time必填- 预算限额的生效开始时间。格式2017-01-01_12:00。在资源 schema 中该字段使用validTimePeriodTimestamp校验确保符合时间戳格式。unit必填- 预算预测、实际花费或预算阈值使用的计量单位如美元或 GB。planned_limit与静态limit_amount/limit_unit互斥ConflictsWith即要么使用固定限额要么使用分期规划的限额列表。六、源码级读取流程解析当 Terraform 执行data aws_budgets_budget时实际调用链如下budget_data_source.go获取客户端通过c.BudgetsClient(ctx)从 provider 连接池中取出 Budgets 服务的 AWS SDK for Go v2 客户端。确定账号cmp.Or(d.Get(account_id), c.AccountID(ctx))—— 优先使用配置的account_id否则回退到当前凭证账号 ID。组装预算名create.Name(ctx, name, name_prefix)处理name与name_prefix的组合。调用查询findBudgetByTwoPartKey(ctx, conn, accountID, budgetName)执行GetBudgetAPI 调用带重试见下文。写回状态d.SetId(budgetCreateResourceID(accountID, budgetName))以账号 ID 预算名作为数据源 ID随后写入account_id、arn、billing_view_arn、budget_exceeded、budget_limit、budget_type、calculated_spend、name、name_prefix等属性。值得注意的是数据源的读取函数只显式 Set 了上述核心字段auto_adjust_data、cost_filter、cost_types、notification、planned_limit、time_period_*、time_unit、tags等属性在 schema 中标记为Computed且未被显式写回——从源码结构看这些字段依赖 SDK 框架从 AWS 返回对象的深层数据中填充。这一点提示使用者以数据源实际 plan/apply 后 state 中的值为准。此外查询还经过findWithDelay包装见 find.go使用tfresource.Retry以budgetsPropagationTimeout30 秒为超时上限、每次间隔 5 秒的重试策略执行查询以应对预算创建后短暂的一致性传播延迟任何 API 错误都会作为不可重试错误立即返回。七、标签支持与测试验证数据源声明了// Tags(identifierAttributearn)表示其标签读取以 ARN 为标识。对应的标签测试文件 budget_data_source_tags_gen_test.go 覆盖了如下场景基础标签读取资源打上key1 value1后数据源tags精确等于该映射null 映射与空映射未打标签时数据源返回空映射默认标签default_tags不重叠provider 默认标签与资源标签同时存在时数据源同时导出两者ignore_tags 重叠场景通过ignore_tag_keys忽略 provider 默认标签后数据源tags只保留资源标签忽略资源标签时则返回空映射且产生非空计划ExpectNonEmptyPlan: true。这些测试说明数据源导出的tags遵循 provider 统一的默认标签/忽略标签机制与其他 AWS 资源行为一致可直接用于标签审计类场景。八、实战使用建议只读消费避免重复定义若预算由其他流程创建直接用name查询即可不要试图用数据源声明预算数据源只读不写。结合输出与条件判断常用组合是data.aws_budgets_budget.test.budget_exceeded配合output或count/for_each条件逻辑实现超支标记。跨账号读取明确指定account_id可读取组织内其他账号预算但需确保凭证具备对应的budgets:DescribeBudget权限。预算名唯一性name在账号内唯一因此账号 名称即完整定位键这也与数据源 ID 的构造方式accountID/budgetName一致。与资源配置配套同一 Terraform 配置内资源创建预算、数据源回读状态如billing_view_arn、calculated_spend是官方测试验证过的标准搭配可放心使用。如需深入源码可重点阅读 budget_data_source.go数据源实现、budget.go管理资源 schema 与默认值、find.go重试查询封装以及 budget_data_source_test.go 与 budget_data_source_tags_gen_test.go验收测试与标签测试。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考