Terraform部署后无法捕获Lambda函数的CloudWatch日志
Lambda执行console.log无CloudWatch日志流问题排查与修复
问题现象
已通过Terraform成功部署Lambda函数与对应CloudWatch日志组,日志组存在但无日志流生成,Lambda代码中包含console.log语句。
排查步骤
- 确认Lambda是否被触发:查看Lambda控制台「监控」指标,检查
Invocation count是否有数值;同时验证触发器(如API Gateway、S3事件等)是否配置正确并正常发送请求。 - 验证IAM权限有效性:
- 进入IAM控制台,找到Lambda对应的执行角色
IAM-for-lambda-store-url - 确认已附加
Store-url-logging-policy策略,且策略中包含logs:CreateLogStream、logs:PutLogEvents权限 - 注意:IAM权限可能存在数分钟生效延迟,部署后需等待一段时间再测试
- 进入IAM控制台,找到Lambda对应的执行角色
- 检查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
相关产品推荐
相关产品推荐

