如何结合AWS SAM使用Dynamoose?已通过SAM创建DynamoDB表
用Dynamoose操作已通过AWS SAM创建的DynamoDB表
一、定义匹配现有表的Dynamoose Schema
因为表已经通过AWS SAM模板创建完成,你只需要定义与现有表结构完全对齐的Schema,并禁止Dynamoose自动创建/修改表即可:
const dynamoose = require("dynamoose"); // 初始化Dynamoose(Lambda环境下无需额外配置区域,本地开发需指定) // dynamoose.aws.sdk.config.update({ region: "us-east-1" }); // 定义Schema,严格匹配SAM模板中的属性、主键配置 const EmployeeSchema = new dynamoose.Schema({ EmployeeId: { type: String, hashKey: true, // 对应SAM中的HASH主键 required: true }, LocationId: { type: String, required: true }, DepartmentId: { type: String, required: true } }, { create: false, // 核心配置:禁止Dynamoose管理表结构 tableName: "Employee" // 指定已存在的表名 }); // 关联已存在的全局二级索引(GSI) EmployeeSchema.index({ name: "Location-index", // 必须与SAM模板中的索引名完全一致 hashKey: "LocationId", projection: "all" // 对应SAM中的ProjectionType: ALL }); // 创建Model const Employee = dynamoose.model("Employee", EmployeeSchema);
二、使用全局二级索引(GSI)查询
定义好Schema后,直接通过using()方法指定索引名,即可基于GSI执行查询:
// 查询指定地点下的所有员工 async function fetchEmployeesByLocation(locationId) { const result = await Employee.query("LocationId") .eq(locationId) .using("Location-index") // 指定要使用的GSI名称 .exec(); return result; } // 调用示例 fetchEmployeesByLocation("LA-001").then(data => console.log(data));
关键注意事项
- 所有属性名、类型、索引名称必须与AWS SAM模板中的定义完全一致(大小写敏感)
- 禁止通过Dynamoose修改表结构,所有表结构变更需通过AWS SAM模板部署更新
- 确保执行代码的IAM角色拥有DynamoDB的读写权限,包括对该GSI的访问权限
内容的提问来源于stack exchange,提问作者Maor agai
相关产品推荐
相关产品推荐

