求助:CloudFormation配置SQS触发AWS Lambda函数失效问题
排查SQS触发Lambda未执行问题
你配置的CloudFormation模板中,SQS队列能正常接收消息但Lambda未触发,可按以下步骤排查:
1. 检查Lambda IAM角色权限
Lambda需要具备访问SQS队列的核心权限,确保LambdaIAMRole包含以下权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sqs:ReceiveMessage", "sqs:DeleteMessage", "sqs:GetQueueAttributes" ], "Resource": "arn:aws:sqs:<区域>:<账号ID>:<你的队列名>" } ] }
如果SQS队列启用了KMS服务器端加密,还需额外添加kms:Decrypt、kms:GenerateDataKey权限。
2. 验证VPC内Lambda的网络连通性
你的Lambda配置了VpcConfig,运行在VPC子网内,需确保网络可达:
- 若使用私有子网:Lambda需通过NAT网关访问SQS公网端点,或创建SQS的VPC接口端点。无此配置的话,Lambda无法连接SQS。
- 安全组规则:确认
TestSecurityGroupId允许出站HTTPS(443端口)流量到SQS服务或对应的VPC端点。
3. 确认事件源映射是否存在
通过SAM模板配置的SQS触发器会自动创建Lambda事件源映射,可通过以下方式验证:
- 登录Lambda控制台,查看目标函数的「触发器」标签,确认SQS队列已作为触发器存在。
- 使用AWS CLI命令检查:
aws lambda list-event-source-mappings --function-name <你的Lambda函数名>
若映射不存在,重新部署CloudFormation栈并检查部署日志是否有错误。
4. 检查参数匹配与队列状态
- 确认SQS的
VisibilityTimeout(900秒)大于Lambda的Timeout(120秒):你的配置已满足该要求,无需调整。 - 在SQS控制台查看「可用消息数」,确认消息处于可被读取的状态,未被其他进程占用。
附你的CloudFormation模板:
TestFunction: Type: AWS::Serverless::Function Properties: CodeUri: abc/xxx/ Handler: com.test.TestHandler::handleRequest Runtime: java11 MemorySize: 512 Timeout: 120 FunctionName: !Join [ "-", [ !Ref TestPrefix, "TestFunction" ] ] Role: !Ref LambdaIAMRole VpcConfig: SecurityGroupIds: - !Ref TestSecurityGroupId SubnetIds: !Ref TestSubnetIds Events: MySQSEvent: Type: SQS Properties: Queue: !GetAtt TestQueue.Arn BatchSize: 1 TestQueue: Type: AWS::SQS::Queue Properties: QueueName: !Ref TestQueueName Enabled: true MessageRetentionPeriod: 300 VisibilityTimeout: 900
内容的提问来源于stack exchange,提问作者user2324686
相关产品推荐
相关产品推荐

