创建Terraform aws_cloudwatch_log_subscription_filter失败求助
问题:CloudWatch日志订阅过滤器创建报错(Lambda作为目标时提示需要roleArn)
我尝试用以下Terraform代码创建aws_cloudwatch_log_subscription_filter,将Lambda作为日志消费目标:
resource "aws_cloudwatch_log_group" "log-group" { name = "/aws/lambda/${aws_lambda_function.default-lambda.function_name}" retention_in_days = 30 kms_key_id = "..." } resource "aws_lambda_permission" "invoke-lambda-cloudwatch" { count = var.log_consumer != null ? 1 : 0 action = "lambda:InvokeFunction" function_name = var.log_consumer.name principal = "logs.amazonaws.com" source_arn = "${aws_cloudwatch_log_group.log-group.arn}:*" } resource "aws_cloudwatch_log_subscription_filter" "lambda_subscription" { count = var.log_consumer != null ? 1 : 0 name = "subscription-filter-${var.lambda_function_name}" log_group_name = aws_cloudwatch_log_group.log-group.name filter_pattern = var.log_consumer.pattern destination_arn = var.log_consumer.arn depends_on = [module.iam_role, aws_lambda_permission.invoke-lambda-cloudwatch] } locals { ... log_consumer = { pattern = "?AUDIT ?BREADCRUMB", name = module.lambda-log-consumer.default-lambda-name, arn = module.lambda-log-consumer.default-lambda-arn } }
但一直收到如下错误:
Error: Error creating Cloudwatch log subscription filter: InvalidParameterException: destinationArn for vendor apigateway cannot be used without roleArn
根据Terraform文档,将Lambda作为目标时不需要指定role_arn,只需要配置aws_lambda_permission即可,请问我哪里漏了?
解决方案
核心问题
错误提示里明确提到vendor apigateway,说明AWS把你传入的destination_arn识别成了API Gateway的ARN,而非Lambda的ARN,这是问题的根源。
具体排查&修复步骤
- 校验ARN格式:Lambda的ARN格式为
arn:aws:lambda:<区域>:<账号ID>:function:<函数名>,API Gateway的ARN格式是arn:aws:apigateway:<区域>::/restapis/...,检查module.lambda-log-consumer.default-lambda-arn输出的内容是否符合Lambda ARN的格式。 - 检查模块输出正确性:确认
lambda-log-consumer模块的default-lambda-arn输出项确实指向Lambda函数的ARN,而非该Lambda关联的API Gateway、触发器或其他资源的ARN。 - 修正Lambda权限的source_arn:当前
aws_lambda_permission里的source_arn多了:*后缀,CloudWatch日志订阅的权限仅需日志组的ARN即可,修改为:source_arn = aws_cloudwatch_log_group.log-group.arn
内容的提问来源于stack exchange,提问作者Viny Machado
相关产品推荐
相关产品推荐

