返回
RSS AWS Big Data Blog AI 逐段翻译 发布 2026-08-21 00:19 收录于 08-22

用自定义标签跟踪SageMaker Unified Studio项目成本

DataHot 速览

AWS 官方博客介绍了在 SageMaker Unified Studio 中跟踪项目成本的方法。系统标签会自动传播到所有项目资源,但 CostCenter、Team 等自定义标签不会传播到通过 UI 创建的动态资源。文章提出一个无服务器方案,通过 Glue ETL 将自定义标签与 CUR 数据关联,并用 QuickSight 构建成本分析仪表盘,帮助团队按自定义维度查看支出。

为什么值得关注:面向数据平台团队,提供了 AI 项目成本治理与标签管理的可落地实践,适合关注数据平台成本运营的从业者。

本文目录 20 节
  1. 解决方案概述
  2. 架构
  3. 前提条件
  4. 步骤 1:在项目配置文件中配置自定义标签
  5. 步骤 2:激活成本分配标签
  6. 步骤 3:部署基础设施
  7. 步骤 4:配置 CUR 交付
  8. 步骤 5:事件驱动标签捕获如何工作
  9. 步骤 6:CUR 增强如何工作
  10. 步骤 7:设置 Amazon Quick Sight 仪表板
  11. 步骤 8:验证解决方案
  12. 8.1 验证 Amazon EventBridge 正在捕获项目事件
  13. 8.2 验证 DynamoDB 架构和标签映射
  14. 8.2.1 验证 DynamoDB 表包含标签映射
  15. 8.3 验证 AWS Glue ETL 作业是否增强 CUR 数据
  16. 8.4 验证 Amazon Quick Sight 仪表板显示增强数据
  17. 操作注意事项
  18. 清理
  19. 结论
  20. 参考资料

译文

AI 逐段翻译

在“Amazon SageMaker Unified Studio”域和项目中运行机器学习(ML)、分析和生成式 AI 工作负载的组织面临一个常见的成本治理挑战。系统标签(Amazon SageMaker Unified Studio 域和项目会面临一个常见的成本治理挑战。系统标签(AmazonDataZoneDomainIdAmazonDataZoneProject)会自动传播到所有底层项目资源。然而,自定义标签(如 CostCenter、Team 或 Environment)不会传播到通过 Studio UI 创建的动态资源。当您需要按自定义标签对项目成本进行分组报告时,这会产生一个缺口。

在本文中,我们介绍一种无服务器解决方案,通过用自定义项目标签丰富AWS 成本和使用报告 (CUR) 数据来弥合这一差距。到本文结束时,您可以构建一个Amazon Quick Sight 仪表板,按您定义的任何自定义标签维度对 Amazon SageMaker Unified Studio 项目成本进行筛选和分析。这为您的团队提供了可见性,以便做出明智的支出决策。

解决方案概述

该解决方案由三个自动化子系统组成:

  1. 事件驱动的标签查找管理 – 一个Amazon EventBridge 规则捕获Amazon DataZone 项目生命周期事件(创建、更新、删除),并触发一个AWS Lambda 函数。该函数维护一个Amazon DynamoDB 查找表,将每个项目的 DomainId 和 ProjectId 映射到其自定义标签。
  2. CUR 丰富管道 – 一个AWS Glue 提取、转换、加载(ETL)作业从Amazon 简单存储服务 (Amazon S3) 读取 CUR 2.0 Parquet 数据。该作业使用系统标签(DomainId、ProjectId)将每个账单行项目与 DynamoDB 查找表连接,将自定义标签值作为新列追加,并将丰富后的数据写回 Amazon S3。
  3. 成本可视化 – 一个基于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 控制台中的完整配置过程。

要创建导出,请按照以下步骤操作:

  1. 前往 AWS Billing and Cost Management,然后选择Data Exports
  2. 在 Exports and dashboards 页面的右上角选择Create。Data Exports 控制台会显示任何现有导出、其状态、导出类型、数据表和上次刷新日期。
  3. 在 Create export 页面的Export details 下,选择Standard data export并输入导出名称。在Data table content settings 下,选择CUR 2.0
  4. Data table configurations 下,将Time granularity 设置为Hourly。配置页面还允许您选择其他导出内容选项,例如包含资源 ID、拆分成本分配数据、调用者身份分配数据和容量预留列。
  5. Data export delivery options 下,将Compression type and file format 设置为Parquet。在Data export storage settings 下,将 S3 存储桶配置为:smus-cur-report-{account-id}-{region},并根据需要设置 S3 路径前缀。选择Create 完成。
Data Exports 控制台列出现有导出,包括状态、类型和上次刷新日期

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

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

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

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

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

数据导出交付选项,配置了 Parquet 格式和 S3 存储目的地

图 5:数据导出交付选项,包含 Parquet 格式和 S3 存储设置

步骤 5:事件驱动标签捕获如何工作

当在 Amazon SageMaker Unified Studio 中创建或更新项目时(通过 Studio UI 或 API),以下操作会自动发生:

  1. CloudTrail 记录 Amazon DataZone API 调用。
  2. Amazon EventBridge 匹配事件。
  3. Amazon EventBridge 调用 Lambda 函数。
  4. Lambda 从 CloudTrail 事件负载中提取自定义标签。
  5. 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 交付后):

  1. 从 CUR S3 存储桶读取 CUR Parquet 文件。
  2. 从 DynamoDB 查找表读取所有记录。
  3. 在 DomainId 和 ProjectId 上执行左外连接。
  4. 将自定义标签列(CostCenter、Team、Environment 等)附加到每个 CUR 行项目。
  5. 将增强后的 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
  1. 打开 Amazon EventBridge 控制台。
  2. 在导航窗格中,选择 规则
  3. 选择由 CDK 堆栈创建的规则(例如,SmusCostReporting-ProjectTagRule)。
  4. 选择 监控 选项卡。
  5. 确认指标中记录了调用。
  6. 使用以下命令创建或更新带有自定义标签的 Amazon SageMaker Unified Studio 项目:
  7. 几秒钟内,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>"}}'
  1. 打开 DynamoDB 控制台。
  2. 导航到堆栈创建的表(例如,SmusCostReporting-ProjectTagsTable)。
  3. 选择 浏览表项
  4. 使用以下键扫描您的项目:
  5. 确认该项包含您分配了值的预期自定义标签属性(CostCenter、Team、Environment)。
  6. 或者,使用 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;
  1. 等待下一次 CUR 交付(如果按步骤 4 中描述配置为每小时,则为每小时)。
  2. 等待随后的 AWS Glue 作业执行。
  3. 打开 AWS Glue 控制台。
  4. 在导航窗格中,选择 ETL 作业
  5. 确认作业成功完成(状态:Succeeded)。
  6. 在 Amazon Athena 中查询增强数据,以确认自定义标签列已填充:

您应该会看到在 costcenterteamenvironment 列中填充了您的自定义标签值的行。

8.4 验证 Amazon Quick Sight 仪表板显示增强数据

  1. 打开 Amazon Quick Sight 控制台并导航到设置脚本创建的仪表板。
  2. 按自定义标签(CostCenter)的成本”条形图按您的 CostCenter 值分组显示成本数据。
  3. 列表筛选器 CostCenterTeamEnvironment 包含可选值。
  4. 选择筛选值可正确缩小显示的数据范围。

如果仪表板显示无数据,请验证:

  • AWS Glue 爬网程序是否已在 ETL 作业后运行(在 AWS Glue 控制台中检查爬网程序的上次运行状态)。
  • SPICE 数据集是否已刷新。在 Amazon Quick Sight 控制台中,导航到 数据集,选择数据集,然后选择 立即刷新

图 6 显示了 Amazon Quick Sight 仪表板,其中包含两个并排的水平条形图:按成本中心划分的成本和按项目划分的成本。顶部显示域名称和项目名称列表筛选器。

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自定义标签进行项目资源治理和成本跟踪

参考资料

这篇内容对你有用吗?

反馈只用于改善内容筛选,不等同于收藏

分享这条资讯
分享海报
保存图片
iOS 也可以长按图片保存