You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
  }
}

验证方案

部署更新后:

  1. 前往IAM控制台,确认你的Lambda执行角色dev-rohit-ap-southeast-1-lambdaRole的权限策略中已经包含cloudwatch:GetMetricData允许权限
  2. 直接调用Lambda函数测试,确认不再抛出AccessDenied错误,且能正常返回指标数据

内容的提问来源于stack exchange,提问作者Rohit Mittal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:24:01