Lambda查询DynamoDB时触发CreateTable权限错误求助
排查Lambda调用Dynamoose查询时触发dynamodb:CreateTable权限错误的问题
我帮你分析下这个问题的根源——其实和你写的查询代码无关,问题出在Dynamoose的默认行为上:
Dynamoose在初始化模型的时候,默认会开启createTable选项(默认值为true)。也就是说,当你的代码第一次运行,Dynamoose检测到example_user表在DynamoDB中不存在时,它会自动尝试创建这个表——这就触发了dynamodb:CreateTable的权限检查,而你的IAM角色刚好没有配置这个权限,所以抛出了AccessDeniedException。
下面是具体的排查和解决步骤:
1. 先确认目标表是否存在
登录AWS控制台,进入DynamoDB服务,切换到ap-southeast-1区域,检查是否有example_user表:
- 如果表不存在:
- 方案一(推荐):手动在控制台创建该表,确保表结构和你定义的Schema匹配(比如主键要对应
email,因为你用User.get(email),说明email是主键); - 方案二(仅开发环境用):临时给Lambda的IAM角色添加
dynamodb:CreateTable权限,让Dynamoose自动建表,但生产环境不建议这么做。
- 方案一(推荐):手动在控制台创建该表,确保表结构和你定义的Schema匹配(比如主键要对应
- 如果表已经存在:那就是Dynamoose的自动建表逻辑仍在触发,需要修改配置关闭它。
2. 修改Dynamoose模型配置,关闭自动建表
不管表是否存在,都建议关闭这个默认行为,避免不必要的权限风险。修改你的User.js代码,在创建模型时显式设置createTable: false:
const schema = new dynamoose.Schema({ "email": String, "uid": String, "name": String, "gender": { "type": Number, "default": 0 }, "profileImageType": { "type": Number, "default": 0 }, "profileImage": String, "accountType": Number, }, { "saveUnknown": true, "timestamps": true }); // 添加createTable: false,禁用自动建表 module.exports = dynamoose.model('example_user', schema, { createTable: false });
3. 验证IAM权限配置
检查你的serverless.yml中的IAM角色配置,你已经包含了dynamodb:GetItem(User.get()本质调用的就是这个API),这部分是正确的,但要确认Resource的ARN完全匹配你的表ARN,避免因为ARN写错导致的权限问题。
额外建议
- 生产环境中,一定要提前手动创建好所有DynamoDB表,这样可以精准控制表的主键、索引、读写容量等配置,也能避免框架自动操作带来的权限风险;
- 开发环境中,如果需要快速测试,可以临时开启自动建表,但上线前务必关闭并移除相关权限。
内容的提问来源于stack exchange,提问作者imin
相关产品推荐
相关产品推荐

