AWS Amplify Datastore本地保存成功但未同步至DynamoDB故障排查
问题原因确认
你日志中输出的两个警告就是导致数据仅存本地、不同步到DynamoDB的直接原因,具体问题如下:
- 第一个警告
Realtime disabled when in a server-side environment是因为DataStore默认是为客户端离线场景设计的,在服务端/无服务(比如Lambda)环境下会默认禁用实时同步,且不会自动触发后台异步同步逻辑。你代码中调用DataStore.save后直接返回执行结果,此时本地存储虽然完成写入,但同步到云端的逻辑还未启动,函数执行进程就被回收,自然不会写入DynamoDB。 - 第二个警告
User is unauthorized to query syncPosts with auth mode AWS_IAM是因为当前执行代码的角色(比如Lambda的执行角色)没有对应AppSync接口的调用权限,就算触发同步流程也会因为权限校验失败终止,无法完成云端写入。
修复步骤
- 补充缺失的导入,你的代码中使用了
DataStore但未导入,首先修改导入语句:
const { DataStore, syncExpression } = require("aws-amplify")
- 服务端环境手动触发同步流程,不要在save后直接返回,修改handler逻辑,先启动DataStore,save完成后等待同步结束再返回,同时可适当增加函数的超时时间避免同步未完成就被终止:
exports.handler = async (event) => { try { console.log("inside") // 手动启动DataStore同步进程 await DataStore.start() let response=await DataStore.save( new Post.Post({ title: "My second Post", status:"DRAFT", rating: 7 }) ); // 等待同步完成 await DataStore.sync() console.log("Post saved and synced successfully!"); return response; } catch (error) { console.log("Error saving post", error); } };
- 修复IAM权限问题,有两个可选方案:
- 调整数据模型的鉴权规则,给IAM角色开放Post模型的操作权限,修改你的schema.graphql中Post的配置,修改后执行
amplify push更新云端配置:
type Post @model @auth(rules: [ # 新增IAM权限规则,按需开放需要的操作权限 { allow: public, provider: iam, operations: [create, read, update, delete] } ]) { id: ID! title: String! status: String! rating: Int! }- 给当前执行代码的角色(比如Lambda执行角色)手动添加AppSync对应的操作权限策略。
- 调整数据模型的鉴权规则,给IAM角色开放Post模型的操作权限,修改你的schema.graphql中Post的配置,修改后执行
- 可选优化:如果你当前的场景不需要离线存储能力,仅需要服务端写入数据到DynamoDB,建议直接调用Amplify API模块操作AppSync接口,或者直接调用DynamoDB SDK写入数据,避免DataStore同步带来的额外开销。
内容的提问来源于stack exchange,提问作者Muhammad Ahmed
相关产品推荐
相关产品推荐

