能否用GetCostAndUsageWithResources查单个Lambda成本?若不能该如何操作?
单个Lambda函数成本查询问题
我想要查询单个Lambda函数的成本,但GetCostAndUsageWithResources的官方文档未明确说明筛选RESOURCE_ID维度时可使用哪些服务的ARN或ID。我使用boto3的get_cost_and_usage_with_resources接口编写了如下代码,却返回成本为0的结果:
import boto3 ce_client = boto3.client("ce") response = ce_client.get_cost_and_usage_with_resources( TimePeriod={"Start": <some-start-date>, "End": <some-end-date>}, Granularity="DAILY", Filter={ "Dimensions": { "Key": "RESOURCE_ID", "Values": [<my-lambda-arn>] } }, Metrics=["UnblendedCost"], ) print(response)
现咨询两个问题:
- 是否可以使用
GetCostAndUsageWithResources查询单个Lambda函数的成本? - 若无法实现,如何通过函数名称或ARN查询单个Lambda函数的成本?
问题解答
1. 是否可以用GetCostAndUsageWithResources查询单个Lambda成本?
可以,但你当前代码返回0的核心问题是Lambda的RESOURCE_ID维度值不是完整ARN,而是特定格式的标识符:
- 无版本/别名的Lambda函数:
function:<你的函数名称> - 带版本/别名的Lambda函数:
function:<你的函数名称>:<版本号/别名>
用完整ARN作为筛选值会匹配不到任何资源,所以返回成本为0。另外注意Cost Explorer的数据存在24-48小时的延迟,若查询的是最近一天的费用,也可能因为数据未同步导致返回0。
2. 正确查询单个Lambda函数成本的方法
方法一:修正GetCostAndUsageWithResources的筛选条件
把RESOURCE_ID的取值换成Lambda的资源标识符格式,示例代码如下:
import boto3 ce_client = boto3.client("ce") # 替换成你的Lambda函数标识符,比如function:my-test-lambda lambda_resource_id = "function:<你的Lambda函数名>" response = ce_client.get_cost_and_usage_with_resources( TimePeriod={"Start": "2024-01-01", "End": "2024-01-02"}, Granularity="DAILY", Filter={ "Dimensions": { "Key": "RESOURCE_ID", "Values": [lambda_resource_id] } }, Metrics=["UnblendedCost"], ) print(response)
方法二:使用GetCostAndUsage接口配合多维度筛选
如果需要更灵活的筛选(比如按函数名模糊匹配、按标签筛选),可以用GetCostAndUsage接口,结合SERVICE和RESOURCE_ID维度做组合筛选:
import boto3 ce_client = boto3.client("ce") response = ce_client.get_cost_and_usage( TimePeriod={"Start": "2024-01-01", "End": "2024-01-02"}, Granularity="DAILY", Filter={ "And": [ { "Dimensions": { "Key": "SERVICE", "Values": ["AWS Lambda"] } }, { "Dimensions": { "Key": "RESOURCE_ID", "Values": ["function:<你的Lambda函数名>"] } } ] }, Metrics=["UnblendedCost"], GroupBy=[ {"Type": "DIMENSION", "Key": "RESOURCE_ID"} ] ) print(response)
额外方案:通过标签筛选
如果你的Lambda函数打了自定义标签(比如FunctionName: my-test-lambda),也可以直接按标签维度筛选,避免记忆资源ID格式:
import boto3 ce_client = boto3.client("ce") response = ce_client.get_cost_and_usage( TimePeriod={"Start": "2024-01-01", "End": "2024-01-02"}, Granularity="DAILY", Filter={ "Tags": { "Key": "FunctionName", "Values": ["<你的Lambda函数名>"] } }, Metrics=["UnblendedCost"], ) print(response)
内容的提问来源于stack exchange,提问作者Simon Dahal
相关产品推荐
相关产品推荐

