Lambda通过Data API访问无服务器数据库集群时触发BadRequestException
首先明确:Lambda与无服务器RDS集群不需要在同一VPC。RDS Data API是通过AWS管理平面的API调用,而非直接连接数据库端口,因此无需额外VPC网络配置(除非你的Secrets Manager或RDS集群配置了VPC端点,但本地CLI能成功的话,大概率不是这个问题)。
针对你遇到的BadRequestException,按以下方向排查:
1. 核对API动作与权限匹配
你本地CLI使用的是aws rds-data execute-statement命令,对应IAM权限动作是rds-data:ExecuteStatement;但Lambda代码中使用的是ExecuteSqlCommand,对应权限动作是rds-data:ExecuteSql。即使测试用户和Lambda角色权限“相同”,也要确认Lambda角色是否明确包含rds-data:ExecuteSql权限——如果只给了rds-data:ExecuteStatement,就会因为权限不匹配触发错误(部分场景下会表现为BadRequest而非直接AccessDenied)。
2. 检查ARN参数的有效性
你的CLI命令中,Secret ARN存在一个明显的空格:arn:aws:secretsmanager:eu-central-1: xxxxxxxxxxx:secret:...(账号ID前有空格)。如果Lambda代码中的awsSecretStoreArn也包含这个空格,会导致ARN格式无效,直接触发BadRequest。务必确保所有ARN参数无多余空格、格式完全正确。
3. 核对SDK参数与API要求
AWS SDK v3中,ExecuteSqlCommand的参数结构与ExecuteStatementCommand有差异:
ExecuteSqlCommand使用sqlStatements参数(支持多条SQL用分号分隔)ExecuteStatementCommand使用sql参数(单条SQL)
确认你使用的命令与参数匹配,同时检查其他参数名是否符合SDK要求(例如部分版本中dbClusterOrInstanceArn是否应为dbClusterArn)。
4. 查看CloudWatch日志获取详细错误信息
你提供的错误仅包含基础结构,Lambda的CloudWatch日志中通常会记录BadRequestException的具体message(例如“无效的ARN”“无法获取凭证”等)。前往CloudWatch控制台查看该Lambda的执行日志,获取更精准的错误原因。
5. 验证Secrets Manager访问权限
RDS Data API需要从Secrets Manager中读取数据库凭证,因此Lambda角色除了rds-data权限外,必须具备secretsmanager:GetSecretValue权限(针对目标Secret ARN)。即使测试用户有这个权限,也要确认Lambda角色的权限策略中是否包含该动作。
6. 确认无服务器集群状态
如果你的RDS无服务器集群处于暂停状态,调用Data API会触发BadRequest。前往RDS控制台检查集群状态是否为“可用”。
内容的提问来源于stack exchange,提问作者Max Luchterhand

