Lambda函数无法向SQS目标发送消息,求技术排查建议
结合你提供的Terraform配置,先指出几个直接的配置错误,再给你分步排查方向:
一、配置里的明显错误
SQS队列策略资源ARN不匹配
你的SQS队列名称是SQSqueue,但队列策略里的Resource写的是arn:aws:sqs:us-east-1:694418723508:test_lambda,完全和实际队列不符,必须改成队列的正确ARN:arn:aws:sqs:us-east-1:694418723508:SQSqueue。另外当前策略给了*全权限,生产环境建议收紧,先确保功能正常再说。Lambda权限的函数名引用不规范
aws_lambda_permission.allow_bucket里的function_name直接写死字符串test_lambda,建议改成引用资源属性aws_lambda_function.test_lambda.function_name,避免手动输入出错。IAM角色策略附件参数错误
aws_iam_role_policy_attachment.test-attach中的policy_arn用了aws_iam_policy.policy.id,规范写法应该用aws_iam_policy.policy.arn,虽然部分场景id和arn可能一致,但按官方要求来更稳妥。
二、分步排查流程
先确认Lambda有没有被触发
去CloudWatch日志里找Lambda的执行日志,要是连日志都没有,说明S3的通知根本没触发Lambda:- 登录AWS控制台,去S3桶的「属性」-「事件通知」里确认规则存在,且你上传的文件符合
AWSLogs/前缀和.log后缀的过滤条件。 - 检查
aws_lambda_permission.allow_bucket是否生效,确保S3有权限调用Lambda。
- 登录AWS控制台,去S3桶的「属性」-「事件通知」里确认规则存在,且你上传的文件符合
确认Lambda执行是否成功
如果有Lambda日志,仔细看日志里有没有报错:- 核对Lambda的IAM角色权限,确保
sqs:SendMessage的资源ARN和目标SQS队列完全一致。 - 检查Lambda代码逻辑,有没有未捕获的异常导致执行失败(失败的话,异步调用的成功目标不会收到消息),或者代码里是否正确走了成功分支。
- 核对Lambda的IAM角色权限,确保
确认SQS能不能接收消息
就算Lambda有权限发消息,也要确保SQS允许接收:- 修正队列策略的资源ARN后,在控制台手动给SQS发一条测试消息,确认队列本身没问题。
- 检查SQS的访问策略是否允许Lambda所在账号发送消息。
检查Lambda异步调用配置
去Lambda控制台的「配置」-「异步调用」里,确认成功目标确实设置成了你的SQS队列,确保aws_lambda_function_event_invoke_config.example配置生效。
修正后的关键配置片段
修正后的SQS队列策略
resource "aws_sqs_queue_policy" "test" { queue_url = aws_sqs_queue.sqs_trigger.id policy = <<POLICY { "Version": "2012-10-17", "Id": "sqspolicy", "Statement": [ { "Sid": "First", "Effect": "Allow", "Principal": "*", "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:us-east-1:694418723508:SQSqueue" } ] } POLICY }
修正后的Lambda权限
resource "aws_lambda_permission" "allow_bucket" { statement_id = "AllowS3Bucket" action = "lambda:InvokeFunction" function_name = aws_lambda_function.test_lambda.function_name principal = "s3.amazonaws.com" source_arn = aws_s3_bucket.bucket.arn }
修正后的IAM角色策略附件
resource "aws_iam_role_policy_attachment" "test-attach" { role = aws_iam_role.role.id policy_arn = aws_iam_policy.policy.arn }
内容的提问来源于stack exchange,提问作者Dany Munoz

