Terraform创建CloudWatch日志订阅过滤器报InvalidParameterException错误
问题原因
- Lambda调用权限的服务主体配置错误
你当前aws_lambda_permission资源中配置的principal为events.amazonaws.com,该主体对应Amazon EventBridge服务,而触发Lambda的是CloudWatch Logs服务,正确的服务主体格式为logs.<你的AWS区域>.amazonaws.com,二者不匹配导致权限无效。 - 权限关联的日志组与实际使用的日志组不匹配
你在权限配置中绑定的source_arn是你代码中创建的test-app日志组的ARN,但实际日志订阅过滤器关联的日志组是/rr/snowplow/e2-dev,权限没有覆盖到实际使用的日志组,因此CloudWatch Logs没有调用Lambda的权限。 - 手动在控制台创建订阅时,AWS会自动在后台生成匹配的Lambda调用权限,因此手动操作可以正常运行,而Terraform为声明式配置,需要你显式定义正确的权限规则。
解决步骤
- 第一步:如果你的目标日志组
/rr/snowplow/e2-dev是预先存在的,新增数据源读取该日志组的配置;如果是你需要在当前Terraform代码中创建的,修改日志组的name参数为/rr/snowplow/e2-dev即可。
示例数据源配置:
data "aws_cloudwatch_log_group" "target_log_group" { name = "/rr/snowplow/e2-dev" } # 可选:获取当前账号ID用于进一步限制权限范围 data "aws_caller_identity" "current" {}
- 第二步:修改
aws_lambda_permission资源的配置,替换为正确的服务主体和日志组ARN:
resource "aws_lambda_permission" "allow_cloudwatch" { action = "lambda:InvokeFunction" function_name = module.lambda_function_existing_package_s3.lambda_function_name # 替换为你资源部署的实际AWS区域,例如us-east-1、cn-northwest-1 principal = "logs.us-east-1.amazonaws.com" source_arn = data.aws_cloudwatch_log_group.target_log_group.arn # 可选配置,限制仅当前账号的日志组可调用该Lambda,提升安全性 source_account = data.aws_caller_identity.current.account_id }
- 第三步:确认
aws_cloudwatch_log_subscription_filter的depends_on参数指向修改后的aws_lambda_permission资源即可。
修改完成后重新执行terraform apply即可正常创建订阅过滤器。
内容的提问来源于stack exchange,提问作者Tejas Behra
相关产品推荐
相关产品推荐

