用自定义标签跟踪SageMaker Unified Studio项目成本
DataHot 速览
AWS 官方博客介绍了在 SageMaker Unified Studio 中跟踪项目成本的方法。系统标签会自动传播到所有项目资源,但 CostCenter、Team 等自定义标签不会传播到通过 UI 创建的动态资源。文章提出一个无服务器方案,通过 Glue ETL 将自定义标签与 CUR 数据关联,并用 QuickSight 构建成本分析仪表盘,帮助团队按自定义维度查看支出。
为什么值得关注:面向数据平台团队,提供了 AI 项目成本治理与标签管理的可落地实践,适合关注数据平台成本运营的从业者。
本文目录 20 节
- 解决方案概述
- 架构
- 前提条件
- 步骤 1:在项目配置文件中配置自定义标签
- 步骤 2:激活成本分配标签
- 步骤 3:部署基础设施
- 步骤 4:配置 CUR 交付
- 步骤 5:事件驱动标签捕获如何工作
- 步骤 6:CUR 增强如何工作
- 步骤 7:设置 Amazon Quick Sight 仪表板
- 步骤 8:验证解决方案
- 8.1 验证 Amazon EventBridge 正在捕获项目事件
- 8.2 验证 DynamoDB 架构和标签映射
- 8.2.1 验证 DynamoDB 表包含标签映射
- 8.3 验证 AWS Glue ETL 作业是否增强 CUR 数据
- 8.4 验证 Amazon Quick Sight 仪表板显示增强数据
- 操作注意事项
- 清理
- 结论
- 参考资料
译文
AI 逐段翻译在“Amazon SageMaker Unified Studio”域和项目中运行机器学习(ML)、分析和生成式 AI 工作负载的组织面临一个常见的成本治理挑战。系统标签(Amazon SageMaker Unified Studio 域和项目会面临一个常见的成本治理挑战。系统标签(AmazonDataZoneDomainId 和 AmazonDataZoneProject)会自动传播到所有底层项目资源。然而,自定义标签(如 CostCenter、Team 或 Environment)不会传播到通过 Studio UI 创建的动态资源。当您需要按自定义标签对项目成本进行分组报告时,这会产生一个缺口。
在本文中,我们介绍一种无服务器解决方案,通过用自定义项目标签丰富AWS 成本和使用报告 (CUR) 数据来弥合这一差距。到本文结束时,您可以构建一个Amazon Quick Sight 仪表板,按您定义的任何自定义标签维度对 Amazon SageMaker Unified Studio 项目成本进行筛选和分析。这为您的团队提供了可见性,以便做出明智的支出决策。
解决方案概述
该解决方案由三个自动化子系统组成:
- 事件驱动的标签查找管理 – 一个Amazon EventBridge 规则捕获Amazon DataZone 项目生命周期事件(创建、更新、删除),并触发一个AWS Lambda 函数。该函数维护一个Amazon DynamoDB 查找表,将每个项目的 DomainId 和 ProjectId 映射到其自定义标签。
- CUR 丰富管道 – 一个AWS Glue 提取、转换、加载(ETL)作业从Amazon 简单存储服务 (Amazon S3) 读取 CUR 2.0 Parquet 数据。该作业使用系统标签(DomainId、ProjectId)将每个账单行项目与 DynamoDB 查找表连接,将自定义标签值作为新列追加,并将丰富后的数据写回 Amazon S3。
- 成本可视化 – 一个基于Amazon Athena 自定义 SQL 数据集驱动的 Amazon Quick Sight 仪表板,提供按自定义标签筛选的交互式成本和消费分析。
架构
下图展示了端到端架构:

图 1:SageMaker Unified Studio 项目自定义标签成本报告
工作流程如下:
- Amazon SageMaker Unified Studio 管理员创建或更新带有自定义标签的项目。
- AWS CloudTrail 捕获 API 调用。
- Amazon EventBridge 匹配事件。
- Lambda 编排器将标签映射写入 DynamoDB。
- 另外,AWS Data Exports 将 CUR 数据交付到 Amazon S3。
- AWS Glue ETL 作业使用 DynamoDB 中的自定义标签丰富 CUR 行项目。
- AWS Glue Crawler 对丰富后的数据进行编目。
- Amazon Quick Sight 按自定义标签可视化成本。
前提条件
在部署此解决方案之前,您需要:
- 一个 Amazon SageMaker Unified Studio 域(部署后您可以在其中创建项目)。
- 已安装 AWS Cloud Development Kit (AWS CDK) CLI。
- Python 3.12 或更高版本。
- 在您的账户中启用 Amazon Quick Sight Enterprise 版。
- 具有部署 AWS CloudFormation 堆栈权限的 AWS Identity and Access Management (IAM) 用户或角色。
步骤 1:在项目配置文件中配置自定义标签
您可以通过 Amazon DataZone API 在项目配置文件中配置自定义标签。首先,在您的项目配置文件中启用自定义标签:
aws datazone update-project-profile \
--domain-identifier $DOMAIN_ID \
--identifier $PROJECT_PROFILE_ID \
--region $REGION \
--allow-custom-project-resource-tags \
--project-resource-tags '[
{"key": "CostCenter", "value": "default", "isValueEditable": true},
{"key": "Team", "value": "default", "isValueEditable": true},
{"key": "Environment", "value": "default", "isValueEditable": true}
]'创建或更新项目时,设置标签值:
aws datazone update-project \
--domain-identifier $DOMAIN_ID \
--identifier $PROJECT_ID \
--project-profile-version latest \
--region $REGION \
--resource-tags '{"CostCenter": "CC-100", "Team": "ML-Platform", "Environment": "Production"}'重要提示: AmazonSageMakerProvisioning-<domainAccountId> 角色需要内联策略,允许您的自定义标签键。否则,项目环境部署将失败。
以下是为本文中共享的自定义标签使用的内联策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCustomTagKeys",
"Effect": "Allow",
"Action": [
"sagemaker:AddTags",
"sagemaker:DeleteTags",
"cloudformation:TagResource",
"cloudformation:CreateStack",
"cloudformation:UpdateStack"
],
"Resource": "*",
"Condition": {
"ForAnyValue:StringLike": {
"aws:TagKeys": [
"AmazonDataZone*",
"CostCenter",
"Team",
"Environment"
]
}
}
}
]
}步骤 2:激活成本分配标签
激活 SageMaker Unified Studio 系统标签作为成本分配标签,以便它们出现在 CUR 数据中:
aws ce update-cost-allocation-tags-status \
--cost-allocation-tags-status '[
{"TagKey": "AWSDataZoneProject", "Status": "Active"},
{"TagKey": "AmazonDataZoneDomainId", "Status": "Active"}
]'这些标签在激活后最多需要24 小时才会开始出现在 CUR 报告中。
步骤 3:部署基础设施
该解决方案打包为 CDK 应用程序。克隆GitHub 仓库并部署:
# Install dependencies
pip install -r requirements.txt
# Bootstrap CDK (first time only)
cdk bootstrap aws://$ACCOUNT_ID/$REGION
# Deploy
cdk deploy这将创建以下资源:
- DynamoDB 表(smus-project-tag-lookup)——存储项目到标签的映射。
- Lambda 函数(smus-orchestrator)——处理项目生命周期事件。
- Amazon EventBridge 规则——匹配 Amazon DataZone
CreateProject/UpdateProject/DeleteProject事件。 - S3 存储桶——用于原始 CUR 和丰富后的 CUR 数据。
- AWS Glue ETL 作业(smus-cur-enrichment)——使用自定义标签丰富 CUR。
- AWS Glue Crawler——对丰富后的数据进行编目。
- Amazon 简单通知服务 (Amazon SNS) 主题——管道失败警报。
注意: 该解决方案使用无服务器组件(Lambda、DynamoDB 按需容量、AWS Glue、Amazon Quick Sight),因此您只需按使用量付费。主要成本驱动因素是 AWS Glue ETL 作业执行时间和 Amazon Quick Sight SPICE 存储。
步骤 4:配置 CUR 交付
通过 AWS Data Exports 创建 CUR 2.0 导出,将 Parquet 文件交付到堆栈创建的 CUR S3 存储桶。以下截图展示了 AWS Billing and Cost Management 控制台中的完整配置过程。
要创建导出,请按照以下步骤操作:
- 前往 AWS Billing and Cost Management,然后选择Data Exports。
- 在 Exports and dashboards 页面的右上角选择Create。Data Exports 控制台会显示任何现有导出、其状态、导出类型、数据表和上次刷新日期。
- 在 Create export 页面的Export details 下,选择Standard data export并输入导出名称。在Data table content settings 下,选择CUR 2.0。
- 在Data table configurations 下,将Time granularity 设置为Hourly。配置页面还允许您选择其他导出内容选项,例如包含资源 ID、拆分成本分配数据、调用者身份分配数据和容量预留列。
- 在Data export delivery options 下,将Compression type and file format 设置为Parquet。在Data export storage settings 下,将 S3 存储桶配置为:smus-cur-report-{account-id}-{region},并根据需要设置 S3 路径前缀。选择Create 完成。

图 2:Data Exports 页面列出现有导出

图 3:Create export 页面,选择了 Standard data export 和 CUR 2.0

图 4:数据表配置,时间粒度设置为每小时

图 5:数据导出交付选项,包含 Parquet 格式和 S3 存储设置
步骤 5:事件驱动标签捕获如何工作
当在 Amazon SageMaker Unified Studio 中创建或更新项目时(通过 Studio UI 或 API),以下操作会自动发生:
- CloudTrail 记录 Amazon DataZone API 调用。
- Amazon EventBridge 匹配事件。
- Amazon EventBridge 调用 Lambda 函数。
- Lambda 从 CloudTrail 事件负载中提取自定义标签。
- Lambda 将包含 DomainId、ProjectId 以及所有自定义标签键值对的记录写入 DynamoDB。
Lambda 函数直接从 CloudTrail 事件的 responseElements.resourceTags 字段中读取标签,而不是进行单独的 GetProject API 调用。这避免了竞争条件,即当项目处于 UPDATING 状态时,UPDATING 状态可能返回空标签。
def _extract_tags_from_event(detail):
tags = {}
response_elements = detail.get("responseElements") or {}
for tag_entry in response_elements.get("resourceTags", []):
if isinstance(tag_entry, dict) and "key" in tag_entry:
tags[tag_entry["key"]] = tag_entry["value"]
request_params = detail.get("requestParameters") or {}
req_tags = request_params.get("resourceTags", {})
if isinstance(req_tags, dict):
tags.update(req_tags)
return tags步骤 6:CUR 增强如何工作
AWS Glue ETL 作业按计划运行(每次 CUR 交付后):
- 从 CUR S3 存储桶读取 CUR Parquet 文件。
- 从 DynamoDB 查找表读取所有记录。
- 在 DomainId 和 ProjectId 上执行左外连接。
- 将自定义标签列(CostCenter、Team、Environment 等)附加到每个 CUR 行项目。
- 将增强后的 Parquet 写入增强 S3 存储桶。
查找表中没有匹配项目的行项目保留所有原始列,自定义标签值为 NULL。不会丢弃任何数据。
joined_df = cur_df.join(
lookup_df,
on=(
(cur_df[DOMAIN_COL] == lookup_df["domainId"])
& (cur_df[PROJECT_COL] == lookup_df["projectId"])
),
how="left_outer",
)步骤 7:设置 Amazon Quick Sight 仪表板
在第一次 ETL 运行和爬网程序执行后,设置 Amazon Quick Sight 仪表板:
python scripts/setup_quicksight.py \
--account-id $ACCOUNT_ID \
--region $REGION \
--quicksight-user $QUICKSIGHT_USER_ARN这将创建一个包含五个可视对象的仪表板:
- 按自定义标签(CostCenter)的成本 – 水平条形图。
- 按项目的成本 – 水平条形图。
- 每日成本趋势 – 折线图。
- 按项目按服务的成本 – 堆叠条形图。
- 按项目与服务的用量 – 汇总表。
以及六个交互式列表筛选器:Domain、Project、CostCenter、Team、Environment、Service。
自定义 SQL 包含用于服务分类的 CASE 语句:
SELECT
line_item_usage_start_date,
line_item_product_code,
line_item_usage_amount,
line_item_unblended_cost,
resource_tags_user_amazondatazone_domain_id AS domain_id,
resource_tags_user_amazondatazone_project AS project_id,
costcenter, team, environment,
CASE
WHEN line_item_product_code = 'AmazonSageMaker' THEN 'SageMaker'
WHEN line_item_product_code = 'AmazonS3' THEN 'S3'
WHEN line_item_product_code = 'AWSGlue' THEN 'Glue'
ELSE line_item_product_code
END AS service_category
FROM "smus_cost_reporting"."enriched_cur"
WHERE line_item_unblended_cost > 0步骤 8:验证解决方案
在部署基础设施并设置仪表板后,验证管道的每个组件是否正常运行。
8.1 验证 Amazon EventBridge 正在捕获项目事件
aws datazone update-project \
--domain-identifier <domain-id> \
--identifier <project-id> \
--custom-tags CostCenter=Engineering Team=DataPlatform Environment=Production- 打开 Amazon EventBridge 控制台。
- 在导航窗格中,选择 规则。
- 选择由 CDK 堆栈创建的规则(例如,
SmusCostReporting-ProjectTagRule)。 - 选择 监控 选项卡。
- 确认指标中记录了调用。
- 使用以下命令创建或更新带有自定义标签的 Amazon SageMaker Unified Studio 项目:
- 几秒钟内,Amazon EventBridge 规则应在其指标中显示新的调用。
8.2 验证 DynamoDB 架构和标签映射
DynamoDB 查找表使用简单的键架构:
| 属性 | 类型 | 角色 |
| domainId | 字符串 | 分区键 |
| projectId | 字符串 | 排序键 |
| CostCenter | 字符串 | 自定义标签 |
| Team | 字符串 | 自定义标签 |
| Environment | 字符串 | 自定义标签 |
自定义标签存储为动态属性。项目上设置的任何标签键成为表中的一列。
8.2.1 验证 DynamoDB 表包含标签映射
Partition key (domainId): <your-domain-id>
Sort key (projectId): <your-project-id>aws dynamodb get-item \
--table-name SmusCostReporting-ProjectTagsTable \
--key '{"domainId": {"S": "<domain-id>"}, "projectId": {"S": "<project-id>"}}'- 打开 DynamoDB 控制台。
- 导航到堆栈创建的表(例如,
SmusCostReporting-ProjectTagsTable)。 - 选择 浏览表项。
- 使用以下键扫描您的项目:
- 确认该项包含您分配了值的预期自定义标签属性(CostCenter、Team、Environment)。
- 或者,使用 AWS CLI:
8.3 验证 AWS Glue ETL 作业是否增强 CUR 数据
SELECT
line_item_usage_start_date,
line_item_product_code,
line_item_unblended_cost,
costcenter,
team,
environment
FROM "smus_cost_reporting"."enriched_cur"
WHERE costcenter IS NOT NULL
LIMIT 10;- 等待下一次 CUR 交付(如果按步骤 4 中描述配置为每小时,则为每小时)。
- 等待随后的 AWS Glue 作业执行。
- 打开 AWS Glue 控制台。
- 在导航窗格中,选择 ETL 作业。
- 确认作业成功完成(状态:Succeeded)。
- 在 Amazon Athena 中查询增强数据,以确认自定义标签列已填充:
您应该会看到在 costcenter、team 和 environment 列中填充了您的自定义标签值的行。
8.4 验证 Amazon Quick Sight 仪表板显示增强数据
- 打开 Amazon Quick Sight 控制台并导航到设置脚本创建的仪表板。
- “按自定义标签(CostCenter)的成本”条形图按您的 CostCenter 值分组显示成本数据。
- 列表筛选器 CostCenter、Team 和 Environment 包含可选值。
- 选择筛选值可正确缩小显示的数据范围。
如果仪表板显示无数据,请验证:
- AWS Glue 爬网程序是否已在 ETL 作业后运行(在 AWS Glue 控制台中检查爬网程序的上次运行状态)。
- SPICE 数据集是否已刷新。在 Amazon Quick Sight 控制台中,导航到 数据集,选择数据集,然后选择 立即刷新。
图 6 显示了 Amazon Quick Sight 仪表板,其中包含两个并排的水平条形图:按成本中心划分的成本和按项目划分的成本。顶部显示域名称和项目名称列表筛选器。

图 6:Amazon Quick Sight 仪表板显示按自定义标签划分的成本数据,包括按成本中心和按项目划分的成本条形图,并带有域名称和项目名称筛选器
注意: 第一个端到端周期可能需要最多 48 小时,具体取决于 CUR 交付时间。在初始周期完成后,后续更新将按配置的计划自动流动。
操作注意事项
监控: Amazon SNS 主题 smus-cost-reporting-alerts 在 AWS Glue ETL 作业失败或 Lambda 编排器遇到重复错误时接收通知。订阅电子邮件地址或 Slack webhook 以了解情况。有关如何创建订阅的说明,请参阅 订阅 Amazon SNS 主题。
成本:该解决方案使用无服务器组件(Lambda、按需DynamoDB、AWS Glue、Amazon Quick Sight、SPICE),因此您只需为使用的内容付费。主要成本驱动因素是AWS Glue ETL作业执行时间和Amazon Quick Sight SPICE存储。
扩展: DynamoDB表使用按需容量,可以扩展以满足您的项目需求。您可以通过增加Worker数量来扩展AWS Glue ETL作业,以处理更大的CUR数据集。有关更多信息,请参阅使用DynamoDB自动扩展自动管理吞吐容量。
新标签键: 当您向项目添加新的自定义标签键时,ETL会自动将其作为新列拾取。AWS Glue Crawler的UPDATE_IN_DATABASE策略会将新列添加到目录表中,无需人工干预。
清理
警告: 以下清理步骤将永久删除所有CUR数据、项目标签映射和Amazon Quick Sight仪表板。
要删除所有资源:
# Delete Amazon Quick Sight resources
python scripts/setup_quicksight.py --account-id $ACCOUNT_ID --region $REGION --quicksight-user $QS_USER --clean
# Delete CDK stack
cdk destroy转到AWS Billing and Cost Management,然后选择Data Exports并删除在步骤4中创建的CUR 2.0导出。
停用在步骤2中激活的成本分配标签:
aws ce update-cost-allocation-tags-status \
--cost-allocation-tags-status '[
{"TagKey": "AWSDataZoneProject", "Status": "Inactive"},
{"TagKey": "AmazonDataZoneDomainId", "Status": "Inactive"}
]'结论
在这篇文章中,我们展示了如何使用自定义标签为Amazon SageMaker Unified Studio项目构建端到端的成本报告解决方案。该解决方案结合了由Amazon EventBridge驱动的标签捕获、通过AWS Glue ETL进行的CUR丰富以及Amazon Quick Sight中的可视化。借助它,组织可以按CostCenter、Team、Environment或任何自定义维度跟踪和归因成本。即使对于通过Studio UI创建且未接收自定义标签传播的资源,这也有效。
该解决方案作为自定义标签传播功能的扩展,为所有项目资源报告成本。该架构完全无服务器、自动化,并可使用提供的CDK应用程序部署到任何AWS账户。
要开始构建您的自定义标签成本报告管道,请访问GitHub仓库。要了解有关底层服务的更多信息,请访问Amazon SageMaker Unified Studio服务页面。有关自定义标签治理的相关方法,请参阅使用Amazon SageMaker自定义标签进行项目资源治理和成本跟踪
参考资料
这篇内容对你有用吗?
反馈只用于改善内容筛选,不等同于收藏