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

Terraform部署后无法捕获Lambda函数的CloudWatch日志

Lambda执行console.log无CloudWatch日志流问题排查与修复

问题现象

已通过Terraform成功部署Lambda函数与对应CloudWatch日志组,日志组存在但无日志流生成,Lambda代码中包含console.log语句。

排查步骤

  • 确认Lambda是否被触发:查看Lambda控制台「监控」指标,检查Invocation count是否有数值;同时验证触发器(如API Gateway、S3事件等)是否配置正确并正常发送请求。
  • 验证IAM权限有效性:
    1. 进入IAM控制台,找到Lambda对应的执行角色IAM-for-lambda-store-url
    2. 确认已附加Store-url-logging-policy策略,且策略中包含logs:CreateLogStream、logs:PutLogEvents权限
    3. 注意:IAM权限可能存在数分钟生效延迟,部署后需等待一段时间再测试
  • 检查Lambda日志配置:在Lambda控制台「配置」->「监控和操作工具」中,确认日志目的地为目标CloudWatch日志组,无异常配置。

配置优化与修复方案

针对你的Terraform配置,可做以下调整避免潜在问题:

1. 修正日志组名称依赖

将日志组名称直接写死为固定值,避免Lambda资源插值的潜在顺序问题:

resource "aws_cloudwatch_log_group" "store_url_cloudwatch_log_group" {
  name              = "/aws/lambda/store-url-lambda" # 直接使用Lambda固定名称
  retention_in_days = 14

  lifecycle {
    prevent_destroy = false
  }

  tags = merge(
    var.common_tags,
    {
      Name  = "${var.project}-Store-URL-CloudWatch-Log-Group"
      Stack = "Backend"
    }
  )
}

2. 限定IAM策略资源范围(更安全且避免权限歧义)

添加账号ID数据源,并将日志权限限定到目标日志组:

# 新增账号ID数据源
data "aws_caller_identity" "current" {}

resource "aws_iam_policy" "store_url_logging_policy" {
  name = "Store-url-logging-policy"

  policy = jsonencode({
    "Version" : "2012-10-17",
    "Statement" : [
      {
        "Effect" : "Allow",
        "Action" : [
          "logs:CreateLogGroup",
          "logs:CreateLogStream",
          "logs:PutLogEvents"
        ],
        "Resource" : [
          # 限定到具体日志组的ARN,替换为你的地域变量
          "arn:aws:logs:${var.region}:${data.aws_caller_identity.current.account_id}:log-group:/aws/lambda/store-url-lambda:*"
        ]
      }
    ]
  })

  tags = merge(
    var.common_tags,
    {
      Name  = "${var.project}-Store-URL-Logging-Policy"
      Stack = "Backend"
    }
  )
}

3. 确保Lambda等待权限配置完成

修改Lambda资源的depends_on,包含IAM策略附件,避免Lambda创建时权限未生效:

resource "aws_lambda_function" "store_url_lambda" {
  function_name    = "store-url-lambda"
  role             = aws_iam_role.iam_for_lambda_store_url.arn
  handler          = "index.handler"
  runtime          = "nodejs20.x"
  source_code_hash = data.archive_file.lambda_store_url_zip.output_base64sha256
  s3_bucket        = module.s3_store_url_lambda_bucket.s3_bucket_id
  s3_key           = aws_s3_object.store_url_lambda_s3_object.key
  # 新增IAM策略附件依赖
  depends_on       = [aws_cloudwatch_log_group.store_url_cloudwatch_log_group, aws_iam_role_policy_attachment.store_url_logging_policy_attachment]

  environment {
    variables = {
      S3_BUCKET = module.s3_store_url_lambda_bucket.s3_bucket_id
    }
  }

  tags = merge(
    var.common_tags,
    {
      Name  = "${var.project}-Store-URL-Lambda-Function"
      Stack = "Backend"
    }
  )
}

4. 手动触发测试

完成配置更新并重新部署后,在Lambda控制台使用测试事件手动触发函数,立即查看CloudWatch日志组是否生成日志流。若手动触发有日志,则排查触发器配置;若仍无日志,检查CloudWatch服务是否有区域级别的故障。


内容的提问来源于stack exchange,提问作者Tal Rofe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:40:59