Node.js 应用调用 AWS CloudWatch GetMetricData 报 AccessDenied 错误如何解决
问题根因
你遇到的AccessDenied错误以及后续调整无效,核心是两个配置错误:
- IAM权限的
Resource配置不符合CloudWatch API的要求:cloudwatch:GetMetricData属于CloudWatch服务的全局操作,不支持限制到特定Lambda函数、日志组的ARN,必须指定资源为* - 代码中Lambda指标的维度配置错误,就算权限通过也无法正确查询到数据
解决步骤
1. 修正serverless.yaml权限配置
替换你原来的权限段为以下配置:
- Effect: "Allow" Action: - "cloudwatch:GetMetricData" Resource: "*"
2. 修正代码中指标的配置项
AWS/Lambda命名空间下的Invocations指标,唯一有效维度是FunctionName,你之前配置的upload维度不属于Lambda标准指标维度,同时还有两个参数配置错误:Period应为数字类型、ReturnData设为false会导致返回结果无数据。调整后的代码示例:
exports.getMetrics = async () => { const params = { EndTime: '2021-09-07T03:04:00Z', MetricDataQueries: [ { Id: 'concurrencycount', Label: 'Average concurrency', MetricStat: { Metric: { Dimensions: [ { Name: 'FunctionName', // 直接用运行时环境变量获取当前函数名,无需手动拼接 Value: process.env.AWS_LAMBDA_FUNCTION_NAME }, ], MetricName: 'Invocations', Namespace: 'AWS/Lambda' }, Period: 300, Stat: 'Average', Unit: 'Count' }, ReturnData: true }, ], StartTime: '2021-09-07T03:01:00Z', }; try { return await client().getMetricData(params).promise() } catch (error) { logger.error(error, 'Error getting metrics from Lambda Cloudwatch') throw error } }
验证方案
部署更新后:
- 前往IAM控制台,确认你的Lambda执行角色
dev-rohit-ap-southeast-1-lambdaRole的权限策略中已经包含cloudwatch:GetMetricData允许权限 - 直接调用Lambda函数测试,确认不再抛出AccessDenied错误,且能正常返回指标数据
内容的提问来源于stack exchange,提问作者Rohit Mittal
相关产品推荐
相关产品推荐

