不想设置?使用支出预设
如果你只想在主屏幕上查看 AWS 账单,就不需要控制面板。开启账单指标(第 1 步),然后通过创建小组件 › 预设添加 CloudPeek 的支出预设。这些预设合起来可以显示下面的控制面板所显示的全部内容:
| 控制面板小组件 | 预设 | 区别 |
|---|---|---|
| 支出最高的 5 项服务 | 按服务支出 | 显示所有服务,支出最高的在前,显示不下的合计为“其他”。其总计是各项服务之和,而不是你的全部账单。 |
| 本月至今支出 | 本月至今支出 | 相同。 |
| 过去 7 天的支出 | 按账户每日支出 | 相同;在 AWS Organizations 管理账户中,每个账户会堆叠在当天的柱中,并且还可以显示 2 周、30 天或本月至今。 |
| 前 5 项服务的支出占比 | 支出占比 | 显示所有服务,而不只是五项。 |
预设还提供月末预测、支出和预测、按服务每日支出、每日支出表和支出趋势:请参阅预设。如果你想要固定的前五项、以全部账单作为总计、在 CloudWatch 控制台中看到相同的小组件,或者想用 CloudFormation 或 Terraform 管理控制面板,请改为创建控制面板。
你将创建的内容
你将创建一个名为 CloudPeek-Spend 的 CloudWatch 控制面板,其中包含四个小组件。第一个是条形图,显示本月至今你支出最多的五项服务(自动找出)以及账户的总计。第二个显示该本月至今总计,并附有过去一周的迷你图。第三个显示过去 7 天中每天的支出,每天一列;第四个是饼图,显示支出最高的五项服务各自所占的份额。它们在 CloudPeek 中的样子如下:
在 AWS 控制台中大约需要 15 分钟,使用 CloudFormation 或 Terraform 则只需一次部署。请在每一步的标签页中选择你使用的工具。
开始之前
- 一个 AWS 账户,以及可以更改账单首选项并创建 CloudWatch 控制面板、IAM 用户和策略的登录身份,例如管理员。如果你的账户在 AWS Organizations 中,请使用管理账户,以查看整个组织的支出。
- 安装在 iPhone、iPad 或 Android 手机上的 CloudPeek。
费用。账单指标免费。CloudWatch 免费套餐包含三个控制面板;超出部分每个控制面板每月 3 美元。CloudPeek 刷新时会调用 GetMetricData,AWS 对其按每 1,000 个指标 0.01 美元计费。AWS 每天只更新几次账单指标,因此这些小组件最多每 3 小时刷新一次:固定全部四个小组件时,每次刷新约 15 个指标,每月约 4 美分。设置中的刷新下会估算你自己的小组件的费用。请参阅 CloudWatch 定价。
1. 开启账单指标
只有在你选择加入后,AWS 才会将你的预估费用发送到 CloudWatch。每个账户只需在控制台中操作一次:CloudFormation、Terraform 和 AWS CLI 都无法更改此设置。
- 登录 AWS 控制台,然后打开账单和成本管理 › 账单首选项。
- 在提醒首选项下,选择编辑。
- 选中接收 CloudWatch 账单警报,然后保存更改。
预估费用每天会多次发布到美国东部(弗吉尼亚北部)区域,即 us-east-1。它们从月初开始累计,因此每月都会归零。首批数据可能需要几个小时才会出现。如果你不是以根用户身份登录,该账户还必须允许 IAM 访问账单信息(在账户 › IAM 用户和角色访问账单信息的权限下)。
在首批数据到达之前,你接下来创建的控制面板会显示没有可用数据,CloudPeek 的支出小组件会显示“请在账单控制台中开启 CloudWatch 账单警报。支出会在一天内显示。”(小号小组件上显示“请开启 CloudWatch 账单警报。”)。要检查账单指标是否已开始发送,请在 us-east-1 中打开 CloudWatch,然后选择指标 › 所有指标:开始发送后,会出现 Billing 命名空间。Metrics Explorer 不会列出账单指标,因此请在“所有指标”下查找。
在 AWS Organizations 中,账单指标只存在于管理账户中,其中包含每个账户的费用,并按账户细分(按账户划分的支出)。其他账户中没有账单指标,因此请在管理账户中开启账单警报,并将管理账户添加到 CloudPeek 以使用支出小组件。在通过 IAM Identity Center 登录的非管理账户中,CloudPeek 的支出小组件会显示“此账户的支出位于你所在组织的管理账户中。”(小号小组件上显示“支出位于你的管理账户中。”)。CloudPeek 根据能否列出组织的账户(organizations:ListAccounts,包含在 CloudPeek 的策略中)来识别管理账户,因此请为管理账户的登录身份授予该权限。
2. 创建控制面板
- 打开 us-east-1 中的 CloudWatch 控制台,然后选择创建控制面板。
- 将其命名为
CloudPeek-Spend,然后选择创建控制面板。如果打开了添加小部件窗口,请将其关闭。 - 选择操作 › 查看/编辑源,将源替换为控制面板 JSON,然后选择更新。
- 选择保存。
下载 spend-by-service.json(下文有完整内容),然后运行:
aws cloudwatch put-dashboard \
--region us-east-1 \
--dashboard-name CloudPeek-Spend \
--dashboard-body file://spend-by-service.json
一个模板即可创建该控制面板,以及第 3 步中的 CloudPeek 策略和 IAM 用户。以下是控制面板资源:
Dashboard:
Type: AWS::CloudWatch::Dashboard
Properties:
DashboardName: !Ref DashboardName
DashboardBody: !Sub |
{
"start": "-P7D",
"widgets": [
{
"type": "metric",
"x": 0,
"y": 0,
"width": 12,
"height": 8,
"properties": {
"title": "Top ${TopServices} services by spend",
"view": "bar",
"region": "us-east-1",
"start": "-P1D",
"stat": "Maximum",
"period": 21600,
"metrics": [
[ "AWS/Billing", "EstimatedCharges", "Currency", "${Currency}", { "label": "Total" } ],
[ { "expression": "SORT(SEARCH('{AWS/Billing,Currency,ServiceName} MetricName=\"EstimatedCharges\" Currency=\"${Currency}\"', 'Maximum', 21600), MAX, DESC, ${TopServices})", "label": "${!PROP('Dim.ServiceName')}", "id": "top" } ]
]
}
},
{
"type": "metric",
"x": 12,
"y": 0,
"width": 6,
"height": 8,
"properties": {
"title": "Month-to-date spend",
"view": "singleValue",
"region": "us-east-1",
"stat": "Maximum",
"period": 21600,
"sparkline": true,
"metrics": [
[ "AWS/Billing", "EstimatedCharges", "Currency", "${Currency}", { "label": "Total" } ]
]
}
},
{
"type": "metric",
"x": 18,
"y": 0,
"width": 6,
"height": 8,
"properties": {
"title": "Last 7 days' spend",
"view": "timeSeries",
"region": "us-east-1",
"start": "-P7D",
"stat": "Maximum",
"period": 86400,
"yAxis": { "left": { "min": 0 } },
"metrics": [
[ { "expression": "IF(DIFF(m1) < 0, m1, DIFF(m1))", "label": "Spend", "id": "daily" } ],
[ "AWS/Billing", "EstimatedCharges", "Currency", "${Currency}", { "id": "m1", "visible": false } ]
]
}
},
{
"type": "metric",
"x": 0,
"y": 8,
"width": 12,
"height": 8,
"properties": {
"title": "Top ${TopServices} services' share of spend",
"view": "pie",
"region": "us-east-1",
"start": "-P1D",
"stat": "Maximum",
"period": 21600,
"metrics": [
[ { "expression": "SORT(SEARCH('{AWS/Billing,Currency,ServiceName} MetricName=\"EstimatedCharges\" Currency=\"${Currency}\"', 'Maximum', 21600), MAX, DESC, ${TopServices})", "label": "${!PROP('Dim.ServiceName')}", "id": "share" } ]
]
}
}
]
}
其主体就是下面的控制面板 JSON,其中的 ${TopServices} 和 ${Currency} 由堆栈的参数填入。${!PROP(…)} 可防止 CloudFormation 将动态标签当作它自己的变量。
aws cloudformation deploy \
--region us-east-1 \
--stack-name CloudPeek \
--template-file cloudpeek-setup.yaml \
--capabilities CAPABILITY_NAMED_IAM
或者,在 us-east-1 中的 CloudFormation 控制台中,选择上传模板文件,将堆栈命名为 CloudPeek,检查参数,并在提交前选中我确认,AWS CloudFormation 可能创建具有自定义名称的 IAM 资源。当堆栈状态变为 CREATE_COMPLETE 时,其输出选项卡中会有指向该控制面板的链接。
| 参数 | 默认值 | 用途 |
|---|---|---|
DashboardName | CloudPeek-Spend | 控制面板的名称。 |
TopServices | 5 | 在图表中显示支出最高的多少项服务,取值为 1 到 20。 |
Currency | USD | 账单所用的货币。 |
PolicyName | CloudPeek | 策略的名称。 |
CreateUser | true | 如果你将使用 IAM Identity Center 登录,请设置为 false。 |
UserName | cloudpeek | IAM 用户的名称。 |
要更改这些参数,请添加 --parameter-overrides,例如 --parameter-overrides TopServices=10 CreateUser=false。
一个配置即可创建该控制面板,以及第 3 步中的 CloudPeek 策略和 IAM 用户。以下是控制面板资源:
resource "aws_cloudwatch_dashboard" "spend" {
dashboard_name = var.dashboard_name
dashboard_body = jsonencode({
start = "-P7D"
widgets = [
{
type = "metric"
x = 0
y = 0
width = 12
height = 8
properties = {
title = "Top ${var.top_services} services by spend"
view = "bar"
region = "us-east-1"
start = "-P1D"
stat = "Maximum"
period = 21600
metrics = [
["AWS/Billing", "EstimatedCharges", "Currency", var.currency, { label = "Total" }],
[{
expression = "SORT(SEARCH('{AWS/Billing,Currency,ServiceName} MetricName=\"EstimatedCharges\" Currency=\"${var.currency}\"', 'Maximum', 21600), MAX, DESC, ${var.top_services})"
label = "$${PROP('Dim.ServiceName')}"
id = "top"
}],
]
}
},
{
type = "metric"
x = 12
y = 0
width = 6
height = 8
properties = {
title = "Month-to-date spend"
view = "singleValue"
region = "us-east-1"
stat = "Maximum"
period = 21600
sparkline = true
metrics = [
["AWS/Billing", "EstimatedCharges", "Currency", var.currency, { label = "Total" }],
]
}
},
{
type = "metric"
x = 18
y = 0
width = 6
height = 8
properties = {
title = "Last 7 days' spend"
view = "timeSeries"
region = "us-east-1"
start = "-P7D"
stat = "Maximum"
period = 86400
yAxis = { left = { min = 0 } }
metrics = [
[{ expression = "IF(DIFF(m1) < 0, m1, DIFF(m1))", label = "Spend", id = "daily" }],
["AWS/Billing", "EstimatedCharges", "Currency", var.currency, { id = "m1", visible = false }],
]
}
},
{
type = "metric"
x = 0
y = 8
width = 12
height = 8
properties = {
title = "Top ${var.top_services} services' share of spend"
view = "pie"
region = "us-east-1"
start = "-P1D"
stat = "Maximum"
period = 21600
metrics = [
[{
expression = "SORT(SEARCH('{AWS/Billing,Currency,ServiceName} MetricName=\"EstimatedCharges\" Currency=\"${var.currency}\"', 'Maximum', 21600), MAX, DESC, ${var.top_services})"
label = "$${PROP('Dim.ServiceName')}"
id = "share"
}],
]
}
},
]
})
}
它使用 jsonencode 构建出与下面的控制面板 JSON 完全相同的内容。$${PROP(…)} 可防止 Terraform 将动态标签当作插值。将该文件保存到一个空目录中,然后运行:
terraform init
terraform apply
| 变量 | 默认值 | 用途 |
|---|---|---|
dashboard_name | CloudPeek-Spend | 控制面板的名称。 |
top_services | 5 | 在图表中显示支出最高的多少项服务,取值为 1 到 20。 |
currency | USD | 账单所用的货币。 |
policy_name | CloudPeek | 策略的名称。 |
create_user | true | 如果你将使用 IAM Identity Center 登录,请设置为 false。 |
user_name | cloudpeek | IAM 用户的名称。 |
要更改这些变量,请传入 -var,例如 terraform apply -var top_services=10 -var create_user=false。要将该控制面板添加到现有配置中,请复制其中的资源,并省略 terraform 和 provider 块。
3. 为 CloudPeek 创建登录身份
按照“入门”中的为 CloudPeek 创建登录身份操作。它会创建 CloudPeek 策略,以及一个使用访问密钥的 IAM 用户或一个 IAM Identity Center 权限集。
按照“入门”中的为 CloudPeek 创建登录身份操作,其中提供了用于创建 IAM 用户或 IAM Identity Center 权限集的 AWS CLI 命令。
第 2 步中的堆栈已经创建了 CloudPeek 策略,并且(除非你将 CreateUser 设置为 false)还创建了 cloudpeek 用户。请为该用户创建访问密钥。秘密访问密钥只显示一次:
aws iam create-access-key --user-name cloudpeek
对于 IAM Identity Center,请将 CloudPeek 作为客户管理型策略附加到权限集(请参阅选项 B)。
第 2 步中的配置已经创建了 CloudPeek 策略,并且(除非你将 create_user 设置为 false)还创建了 cloudpeek 用户。请在 Terraform 之外创建该用户的访问密钥,这样秘密访问密钥就不会进入你的状态。它只显示一次:
aws iam create-access-key --user-name cloudpeek
对于 IAM Identity Center,请将 CloudPeek 作为客户管理型策略附加到权限集(请参阅选项 B)。
4. 添加账户并固定小组件
- 在 CloudPeek 中,在账户标签页上使用该访问密钥或 IAM Identity Center 添加账户(请参阅入门的第 2 步)。任何默认区域都可以:支出小组件始终读取
us-east-1。 - 在账户标签页上,打开该账户,再打开 CloudPeek-Spend 控制面板,然后在你想要的小组件上轻点固定:支出最高的 5 项服务、本月至今支出、过去 7 天的支出和前 5 项服务的支出占比。
- 为每个小组件分别将 CloudPeek 添加到主屏幕一次,并选择各自显示哪个小组件(请参阅选择它显示哪个小组件)。中号适合条形图和饼图;小号适合本月至今总计和过去 7 天的支出。
结果:账单指标到达后,条形图会列出你本月支出最高的几项服务,总计显示在它们上方。在此之前,小组件会显示此时间范围内无数据。
在 iPhone 和 iPad 上,总计也很适合放在锁定屏幕上,锁定屏幕小组件会显示最新值。
控制面板的工作原理
无论使用哪种工具,最终得到的控制面板都如下所示:
{
"start": "-P7D",
"widgets": [
{
"type": "metric",
"x": 0,
"y": 0,
"width": 12,
"height": 8,
"properties": {
"title": "Top 5 services by spend",
"view": "bar",
"region": "us-east-1",
"start": "-P1D",
"stat": "Maximum",
"period": 21600,
"metrics": [
[ "AWS/Billing", "EstimatedCharges", "Currency", "USD", { "label": "Total" } ],
[ { "expression": "SORT(SEARCH('{AWS/Billing,Currency,ServiceName} MetricName=\"EstimatedCharges\" Currency=\"USD\"', 'Maximum', 21600), MAX, DESC, 5)", "label": "${PROP('Dim.ServiceName')}", "id": "top" } ]
]
}
},
{
"type": "metric",
"x": 12,
"y": 0,
"width": 6,
"height": 8,
"properties": {
"title": "Month-to-date spend",
"view": "singleValue",
"region": "us-east-1",
"stat": "Maximum",
"period": 21600,
"sparkline": true,
"metrics": [
[ "AWS/Billing", "EstimatedCharges", "Currency", "USD", { "label": "Total" } ]
]
}
},
{
"type": "metric",
"x": 18,
"y": 0,
"width": 6,
"height": 8,
"properties": {
"title": "Last 7 days' spend",
"view": "timeSeries",
"region": "us-east-1",
"start": "-P7D",
"stat": "Maximum",
"period": 86400,
"yAxis": { "left": { "min": 0 } },
"metrics": [
[ { "expression": "IF(DIFF(m1) < 0, m1, DIFF(m1))", "label": "Spend", "id": "daily" } ],
[ "AWS/Billing", "EstimatedCharges", "Currency", "USD", { "id": "m1", "visible": false } ]
]
}
},
{
"type": "metric",
"x": 0,
"y": 8,
"width": 12,
"height": 8,
"properties": {
"title": "Top 5 services' share of spend",
"view": "pie",
"region": "us-east-1",
"start": "-P1D",
"stat": "Maximum",
"period": 21600,
"metrics": [
[ { "expression": "SORT(SEARCH('{AWS/Billing,Currency,ServiceName} MetricName=\"EstimatedCharges\" Currency=\"USD\"', 'Maximum', 21600), MAX, DESC, 5)", "label": "${PROP('Dim.ServiceName')}", "id": "share" } ]
]
}
}
]
}
- 表达式行会为你找出支出最高的服务。
SEARCH会找到每项服务的预估费用,SORT(…, MAX, DESC, 5)则保留最大的五项。你新开始使用的服务会自动出现。要显示更多或更少的服务,请更改条形图和饼图表达式末尾的5(或TopServices参数,或top_services变量)。 - 标签
${PROP('Dim.ServiceName')}用服务名称为每个条形命名,例如AmazonEC2或AWSLambda。CloudPeek 会显示简称(EC2、Lambda),按从大到小排列,并将显示不下的合计为其他。 - 只有
Currency维度的那一行是整个账户本月至今的费用。CloudPeek 将其显示为小组件的总计,而不是一个条形,因此前五项之外的服务也会计算在内。在 CloudWatch 控制台中,它会显示为多出的一个条形。 - 费用从月初开始累计,因此条形图和饼图只看最近一天(
"start": "-P1D")。这样,排名就会依据本月的费用,而不是上个月的费用。本月至今总计的迷你图使用控制面板的一周时间范围。 - 过去 7 天的数据来自同一个本月至今费用,从隐藏的
m1行中每天读取一次("period": 86400)。DIFF(m1)是它每天增加的金额;在月初费用归零的那一天,IF(… < 0, m1, …)会改为取新月份的费用。 - CloudPeek 将其中每一天绘制为一根柱,从你所在时区的午夜开始计算,今天截至目前的数据位于最右侧。CloudWatch 控制台没有这样的图表,因此会将这些天绘制为一条折线。
- 如果你的账单不是以美元计价,请将各行和表达式中的每个
USD改为你的货币代码。 - 饼图使用与条形图相同的表达式,但不含总计行,因此各个扇区是前五项服务在它们合计费用中所占的份额。CloudPeek 会将该合计显示在中间。
- 如果要将其余所有费用作为其他扇区包含在饼图中,并在中间显示整个账户的费用,请将条形图的总计行复制到饼图中。之后 CloudWatch 控制台会将总计绘制为多出的一个扇区。
要查看每项服务的费用,请在 us-east-1 中打开 CloudWatch,然后选择所有指标 › Billing › 按服务。
要查看每项服务每天的支出(每天一列堆叠显示),请添加按服务每日支出预设(请参阅支出预设),或在 AI 小组件中描述它,例如“过去 7 天按服务的每日支出,堆叠显示”。每项服务的费用同样从月初开始累计,因此它们会计算出每项服务每天增加了多少,就像 DIFF(m1) 对总计所做的那样。
要在表格中列出过去 7 天的支出(每天一行,最新的在前),请添加每日支出表预设,或在 AI 小组件中描述它,例如“过去 7 天支出的表格,每天一行”。在控制面板上,这就是将上面的 DIFF(m1) 各行放在一个设置了 "view": "table" 和 "table": {"layout": "vertical"} 的小组件中。
按账户划分的支出
如果你的账户在 AWS Organizations 中,管理账户的账单指标还会通过 LinkedAccount 维度按账户细分费用。要在图表中显示本月支出最高的五个账户(而不是支出最高的服务),请在条形图或饼图中使用以下表达式行来代替服务的表达式行:
[ { "expression": "SORT(SEARCH('{AWS/Billing,Currency,LinkedAccount} MetricName=\"EstimatedCharges\" Currency=\"USD\"', 'Maximum', 21600), MAX, DESC, 5)", "id": "accounts" } ]
或者在 AI 小组件中描述你想要的内容,例如“本月按账户划分的支出”,或者针对单项服务:“过去 7 天每个账户 SQS 支出的堆叠条形图”。按账户每日支出预设已经会将每个账户的支出堆叠在每天一列中:请参阅支出预设。
CloudWatch 只通过 12 位 ID 识别每个账户。CloudPeek 会改为显示账户的名称,名称取自以下来源中第一个能提供名称的来源:
- AWS Organizations,它会提供组织中每个账户的名称。这需要
organizations:ListAccounts(包含在 CloudPeek 的策略中),并且它只响应管理账户(或委托管理员账户)。CloudPeek 每天查询一次。 - IAM Identity Center(如果你使用它登录):它允许你登录的账户的名称。
- 你的“账户”标签页:你为已添加的账户设置的名称。
如果以上来源都无法提供名称,账户会继续显示其 ID。如果 AWS Organizations 拒绝请求,CloudPeek 会在六小时后再次查询,或在你刷新小组件时立即查询。
将其移除
在 us-east-1 的 CloudWatch 控制台中,打开控制面板,选择 CloudPeek-Spend,然后选择删除。如果还要移除 CloudPeek 的访问权限,请在 IAM 控制台中删除 cloudpeek 用户和 CloudPeek 策略。
aws cloudwatch delete-dashboards --region us-east-1 --dashboard-names CloudPeek-Spend
CloudFormation 无法删除仍有访问密钥的用户,也无法删除仍被堆栈之外的资源使用的策略。请先删除该用户的访问密钥,并从所有权限集中分离该策略,然后删除堆栈:
aws iam list-access-keys --user-name cloudpeek
aws iam delete-access-key --user-name cloudpeek --access-key-id <access-key-id>
aws cloudformation delete-stack --region us-east-1 --stack-name CloudPeek
IAM 不会删除仍有访问密钥的用户,也不会删除仍附加在其他地方的策略。请先删除该用户的访问密钥,并从所有权限集中分离该策略,然后销毁资源:
aws iam list-access-keys --user-name cloudpeek
aws iam delete-access-key --user-name cloudpeek --access-key-id <access-key-id>
terraform destroy
故障排除
小组件为空,或控制面板显示“没有可用数据”
账单指标尚未到达 CloudWatch,CloudPeek 的小组件会显示“请在账单控制台中开启 CloudWatch 账单警报。支出会在一天内显示。”请检查是否已开启账单指标(第 1 步),并等待几个小时。然后在 us-east-1 的所有指标下查找 Billing 命名空间(Metrics Explorer 不会列出账单指标)。在 AWS Organizations 中,请在能看到整个组织费用的管理账户中进行设置:在组织的其他账户中,小组件会显示“此账户的支出位于你所在组织的管理账户中。”
账户显示为数字
CloudPeek 找不到这些账户的名称。在管理账户中,为 CloudPeek 的登录身份添加 organizations:ListAccounts,或部署入门中更新后的模板,然后刷新小组件。请参阅按账户划分的支出。
缺少某项服务
它不在你本月支出最高的五项服务之中。要在图表中显示更多服务,请增大 SORT 表达式末尾的数字(了解其工作原理)。它的费用已经包含在总计中。
总计大于各条形之和
这是正常的。总计是你本月至今的全部账单,包括前五项之外的服务。
其他问题
请参阅故障排除,或发送电子邮件至 support@cloudpeek.app。切勿向我们发送你的秘密访问密钥。