云原生运维安全【免费下载链接】cloud-custodianRules engine for cloud security, cost optimization, and governance, DSL in yaml for policies to query, filter, and take actions on resources项目地址https://gitcode.com/gh_mirrors/cl/cloud-custodian点击查看免费下载导读本文围绕 Cloud Custodian 仓库中bedrock_inference_profile_token_metrics测试夹具讲解如何为 Amazon Bedrock 推理配置文件inference profile的令牌用量指标生成、录制与回放测试飞行数据flight data。你将掌握 pytest-terraform 与 Cloud Custodian 测试框架的协作方式、c7n:TotalTokenCount等指标过滤器的验证逻辑以及如何手工重录一次真实的 Bedrock 运行时调用数据。一、背景为什么要为 Token 指标准备测试夹具在 c7n/resources/bedrock.py 中Cloud Custodian 为aws.bedrock-inference-profile资源注册了一个metrics过滤器InferenceProfileMetrics它基于 CloudWatch 的AWS/Bedrock命名空间读取两类数据原生指标InputTokenCount、OutputTokenCount由 Bedrock 运行时调用产生Custodian 派生指标c7n:TotalTokenCount即输入与输出令牌数之和仅支持Sum统计量。这些指标不是凭空产生的——它们依赖一次真实的 Bedrock 模型调用。因此在编写自动化测试时需要先在一个真实的 AWS 环境中发起调用、等待 CloudWatch 指标落盘再把这一过程记录为可回放的飞行数据。tests/terraform/bedrock_inference_profile_token_metrics/目录下的 README.md、main.tf、setup.py 与 tf_resources.json 共同构成了这套机制。二、夹具组成一个 Terraform 工程 一个运行时脚本该目录是典型的 pytest-terraform 测试夹具布局文件作用main.tfTerraform 资源定义创建 Bedrock 应用推理配置文件setup.py真实发起一次 Bedrock 运行时调用并等待指标可用tf_resources.jsonpytest-terraform 生成的资源状态快照含 ARN、ID、regionREADME.md录制/回放操作说明本文核心依据2.1 Terraform 侧创建应用推理配置文件main.tf 的核心内容provider aws { region us-east-1 } data aws_caller_identity current {} resource random_id suffix { byte_length 2 } resource aws_bedrock_inference_profile token_metrics { name c7n-token-metrics-${terraform.workspace}-${random_id.suffix.hex} description Cloud Custodian combined token metrics test model_source { copy_from arn:aws:bedrock:us-east-1:${data.aws_caller_identity.current.account_id}:inference-profile/us.amazon.nova-lite-v1:0 } } output inference_profile_arn { value aws_bedrock_inference_profile.token_metrics.arn }要点固定使用us-east-1区域模型源复制自 Amazon Nova Liteus.amazon.nova-lite-v1:0推理配置名称由 workspace 与 2 字节随机后缀拼接避免多环境冲突最终只导出inference_profile_arn一个 output供测试用例读取。从 tf_resources.json 可以看到一次真实 apply 的结果profile 名称为c7n-token-metrics-default-bf98、类型APPLICATION、状态ACTIVE其底层覆盖了us-east-1、us-west-2、us-east-2三个区域的 foundation model 副本。2.2 setup.pyTerraform 表达不了的运行时操作README 明确指出运行时调用runtime invocation是一次瞬时操作Terraform 无法表示因此由setup.py在飞行数据录制之前发出真实的输入/输出令牌指标。其执行链路见 setup.py分三步第一步读取 tf_resources.json 定位资源def load_profile(): resources_path Path(__file__).with_name(tf_resources.json) resources json.loads(resources_path.read_text()) return resources[resources][aws_bedrock_inference_profile][token_metrics]第二步通过 Bedrock 解析实时 ARN 与 IDdef find_inference_profile(profile_name, region): bedrock boto3.client(bedrock, region_nameregion) request {typeEquals: APPLICATION} while True: response bedrock.list_inference_profiles(**request) inference_profile next(( p for p in response[inferenceProfileSummaries] if p[inferenceProfileName] profile_name), None) if inference_profile: return inference_profile if nextToken not in response: raise RuntimeError(fcould not find inference profile {profile_name!r}) request[nextToken] response[nextToken]注意这里用typeEquals: APPLICATION过滤并处理了nextToken分页——从源码结构看这是为了在 profile 数量较多时也能稳定定位目标资源。第三步发起一次真实调用并等待指标落盘def emit_token_metrics(inference_profile_arn, region): runtime boto3.client(bedrock-runtime, region_nameregion) runtime.converse( modelIdinference_profile_arn, messages[{ role: user, content: [{text: Reply with the single word hello.}], }], inferenceConfig{maxTokens: 8, temperature: 0}, )调用参数刻意保持最小化单条用户消息、maxTokens8、temperature0保证产生确定、廉价的输入输出令牌。随后wait_for_token_metrics以ModelId即 inference profile 的 ID为维度轮询 CloudWatchAWS/Bedrock命名空间下的InputTokenCount与OutputTokenCount直至两者都有数据点超时上限TIMEOUT 900秒每 15 秒查询一次。三、重录飞行数据的完整步骤当录制出的数据过期、指标口径变化或需要换账号重新录制时按 README 的四步流程操作切换为录制模式在 tests/test_bedrock.py 的terraform(bedrock_inference_profile_token_metrics)装饰器上临时加replayFalse并用record_flight_data(bedrock_inference_profile_token_metrics)替代replay_flight_data。在测试起点打断点在 pytest-terraform 完成本夹具 apply 之后、测试刚开始处设置断点然后以-s -p no:env运行聚焦测试-s保留标准输出以便观察 setup.py 的进度打印-p no:env禁用 env 插件避免干扰。执行 setup.py在断点处于本目录tests/terraform/bedrock_inference_profile_token_metrics/运行./setup.py。脚本会从同目录的tf_resources.json读取 Terraform 创建出的 profile 名称与区域通过 Bedrocklist_inference_profiles解析出实时 ARN 与 ID将 ARN 传给 Bedrock Runtime 发起一次真实调用用 ID 作为 CloudWatchModelId维度等待InputTokenCount与OutputTokenCount可用。当看到InputTokenCount and OutputTokenCount are available.输出后继续执行测试完成录制。恢复回放模式还原replay_flight_data移除replayFalse与断点重新以回放模式运行该聚焦测试验证录制结果可稳定复现。需要特别说明的是pytest-terraform 负责 Terraform 的 teardown回放运行从不执行 setup 脚本且这次调用不会创建需要清理的资源——这是该夹具可以在回放模式下安全、快速重复运行的关键设计。四、测试用例如何验证指标过滤器录制完成后tests/test_bedrock.py 中的test_bedrock_inference_profile_token_metrics通过terraform(bedrock_inference_profile_token_metrics)获取夹具并从其 output 读取inference_profile_arn随后以replay_flight_data(bedrock_inference_profile_token_metrics, regionus-east-1)回放。测试的核心断言逻辑对InputTokenCount、OutputTokenCount分别构造metrics过滤器days: 1、period: 300、statistics: Sum、op: greater-than、value: 0断言命中的资源 ARN 正确且资源对象上出现AWS/Bedrock.指标名.Sum.1注解键即c7n.metrics缓存其最大Sum值大于 0对c7n:TotalTokenCount断言同样命中并校验get_permissions()中只含cloudwatch:GetMetricData而不含cloudwatch:GetMetricStatistics因为派生指标走的是 GetMetricData 表达式查询反向验证把阈值设为observed_total 1后过滤器不再命中任何资源。这些断言与 c7n/filters/metrics.py 中的注解键格式%s.%s.%s.%s % (namespace, metric, statistics, days)一一对应可直接验证指标过滤器的端到端行为。五、底层原理c7n:TotalTokenCount 是怎么算出来的InferenceProfileMetrics对通用MetricsFilter做了三处关键覆写见 c7n/resources/bedrock.py校验与默认值validate()规定c7n:TotalTokenCount只支持Sum统计量否则抛出PolicyValidationErrorprocess()中为该指标自动补全statistics: Sum。权限收敛get_permissions()对派生指标返回cloudwatch:GetMetricData普通指标仍用基类权限cloudwatch:GetMetricStatistics。查询改写get_metric_data()将一次GetMetricData请求拆成两条MetricStat查询input取InputTokenCount、output取OutputTokenCount均为SumReturnData: False再追加一条Expression: input output、Label: c7n:TotalTokenCount的表达式查询最后只收集Id total的结果。此外get_dimensions()返回{Name: ModelId, Value: resource[inferenceProfileId]}——这与 setup.py 轮询 CloudWatch 时使用的维度完全一致是录制数据能被过滤器命中的前提。在通用机制上MetricsFilterc7n/filters/metrics.py提供days默认 14、period、period-startauto或start-of-day、statistics默认Average支持Sum/Maximum/Minimum/SampleCount及pNN扩展统计、missing-value、percent-attr等参数。InferenceProfileMetrics的文档c7n/resources/bedrock.py还给出两个可直接落地的示例匹配最近一个完整自然日令牌消耗超过 100,000 的 profilepolicies: - name: bedrock-daily-token-usage resource: aws.bedrock-inference-profile filters: - type: metrics name: c7n:TotalTokenCount days: 1 period: 86400 period-start: start-of-day value: 100000 op: greater-than匹配最近一个完整 7 天聚合超过 700,000 的 profilepolicies: - name: bedrock-weekly-token-usage resource: aws.bedrock-inference-profile filters: - type: metrics name: c7n:TotalTokenCount days: 7 period: 604800 period-start: start-of-day value: 700000 op: greater-than其中period-start: start-of-day将窗口对齐到 UTC 自然日边界c7n/filters/metrics.py确保完整日统计不掺入当天未完结的数据。六、运行前提与注意事项功能测试开关飞行数据的录制与回放由 tests/conftest.py 中的C7N_FUNCTIONAL环境变量控制——LazyReplay.value not strtobool(os.environ.get(C7N_FUNCTIONAL, no))即默认回放设C7N_FUNCTIONALyes才执行真实调用。账号数据脱敏注册的TerraformAWSRewriteHookstests/conftest.py会在状态写入前把 12 位账号 ID 与组织 ID 替换为测试常量因此仓库中的tf_resources.json已是脱敏后的快照重录时应保持该机制生效。回放不调用 setup.py回放运行完全依赖已录制的 CloudWatch/Bedrock API 响应因此无需也不应再次执行真实调用这也意味着重录必须在具备 Bedrock 推理与 CloudWatch 权限的真实 AWS 环境中进行。依赖 pytest-terraformterraform(...)装饰器来自 pytest-terraform 插件tests/conftest.py 仅在检测到该插件时注册钩子运行前请确认测试环境已安装。结语bedrock_inference_profile_token_metrics夹具展示了 Cloud Custodian 处理Terraform 可建模资源 运行时瞬时操作组合的完整范式Terraform 负责资源生命周期setup.py负责补足运行时行为pytest-terraform 负责 apply/teardown 与状态传递而 flight data 机制让这一切在 CI 中可离线、可重复、可验证。理解这套流程后你不仅能维护 Bedrock token 指标相关的测试也能为其他需要真实调用才能产生指标的资源类型复制同样的测试策略。赞分享云原生运维安全【免费下载链接】cloud-custodianRules engine for cloud security, cost optimization, and governance, DSL in yaml for policies to query, filter, and take actions on resources项目地址https://gitcode.com/gh_mirrors/cl/cloud-custodian点击查看免费下载相关推荐Cloud Custodian GCP 审计日志事件夹具录制实战audit_event_recorder 完全解析Cloud Custodian GCP 审计日志事件夹具录制实战audit_event_recorder 完全解析 本文围绕 docs/source/gcp/云原生运维安全逆向工程工具箱深度解析Windows平台恶意软件分析全面指南逆向工程工具箱深度解析Windows平台恶意软件分析全面指南 Reverse Engineers Toolkit逆向工程工具箱是一个专为Windows平逆向工程应用安全SoloPi核心功能详解录制回放与性能测试实战指南SoloPi核心功能详解录制回放与性能测试实战指南 引言解放移动测试效率的痛点解决方案 你是否还在为重复的手动测试步骤感到厌烦是否在多设备兼容性测试中耗费测试性能测试创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考