Amplify Gen2:如何通过Lambda向DynamoDB Todo表写入数据
解决Lambda向Amplify Data定义的Todo表写入数据的问题
问题核心
你在尝试用Lambda往Amplify Data定义的Todo表写入数据时,遇到两个关键问题:
- 无法获取
DATA_TODO_TABLE_NAME和AWS_REGION环境变量,TypeScript提示该属性不存在于LambdaProvidedEnvVars & AmplifyBackendEnvVars类型中 - 不清楚如何正确配置Lambda对DynamoDB表的访问权限
解决方案步骤
1. 配置Lambda对Todo表的访问权限
首先需要在Lambda的资源定义文件(amplify/functions/generate-story/resource.ts)中明确授予Lambda访问Todo表的权限,Amplify会自动注入对应的环境变量。如果还没有这个文件,创建它并添加以下内容:
import { defineFunction } from "@aws-amplify/backend"; import { data } from "../../data/resource"; export const generateStory = defineFunction({ // 授予Lambda对Todo表的读写权限 access: (allow) => [ allow.resource(data.models.Todo).to(["create", "read", "update", "delete"]) ], runtime: "nodejs20.x" });
2. 修正handler.ts中的环境变量使用
配置权限后,Amplify会自动注入DATA_TODO_TABLE_NAME和AWS_REGION环境变量,通过类型断言修正TypeScript报错:
import { DynamoDBClient, PutItemCommand } from "@aws-sdk/client-dynamodb"; import { env } from "$amplify/env/generate-story"; // 类型断言确保环境变量被正确识别 const { DATA_TODO_TABLE_NAME, AWS_REGION } = env as typeof env & { DATA_TODO_TABLE_NAME: string; AWS_REGION: string; }; const ddbClient = new DynamoDBClient({ region: AWS_REGION }); export const handler = async (event) => { const command = new PutItemCommand({ TableName: DATA_TODO_TABLE_NAME, Item: { id: { S: 'example-id' }, content: { S: 'example-content' }, createdAt: { S: new Date().toISOString() }, updatedAt: { S: new Date().toISOString() } }, }); try { await ddbClient.send(command); return { statusCode: 200, body: JSON.stringify({ message: "Item inserted successfully" }), }; } catch (error) { console.error("Error inserting item:", error); return { statusCode: 500, body: JSON.stringify({ message: "Error inserting item" }), }; } };
3. 更简便的替代方案:使用Amplify Data Client
直接调用DynamoDB需要手动处理字段格式,改用Amplify Data Client可简化操作:
import { generateClient } from "aws-amplify/data"; import { Schema } from "../../data/resource"; import { env } from "$amplify/env/generate-story"; import { Amplify } from "aws-amplify"; // 初始化Amplify配置 Amplify.configure({ API: { GraphQL: { endpoint: env.DATA_API_ENDPOINT, region: env.AWS_REGION, defaultAuthMode: "iam" } } }); const client = generateClient<Schema>(); export const handler = async (event) => { try { await client.models.Todo.create({ content: "example-content", id: "example-id" // 不指定则自动生成UUID }); return { statusCode: 200, body: JSON.stringify({ message: "Item inserted successfully" }), }; } catch (error) { console.error("Error inserting item:", error); return { statusCode: 500, body: JSON.stringify({ message: "Error inserting item" }), }; } };
验证步骤
完成配置后运行部署命令:
amplify push
部署完成后触发Lambda函数,即可验证数据是否成功写入Todo表。
内容的提问来源于stack exchange,提问作者Juan Guillermo
相关产品推荐
相关产品推荐

